powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Подскажите метод побыстрее
25 сообщений из 160, страница 4 из 7
Подскажите метод побыстрее
    #36639089
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMСкорее всего нужно писать как FoxPro
Код: plaintext
IsNull(a.NAME)


Автор. Меня смущает то, что вам не выдается ошибок на неверный синтаксис (в т.ч. в случае с WHERE склеенным). Может у вас там On Error Resume Next где-нить стоит????
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36639095
SashaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Можно работать через драйвер FoxPro, там есть ограничение на длину SQL. Но можно понасоздавать курсоров которые потом можно соединять, т.к. курсоры глобальны. И вообще эта задача для FoxPro.
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36639133
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
вот код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Adodc1.ConnectionString = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=C:\ostatok2\;DefaultDir = C:\ostatok2\"
Adodc1.CommandType = adCmdText
Adodc1.RecordSource = "SELECT KOD, Min(NAME), Sum(DSH), Sum(ALIEVA), Sum(SKLAD) FROM " + _
"( " + _
"SELECT KOD, NAME, KOLVO AS DSH, 0 AS ALIEVA, 0 AS SKLAD FROM alieva.dbf " + _
"Union All " + _
"SELECT KOD, NAME, 0 AS DSH, KOLVO AS ALIEVA, 0 AS SKLAD FROM dsh.dbf " + _
"Union All " + _
"SELECT KOD, NAME, 0 AS DSH, 0 AS ALIEVA, KOLVO AS SKLAD FROM sklad.dbf " + _
") AS T " + _
"GROUP BY KOD"
Set TDataLite1.DataSource = Adodc1
Set TDBGrid1.DataSource = TDataLite1
Adodc1.Refresh
TDataLite1.Refresh
а вот результат
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36639137
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admа вот результат

Надо тогда дать правильные имена полей в строке
Код: plaintext
Adodc1.RecordSource = "SELECT KOD, Min(NAME), Sum(DSH), Sum(ALIEVA), Sum(SKLAD) FROM " + _

Я не знаю, как вы там привязываетесь к столбцам сетки, но видимо типа того:
Код: plaintext
1.
Adodc1.RecordSource = "SELECT KOD, Min(NAME) AS NAME, Sum(DSH) AS DSH, Sum(ALIEVA) AS ALIEVA, Sum(SKLAD) AS SKLAD FROM " + _
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36639184
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
все получилось спасибо вам)))
а как это в файл записать?
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36639196
SashaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm,

Судя по всему FoxPro балуетесь...

File\Export...
В Type выберите FoxPro 2.x (DBF)
В То куда хотите сохранить и наберите имя файла + .dbf
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36639202
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admа как это в файл записать?

Код: plaintext
1.
2.
DELETE FROM ostatok.dbf 
INSERT INTO ostatok.dbf (перечень полей....)
SELECT ... далее мой код
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36639220
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaM,
visual basic
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36639222
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
еще раз спасибо
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36642881
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
можете разъяснить выделенные строки
Код: plaintext
SELECT KOD, Min(NAME), Sum(DSH), Sum(ALIEVA), Sum(SKLAD) FROM
Код: plaintext
1.
2.
(
SELECT KOD, NAME, KOLVO AS DSH,  0  AS ALIEVA,  0  AS SKLAD FROM alieva.dbf
UNION ALL
SELECT KOD, NAME, 0 AS DSH, KOLVO AS ALIEVA, 0 AS SKLAD FROM dsh.dbf
UNION ALL
SELECT KOD, NAME, 0 AS DSH, 0 AS ALIEVA, KOLVO AS SKLAD FROM sklad.dbf
Код: plaintext
1.
) AS T
GROUP BY KOD
group by - это видимо чтобы дубли убрать?
а как мне их упорядочить по полю NAME ?
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36642907
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь два запроса в одном (т.н. вложенные запросы).

Внутренний запрос начинается открывающейся скобкой и заканчивается ") AS T". Таким образом, с точки зрения внешнего запроса он не отличается от просто таблицы с названием Т - можно было писать для наглядности Min(T.Name), Sum(T.DSH) и т.п.

Внутренний запрос объединяет несколько запросов друг за другом с помощью UNION ALL. Запросы могут быть объединены только при условии, что у них абсолютно одинаковый набор полей, как по типу, так и по количеству и последовательности. Поэтому мы имеем "0 AS ALIEVA" и т.п., чтобы зарезервировать место для полей.
В результате мы имеем сборник всех ваших 20ти таблиц.

Внешний запрос (который, напоминаю, рассматривает внутренний как таблицу) просто выбирает поля из нее, но он объединяет строки с одинаковым кодом в одну строку (GROUP BY KOD). Таким образом у вас получится столько строк, сколько уникальных кодов у вас есть во всех таблицах.

При объединении строк, поля, которые не вошли в объединение, должы обязательно очевидно агрегироваться какой-то агрегатной функцией, потому что в результате запроса должно получиться одно значение, а не куча. В случае с количеством - это функция Sum, оно и понятно. Нулевые значения не повлияют на сумму (можно было бы с тем же успехом использовать и NULL).

Поле NAME теоретически тоже должно было попасть в GROUP. Однако, я не знаю, насколько у вас там строго, вдруг какой-то филиал поправит наименование. Тогда получится две строки с одинаковым кодом и разным наименованием. Поэтому на всякий случай, я из наименований выбираю одно, в данном случае минимальное (с точки зрения сравненя строк).

Фух....
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36642910
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admа как мне их упорядочить по полю NAME ?

У вас нет NAME.

Поэтому либо вы пишете первую строку по моему первому варианту:
SELECT... Min(NAME) AS NAME
и в самом конце запроса добавляете
ORDER BY NAME

либо, если не менять первую строку, пишете в самом конце
ORDER BY Min(NAME)

я бы посоветовал первый вариант, ибо фиг знает, как там сработает оптимизатор, чтобы быть уверенным, что Min не будет высчитываться два раза.
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36642915
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
спасибо,теперь есть ясность.ниже то что получилось
Код: plaintext
1.
2.
3.
4.
5.
6.
strsql = "INSERT INTO ostatok.dbf (KOD,NAME,DSH,ALIEVA,SKLAD,KALIN18,YARAG,GAMZATOVA,KIROVA,GAGARINA, "
strsql = strsql + "APTEKA29,LENINA104,LEKAR,MELOCH,YNIVER,REDUCTOR,PIROGOV,CB,KASPIY,NOVPOS,DOVERIE,UZBEK,KAL5KA,HAS,BUINAKSK,DERBENT) "
strsql = strsql + "SELECT KOD, Min(NAME), Sum(DSH), Sum(ALIEVA),Sum(SKLAD),Sum(KALIN18)"
strsql = strsql + ",Sum(YARAG),Sum(GAMZATOVA),Sum(KIROVA),Sum(GAGARINA),Sum(APTEKA29),Sum(LENINA104),Sum(LEKAR) "
strsql = strsql + ",Sum(MELOCH),Sum(YNIVER),Sum(REDUCTOR),Sum(PIROGOV),Sum(CB),Sum(KASPIY),Sum(NOVPOS) "
strsql = strsql + ",Sum(DOVERIE),Sum(UZBEK),Sum(KAL5KA),Sum(HAS),Sum(BUINAKSK),Sum(DERBENT) From "
strsql = strsql + "( "
а это уже идет проверка файла , если есть то добавляется строка и так сделал с остальными 24 файлами
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
If PathFileExists("C:\ostatok2\dsh.DBF") =  1  Then
strsql = strsql + "SELECT KOD, NAME, KOLVO AS DSH, 0 AS ALIEVA,0 AS SKLAD,0 AS SOVET "
strsql = strsql + ",0 AS KALIN18,0 AS YARAG,0 AS GAMZATOVA,0 AS KIROVA,0 AS GAGARINA,0 AS APTEKA29,0 AS LENINA104 "
strsql = strsql + ",0 AS LEKAR,0 AS MELOCH,0 AS YNIVER,0 AS REDUCTOR,0 AS PIROGOV,0 AS CB "
strsql = strsql + ",0 AS KASPIY,0 AS NOVPOS,0 AS DOVERIE,0 AS UZBEK,0 AS KAL5KA,0 AS HAS,0 as BUINAKSK,0 AS DERBENT "
strsql = strsql + "FROM dsh.dbf "
strsql = strsql + "Union All "
End If
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36642945
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а теперь по-хорошему завести в базе таблицу со списком файлов и эти запросы не ручками формировать, а в цикле. Тогда при появлении нового филиала не нужно будет править и переустанавливать программу, достаточно будет внести новый филиал в таблицу филиалов.
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36642948
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ: Особенно порадовал филиал UZBEK
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36642954
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admа как мне их упорядочить по полю NAME ?

Кстати. Раз у вас INSERT INTO, то упорядочивать этот SELECT абсолютно бессмысленно.
Упорядочивать надо выборку, которая идет в отображение.
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36642990
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proaduka05admа как мне их упорядочить по полю NAME ?

Кстати. Раз у вас INSERT INTO, то упорядочивать этот SELECT абсолютно бессмысленно.
Упорядочивать надо выборку, которая идет в отображение.
то есть в самом ADO?
автора теперь по-хорошему завести в базе таблицу со списком файлов и эти запросы не ручками формировать, а в цикле. Тогда при появлении нового филиала не нужно будет править и переустанавливать программу, достаточно будет внести новый филиал в таблицу филиалов.
не совсем понимаю как это реализовать(можно по идее и через текстовый файл это сделать),
только как совместить sql и цикл в этой таблице с именами файлов филиалов
авторЗЫ: Особенно порадовал филиал UZBEK
Узбекгородок называется район где находится наш филиал)))
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36643012
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
то то по типу этого?код не проверял
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Open "c:\nastr.txt" For Input As # 1 
Do Until EOF( 1 ) 
Line Input # 1 , strsqltxt 
strsql = strsql + "INSERT INTO ostatok.dbf ("+strsql+",) "
strsql = strsql + "SELECT KOD, Min(NAME), "+"Sum("+strsql+")," +" "
strsql = strsql + "SELECT KOD, NAME, KOLVO AS "+strsql+","
strsql = strsql + "FROM "+strsq+l".dbf "
strsql = strsql + "Union All "
Loop 
Close # 1 
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36643036
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admShocker.Pro,
то то по типу этого?код не проверял
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Open "c:\nastr.txt" For Input As # 1 
Do Until EOF( 1 ) 
Line Input # 1 , strsqltxt 
strsql = strsql + "INSERT INTO ostatok.dbf ("+strsql+",) "
strsql = strsql + "SELECT KOD, Min(NAME), "+"Sum("+strsql+")," +" "
strsql = strsql + "SELECT KOD, NAME, KOLVO AS "+strsql+","
strsql = strsql + "FROM "+strsq+l".dbf "
strsql = strsql + "Union All "
Loop 
Close # 1 

то есть вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Open "c:\nastr.txt" For Input As # 1 
Do Until EOF( 1 ) 
Line Input # 1 , strsqltxt 
strsql = strsql + "INSERT INTO ostatok.dbf ("+strsqltxt+",) "
strsql = strsql + "SELECT KOD, Min(NAME), "+"Sum("+strsqltxt+")," +" "
strsql = strsql + "SELECT KOD, NAME, KOLVO AS "+strsqltxt+","
strsql = strsql + "FROM "+strsqltxt+".dbf "
strsql = strsql + "Union All "
Loop 
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36643075
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admто есть в самом ADO?

Нет.
В том SELECT-е, который вы используете для отображения данных в сетке.

aduka05admто есть вот так

нет, я совершенно другое имел ввиду.
Есть таблица в БД (в той же, где вы собираете сводную информацию). В ней N строк, которые содержат имена файлов БД.

Устраиваете цикл от 1 до N, в котором конструируете в нескольких текстовых переменных фрагменты запроса. Отдельно строку SELECT-а внешнего запроса, отдельно набор склеенных внутренних и т.п. После цикла объединяете эти переменные в одну, с добавлением той информации, которая не изменялась и выполняете запрос.

Ну это по уму, а можно и оставить как есть.
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36643077
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proaduka05admа как мне их упорядочить по полю NAME ?

У вас нет NAME.

Поэтому либо вы пишете первую строку по моему первому варианту:
SELECT... Min(NAME) AS NAME
и в самом конце запроса добавляете
ORDER BY NAME

либо, если не менять первую строку, пишете в самом конце
ORDER BY Min(NAME)

я бы посоветовал первый вариант, ибо фиг знает, как там сработает оптимизатор, чтобы быть уверенным, что Min не будет высчитываться два раза.
первый вариант привел к циклической ошибке
а второй вариант создал в два раза больше записей
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36643080
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proaduka05admто есть в самом ADO?

Нет.
В том SELECT-е, который вы используете для отображения данных в сетке.

aduka05admто есть вот так

нет, я совершенно другое имел ввиду.
Есть таблица в БД (в той же, где вы собираете сводную информацию). В ней N строк, которые содержат имена файлов БД.

Устраиваете цикл от 1 до N, в котором конструируете в нескольких текстовых переменных фрагменты запроса. Отдельно строку SELECT-а внешнего запроса, отдельно набор склеенных внутренних и т.п. После цикла объединяете эти переменные в одну, с добавлением той информации, которая не изменялась и выполняете запрос.

Ну это по уму, а можно и оставить как есть.
это будет в самый раз))) буду пробовать
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36643081
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admпервый вариант привел к циклической ошибке
а второй вариант создал в два раза больше записей

Не знаю, что у вас там за ошибки, но в любом случае, как я написал выше, ORDER BY в SELECT... INTO вам не нужен.
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36643140
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proaduka05admпервый вариант привел к циклической ошибке
а второй вариант создал в два раза больше записей

Не знаю, что у вас там за ошибки, но в любом случае, как я написал выше, ORDER BY в SELECT... INTO вам не нужен.
ок ) не так принципиально это на самом деле в данном случае
...
Рейтинг: 0 / 0
Подскажите метод побыстрее
    #36643151
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы, видимо, допускаете классическую ошибку начинающего программиста БД.

Запомните. В таблице БД нет никакой последовательности хранения данных. Нельзя применять понятия "добавить в конец таблицы", "эта запись раньше, чем та" и т.п. Это не Эксель. Добавляемые записи физически кладутся куда попало, в зависимости от наличия свободного места.
Последовательность записей имеет место быть только когда вы делате ВЫБОРКУ с указанием СОРТИРОВКИ по опеределенному полю. Если сортировку не указать, записи будут выведены как попало, причем даже два раза подряд они могут быть выведены по-разному.

В конструкции INSERT INTO... SELECT сортировка не имеет ни малейшего смысла. Даже если вы отсуортируете записи перед вставкой, в таблице они будут все равно храниться как попало. И только указание сортировки при ВЫБОРКЕ данных из таблицы гарантирует вам определенную последовательность строк.

(Исключение - использование TOP и IDENTITY, но это пока мы не будем рассматривать)
...
Рейтинг: 0 / 0
25 сообщений из 160, страница 4 из 7
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Подскажите метод побыстрее
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]