|
1c запрос к dbf чере FoxPro: подскажите как сделать фильтр по дате?.. | ☑ | ||
---|---|---|---|---|
0
Zhuravlik
12.09.14
✎
13:48
|
Здравствуйте. Такой вот код:
СтрокаПодключения="DRIVER={Microsoft Visual FoxPro Driver};SourceDB=C:\DBF; SourceType=DBF; Exclusive=No;BackgroundFetch=Yes;Collate=Russian;Null=No;Deleted=NO;"; Соединение = Новый COMОбъект("ADODB.Connection"); Соединение.Open(СтрокаПодключения); СтрокаЗапроса = "Select * from [MyDBF] WHERE [DAT] BETWEEN '20140801' AND '20140831'"; Выборка= Соединение.Execute(СтрокаЗапроса); Также пробовал: СтрокаЗапроса = "Select * from [MyDBF] WHERE [DAT] BETWEEN #01/08/2014# AND #31/08/2014#"; - выкидывает ошибку синтаксиса СтрокаЗапроса = "Select * from [MyDBF] WHERE [DAT] BETWEEN '01.08.2014' AND '01.08.2014'"; Выдает пустоту, записи есть точно. |
|||
1
1Сергей
12.09.14
✎
13:52
|
ctod(strdata)
|
|||
2
КонецЦикла
12.09.14
✎
13:56
|
dtos навреное, но мог забыть
|
|||
3
КонецЦикла
12.09.14
✎
13:56
|
еще какие варианты? :)
|
|||
4
Zhuravlik
12.09.14
✎
14:00
|
(1) В смысле
"Select * from [MyDBF] WHERE ctod([DAT]) BETWEEN '20140801' AND '20140831'"; ? Вот сюда вчитался "http://www.script-coding.com/ADO.html" - есть у объекта ADO коллекция Parameters... Никто не пользовался ею? |
|||
5
Zhuravlik
12.09.14
✎
14:06
|
"ctod('20140801') AND ctod('20140831')" - не катит, и с "/" - тоже
|
|||
6
Zhuravlik
12.09.14
✎
14:19
|
Нашел замечтательную статью по ADO: http://www.sql.ru/articles/mssql/2005/122703ado.shtml, мот там найду ответы на свои вопросы...
|
|||
7
SSSSS_AAAAA
12.09.14
✎
14:23
|
(0) А где здесь "чере FoxPro"? Microsoft Visual FoxPro Driver? Более древнего не нашли?
ctod(strdata) - функция фокса, а не стороннего драйвера. Функции фокса поддерживает родной VFP OLEDB Provider с сайта мелкомягких. При этом для задания даты функция ctod() не нужна. Ибо есть формат {^yyyy-mm-dd} |
|||
8
Zhuravlik
12.09.14
✎
14:27
|
(7)
"Более древнего не нашли? " - все делалось по наитию, опыта в матчасти не имею, если знаете где взять посвежее, подскадите пожалуйста. "родной VFP OLEDB Provider " - это Microsoft FoxPro VFP Driver (*.dbf) ? "Ибо есть формат {^yyyy-mm-dd}" - в смысле "'^2014-08-01' AND '^2014-08-31'" - так? |
|||
9
1Сергей
12.09.14
✎
14:28
|
(5) гугли foxpro ctod
|
|||
10
Zhuravlik
12.09.14
✎
14:30
|
(9) Гуглил. Не катит "ctod('1/8/2014') AND ctod('31/8/2014')"
|
|||
11
SSSSS_AAAAA
12.09.14
✎
14:33
|
"родной VFP OLEDB Provider" - это родной драйвер доступа к dbf-файлам, использующий синтаксис и возможности Microsoft Visual FoxPro.
"'^2014-08-01' AND '^2014-08-31'" - так? - нет, не так. {^2014-08-01} AND {^2014-08-31} |
|||
12
SSSSS_AAAAA
12.09.14
✎
14:35
|
(9) Функция Ctod() зависит от региональных настроек.
|
|||
13
Zhuravlik
12.09.14
✎
14:36
|
(11) "родной драйвер доступа к dbf-файлам," - а где его взять не скажете? На этот фильтр ошибку выдает.
|
|||
14
Zhuravlik
12.09.14
✎
14:36
|
||||
15
Zhuravlik
12.09.14
✎
14:38
|
(11) Я его качал, в списке источников данных появился "Microsoft Visual FoxPro Driver" - я его и использую.
|
|||
16
SSSSS_AAAAA
12.09.14
✎
14:46
|
(15) Это не он и используете не его.
|
|||
17
Zhuravlik
12.09.14
✎
14:49
|
(16) А кто "он"-то?
|
|||
18
SSSSS_AAAAA
12.09.14
✎
14:51
|
(17) Это не VFP OLEDB Provider
|
|||
19
SSSSS_AAAAA
12.09.14
✎
14:52
|
(15) Качал может и его, но используешь не его.
|
|||
20
Zhuravlik
12.09.14
✎
14:56
|
Я пробовал в строке подключения указывать
- DRIVER={Microsoft Visual FoxPro Driver} - DRIVER={Microsoft FoxPro VFP Driver (*.dbf)} Все не то. Чисто "VFP OLEDB Provider" - такой строки в источниках данных я не нашел. Что еще мне указывать?.. |
|||
21
Zhuravlik
12.09.14
✎
14:59
|
+ Да, кстати винда 8 x64, может что завязано на этом...
|
|||
22
SSSSS_AAAAA
12.09.14
✎
15:03
|
(21) Ну наконец-то... Очень даже завязано. Ищи в системных папках odbcadm32.exe и запускай.
|
|||
23
Zhuravlik
12.09.14
✎
15:22
|
(22) Чей-то нет такого... Это что-то вроде конвертера?
|
|||
24
Zhuravlik
12.09.14
✎
15:22
|
odbcad32.exe есть, мот оно?
|
|||
25
Zhuravlik
12.09.14
✎
15:23
|
А, это сама консоль
|
|||
26
Zhuravlik
12.09.14
✎
15:26
|
В общем отказался от ADO, использую xBase, время не ждет. Долго(
|
|||
27
Zhuravlik
12.09.14
✎
15:27
|
Спасибо за беспокойство
|
|||
28
Garykom
гуру
12.09.14
✎
16:49
|
(26) через XBase можно облом получить с длинными полями или не читаемыми символами с кодами до (32) в строковом поле или с новыми форматами чисел
|
|||
29
Zhuravlik
12.09.14
✎
16:52
|
Слишком долго через xBase, придется как-то дожать... Пересел на машину с xp, установил прова из (14), не взлетело...
Дошел вот до чего: СтрокаПодключения="DRIVER={Microsoft Visual FoxPro Driver};SourceDB="+ ПутьКФайлу +"; SourceType=DBF;Collate=Russian;"; Соединение = Новый COMОбъект("ADODB.Connection"); Соединение.Open(СтрокаПодключения); Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Соединение; Param1 = Command.CreateParameter("nData", 133, 1); Command.Parameters.Append(Param1); Param1.Value = Формат(НачПериода, "ДФ=dd.MM.yyyy"); Param2 = Command.CreateParameter("kData", 133, 1); Command.Parameters.Append(Param2); Param2.Value = Формат(КонПериода, "ДФ=dd.MM.yyyy"); Выборка= Соединение.Execute("Select * from ["+ ФайлDBF.ИмяБезРасширения +"] WHERE [DAT] BETWEEN ? AND ?"); Валится на Execute: "Wrong number of parameters" |
|||
30
Zhuravlik
12.09.14
✎
16:54
|
(26) Я вообще засасывал таблицы в внешний источник, но 1С отказывалась запрос выполнять, тогда решил связаться с ADO. А тут проблема с фильтром по периоду. Непосредственно при переборе по дате исключать - не хочу, мне кажется скорость не намного повысится в таком случае.
|
|||
31
Zhuravlik
12.09.14
✎
17:00
|
При указании параметров как ":nData" или "@kData" тоже облом... p.s. как все было в клюшках просто =)
|
|||
32
Garykom
гуру
12.09.14
✎
17:04
|
Эта может не страдать и сделать шлюз на FoxPro?
Что хоть за прога то на фоксе и какие данные нужно и как часто сливать? |
|||
33
Zhuravlik
12.09.14
✎
17:05
|
(32) Однократно считать с DBF. Про шлюз на FoxPro не понял.
|
|||
34
Garykom
гуру
12.09.14
✎
17:08
|
(33) Шлюз = прога на языке FoxPro или Visual FoxPro которая данные перекинет к примеру в текстовый-csv или еще какой нужный формат с нужным фильтром
|
|||
35
Garykom
гуру
12.09.14
✎
17:10
|
Кстати да я про FoxPro забыл как про страшный сон про работу на станции переливания крови )) тама такая древность стояла
|
|||
36
Zhuravlik
12.09.14
✎
17:16
|
(34) Не получиться шлюз(( Мне дали DBF-ы, структура описана, тз готово, что загружать все знаю, одна проблема - в скорости, решаемая (имхо), только б этот фильтр победить...
|
|||
37
Zhuravlik
12.09.14
✎
17:19
|
Я б с удовольствием что-нить другое заюзал, если бы оно существовало. Ведь проблема-то не в FoxPro, а в ADO. Я ведь правильно понимаю, что текст ADO запроса - это в принципе универсальная такая вещь должна быть, работающая в разных ИБ? Там в частностях должны быть грабли, но уж отбор-то по периоду - какая это частность?..
|
|||
38
oleg_km
12.09.14
✎
17:28
|
Если ты параметр создаешь типа дата, то вроде не нужно делать формат. Просто присваиваешь дату
Param1 = Command.CreateParameter("nData", 133, 1); Command.Parameters.Append(Param1); Param1.Value = НачПериода; |
|||
39
Zhuravlik
12.09.14
✎
17:31
|
Вот так получилось:
СтрокаПодключения="DRIVER={Microsoft Visual FoxPro Driver};SourceDB="+ ПутьКФайлу +"; SourceType=DBF;Collate=Russian;"; Соединение = Новый COMОбъект("ADODB.Connection"); Соединение.Open(СтрокаПодключения); Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Соединение; Param1 = Command.CreateParameter("nDate", 133, 1); Command.Parameters.Append(Param1); Param1.Value = Формат(НачПериода, "ДФ=dd.MM.yyyy"); //Param1.Value = НачПериода; Param2 = Command.CreateParameter("kData", 133, 1); Command.Parameters.Append(Param2); Param2.Value = Формат(КонПериода, "ДФ=dd.MM.yyyy"); //Param2.Value = КонПериода; Command.CommandText = "Select * from "+ ФайлDBF.ИмяБезРасширения +" WHERE DAT BETWEEN ? AND ?"; Выборка = Command.Execute(); Счастья полные штаны =) Спасибо всем за комментарии. |
|||
40
Zhuravlik
12.09.14
✎
17:33
|
(38) Да, уже понял, так и есть, спасибо)
|
|||
41
oleg_km
12.09.14
✎
17:33
|
А ну действительно, квадратные скобки в фокспре вроде не используются
|
|||
42
Zhuravlik
12.09.14
✎
17:47
|
Блин... Как теперь в параметры массив засунуть?..
|
|||
43
Zhuravlik
12.09.14
✎
19:51
|
Сохраню свой итоговый запрос для себя, на будущее...
МассивКлючевыхПолей = Новый Массив(); СтрокаПодключения="DRIVER={Microsoft Visual FoxPro Driver};SourceDB="+ КаталогИБ +"; SourceType=DBF;Collate=Russian;"; Соединение = Новый COMОбъект("ADODB.Connection"); Соединение.Open(СтрокаПодключения); Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Соединение; Param1 = Command.CreateParameter(, 133, 1); Command.Parameters.Append(Param1); Param1.Value = НачПериода; Param2 = Command.CreateParameter(, 133, 1); Command.Parameters.Append(Param2); Param2.Value = КонецДня(КонПериода); Param3 = Command.CreateParameter(, 133, 1); Command.Parameters.Append(Param3); Param3.Value = НачПериода; Param4 = Command.CreateParameter(, 133, 1); Command.Parameters.Append(Param4); Param4.Value = КонецДня(КонПериода); Command.CommandText = " |SELECT kod FROM "+ Файл_TOV_P0.ИмяБезРасширения +" WHERE dat BETWEEN ? AND ? INTO CURSOR tmp_TOV_P0; |SELECT kod FROM "+ Файл_TOV_R0.ИмяБезРасширения +" WHERE dat BETWEEN ? AND ? INTO CURSOR tmp_TOV_R0; |SELECT DISTINCT sost1 FROM "+ Файл_TOV_R1.ИмяБезРасширения +" WHERE ref_up IN (SELECT kod FROM tmp_TOV_R0) INTO CURSOR tmp_TOV_R1; |SELECT DISTINCT tmc FROM "+ Файл_TOV_P1.ИмяБезРасширения +" WHERE ref_up IN (SELECT kod FROM tmp_TOV_P0) |UNION ALL |SELECT DISTINCT tmc FROM "+ Файл_TOV_S.ИмяБезРасширения +" WHERE kod IN (SELECT sost1 FROM tmp_TOV_R1);"; Выборка = Command.Execute(); Пока Выборка.EOF=0 Цикл КлючевоеПоле = Выборка.Fields("TMC").value; МассивКлючевыхПолей.Добавить(КлючевоеПоле); Выборка.MoveNext(); КонецЦикла; Выборка=0; Соединение=0; Command = 0; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |