|
|
|
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
|
|||
|---|---|---|---|
|
#18+
Excel 97 Проблема такая. Макрос. Запрос SQL. Данные из файла doc.dbf в массив переменных. Отбор с суммированием-группировкой. Строка с одним оператором SELECT даёт правильный результат. Но если строка запроса включает оператор UNION ALL, то происходит так: данные после этого оператора не включаются в результат. Т.е. строки в массиве заняты, но они пустые. Подробнее - в приложении. Файлы doc.dbf и doc.fpt записать в папку D:\tmp\ В файле docdbf.xls макрос docsum - его надо запустить. В ячейке А1 должны быть цифры 1, 2, 3 или 4 - это номера строк запроса Результат выполнения (по столбцам): счёт, код, сумма по vid=2, сумма по vid=1 В ячейке В1 - строка запроса выполненного макроса в виде текста Макрос со строками 1 и 2 по отдельности работают нормально. Т.е. только по vid=1, либо vid=2 Строка 3 (и аналог 4) - строки с UNION строк 1 и 2. Т.е. в разных полях суммы, где vid=1 и vid=2 Но в результате запроса данные не объединяются. Получаются пустые строки по второй сумме (строка запроса после UNION ALL). В чём ошибка? Сами строки запроса выглядят так: 1) SELECT schet_a as sch, agentcode as code, SUM(summa) as rea, 0 as zak FROM doc WHERE (vid='2') AND (type='1') GROUP BY sch, code ORDER BY code, sch 2) SELECT schet_a as sch, agentcode as code, 0 as rea, SUM(summa) as zak FROM doc WHERE (vid='1') AND (type='1') GROUP BY sch, code ORDER BY code, sch 3) SELECT schet_a as sch, agentcode as code, SUM(summa) as rea, 0 as zak FROM doc WHERE (vid='2') AND (type='1') GROUP BY sch, code UNION ALL SELECT schet_a as sch, agentcode as code, 0 as rea, SUM(summa) as zak FROM doc WHERE (vid='1') AND (type='1') GROUP BY sch, code ORDER BY code, sch 4) SELECT schet_a as sch, agentcode as code, SUM(summa) as rea, 0 as zak FROM doc WHERE (vid='1') AND (type='1') GROUP BY sch, code UNION ALL SELECT schet_a as sch, agentcode as code, 0 as rea, SUM(summa) as zak FROM doc WHERE (vid='2') AND (type='1') GROUP BY sch, code ORDER BY code, sch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 17:07:54 |
|
||
|
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
|
|||
|---|---|---|---|
|
#18+
Сразу скажу, что у меня 2003-ий. С помощью FoxPro 2.0 я удалил поле Sclads, которое с типом memo, потому что Driver={Microsoft Visual FoxPro Driver} у меня не хочет работать вообще! и использовал dBase III. Да и цель вопроса, полагаю, подправить текст SQL. изменил обращение к полям schet_a и agentcode и у меня заработало все четыре запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2008, 08:58:37 |
|
||
|
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
|
|||
|---|---|---|---|
|
#18+
К сожалению, удалять поле Sclads никак не получится, т.к. этот файл doc.dbf является рабочим в другой программе. Наверняка, дело не в строке SQL, а в драйвере подключения Driver={Microsoft Visual FoxPro Driver}. С ним не работает не только sql-оператор UNION ALL, но и другие. Например, пытался выйти из положения с помощью встроенного запроса, но не работает даже строка "SELECT * FROM (SELECT * FROM doc) ". Из других файлов dbf, у которых строка подключения выглядит как "Driver={Microsoft dBASE Driver (*.dbf)}, всё работает: и UNION, и вложенные (причём, несколько раз) запросы. Но, сам нужный файл doc.dbf работает только при Microsoft Visual FoxPro Driver. А при Microsoft dBASE Driver (*.dbf) вылетает: Ошибка выполнения '-2147467259 (80004005)': [Microsoft][Драйвер ODBC dBase] Внешняя таблица не имеет предполагаемый формат. Похоже, придётся обойтись другими способами. А именно, получать данные двумя запросами в два массива и создавать отдельную процедуру по нужному объединению данных из этих двух массивов в третий. А жаль, запросом проще и быстрее. Эти и некоторые другие мысли описаны в теме SQL-запрос. Получить данные из массива (-ов) или другого (других) Recordset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2008, 14:09:31 |
|
||
|
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
|
|||
|---|---|---|---|
|
#18+
а так запрос прокатит ? Код: plaintext I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2008, 14:39:55 |
|
||
|
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
|
|||
|---|---|---|---|
|
#18+
вот такое сообщение, это с драйвером dBase ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2008, 15:09:26 |
|
||
|
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
|
|||
|---|---|---|---|
|
#18+
А вам обязательно надо это в Экселе делать? Может проще будет поставить нормальную СУБД, подключить к ней оба dbf как внешние таблицы и сделать объединяющий view? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2008, 17:55:50 |
|
||
|
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
|
|||
|---|---|---|---|
|
#18+
ну case - это для MS SQL попробуйте так Код: plaintext I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 09:03:41 |
|
||
|
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
|
|||
|---|---|---|---|
|
#18+
HandKotпопробуйте такС той базой, где я удалил memo поле "Sklads" да, так работает (только поля schet_a и agentcode не стал называть sch и code) потому что выдавало такое сообщение (см. картинку) Думаю, автору придётся сделать небольшую программку на FoxPro 2.0 которая выберет все записи из базы doc.dbf и скопирует с другим именем, но уже без memo поля. И драйвером dBase её обрабатывать или же, поступить как советует White Owl, но я думаю это наверно дорого. Не знаю. У меня схожие трудности, как и у автора. Полно баз созданных на Клиппере 5.01 с индексами ntx, не меньше баз FoxPro 2.0 с индексами cdx и файлами ftp Многие их них открыты с общим доступом по записи. И не начём другом, кроме как на Клиппере и FoxPro, их не возможно сопровождать, делать изменения и т.д. Интересно Ваше мнение! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 10:07:42 |
|
||
|
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
|
|||
|---|---|---|---|
|
#18+
klen_или же, поступить как советует White Owl, но я думаю это наверно дорого. Не знаю.Ничего это не дорого. Это слегка непривычно в первые пару недель для фоксофилов, зато потом наступает восхитительная легкость :) klen_У меня схожие трудности, как и у автора. Полно баз созданных на Клиппере 5.01 с индексами ntx, не меньше баз FoxPro 2.0 с индексами cdx и файлами ftp Многие их них открыты с общим доступом по записи. И не начём другом, кроме как на Клиппере и FoxPro, их не возможно сопровождать, делать изменения и т.д.Ну это уж совсем элементарно. Берешь нормальную СУБД, сочиняешь в ней структуру БД которая будет частично или полностью копировать набор твоих dbf'ок. Потом пишешь маленький батничек типа такого: Код: plaintext 1. Чуть более сложный вариант - пишешь себе маленькую программку которая будет открывать твои dbf'ки (например приезжающие из разных филиалов) вычитывать из этих dbf'ок описание физических объектов (товары, продавцы, накладные и тд и тп) и записывать эти объекты в нормальную СУБД. Заодно получишь возможность делать конвертацию способа хранения этих объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 17:50:40 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=35109861&tid=2181482]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 300ms |

| 0 / 0 |
