Имя: Пароль:
1C
 
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;