Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Запрос из файла dbf в массив. Глюк с оператором UNION ALL. / 10 сообщений из 10, страница 1 из 1
01.02.2008, 17:07:54
    #35104750
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
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
...
Рейтинг: 0 / 0
04.02.2008, 08:58:37
    #35107232
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
Сразу скажу, что у меня 2003-ий.
С помощью FoxPro 2.0 я удалил поле Sclads, которое с типом memo, потому что
Driver={Microsoft Visual FoxPro Driver} у меня не хочет работать вообще!
и использовал dBase III.
Да и цель вопроса, полагаю, подправить текст SQL.
изменил обращение к полям schet_a и agentcode
и у меня заработало все четыре запроса
...
Рейтинг: 0 / 0
04.02.2008, 14:09:31
    #35108306
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
К сожалению, удалять поле 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
...
Рейтинг: 0 / 0
04.02.2008, 14:39:55
    #35108421
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
а так запрос прокатит ?
Код: plaintext
SELECT schet_a as sch, agentcode as code, sum(case when (vid=' 2 ') then summa else  0  end) as rea, sum(case when (vid=' 1 ') then summa else  0  end) as zak FROM doc WHERE (type=' 1 ') GROUP BY sch, code

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
04.02.2008, 15:09:26
    #35108540
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
вот такое сообщение, это с драйвером dBase
...
Рейтинг: 0 / 0
04.02.2008, 17:55:50
    #35109059
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
А вам обязательно надо это в Экселе делать?
Может проще будет поставить нормальную СУБД, подключить к ней оба dbf как внешние таблицы и сделать объединяющий view?
...
Рейтинг: 0 / 0
05.02.2008, 09:03:41
    #35109719
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
ну case - это для MS SQL
попробуйте так

Код: plaintext
SELECT schet_a as sch, agentcode as code, sum(iif(vid=' 2 ', summa, 0 )) as rea, sum(iif(vid=' 1 ', summa,  0 )) as zak FROM doc WHERE (type=' 1 ') GROUP BY sch, code

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
05.02.2008, 10:07:42
    #35109861
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
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, их не возможно сопровождать, делать изменения и т.д.
Интересно Ваше мнение!
...
Рейтинг: 0 / 0
05.02.2008, 17:50:40
    #35111710
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
klen_или же, поступить как советует White Owl, но я думаю это наверно дорого. Не знаю.Ничего это не дорого. Это слегка непривычно в первые пару недель для фоксофилов, зато потом наступает восхитительная легкость :)

klen_У меня схожие трудности, как и у автора. Полно баз созданных на Клиппере 5.01 с индексами ntx, не меньше баз FoxPro 2.0 с индексами cdx и файлами ftp
Многие их них открыты с общим доступом по записи.
И не начём другом, кроме как на Клиппере и FoxPro, их не возможно сопровождать, делать изменения и т.д.Ну это уж совсем элементарно.
Берешь нормальную СУБД, сочиняешь в ней структуру БД которая будет частично или полностью копировать набор твоих dbf'ок. Потом пишешь маленький батничек типа такого:
Код: plaintext
1.
cd /dir_with_dbfs
for %%f in (*.dbf) do dbisql -c "DSN=MyDB" truncate table %~nf; input into %~nf from %~ff format dbaseIII
dbisql это утилита от ASA, если у тебя будет другая СУБД, то и батничек может быть чуть-чуть посложнее. Зато потом получишь уже нормальную базу с нормальным SQL и делай себе сколько хочешь выборок любой сложности.
Чуть более сложный вариант - пишешь себе маленькую программку которая будет открывать твои dbf'ки (например приезжающие из разных филиалов) вычитывать из этих dbf'ок описание физических объектов (товары, продавцы, накладные и тд и тп) и записывать эти объекты в нормальную СУБД. Заодно получишь возможность делать конвертацию способа хранения этих объектов.
...
Рейтинг: 0 / 0
06.02.2008, 08:00:42
    #35112395
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из файла dbf в массив. Глюк с оператором UNION ALL.
White OwlБлагодарю!
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Запрос из файла dbf в массив. Глюк с оператором UNION ALL. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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