Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос к DBF базе через 1cpp.dll
, ,
0 woha
 
07.01.13
13:32
Помогите, пожалуйста. Битый час ищу как сделать запрос к ДБФ и никак.
То что сейчас имею:
       База = СоздатьОбъект("OLEDBData");
   Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
   Рез = База.Соединение(Соединение);
   //Запрос = База.СоздатьКоманду();
   RS = СоздатьОбъект("ODBCRecordset");
   RS.УстБД(База);
   ТекстЗапроса = "
   |SELECT  
   |    Спр.ID as [Элемент $Справочник.Товары]
   |,        $Спр.ИД as ИД
   |FROM
   |        $Справочник.Товары as Спр
   |ORDER BY
   |$Спр.ИД    DESС
   |";
   //Запрос.Выполнить(ТекстЗапроса);
   //ТЗ = СоздатьОбъект("ТаблицаЗначений");
   //RS.Отладка(1);
   ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
1 zladenuw
 
07.01.13
13:36
и что не получается ? что за ошибка ?
2 zladenuw
 
07.01.13
13:38
Запрос = База.СоздатьКоманду();
   ТекстЗапроса = "
           |SELECT
           |*
           |FROM $Справочник."+"СТСостоянияОбъектов"+" as Спр where $Спр.КодВнешний=:ВыбКод";
   Запрос.УстановитьТекстовыйПараметр("ВыбКод","55169095549987777");        
   ТЗ2 = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   ТЗ2.ВыбратьСтроки();
   Пока ТЗ2.ПолучитьСтроку()=1 Цикл
       Сообщить(ТЗ2.КодВнешний);
               Сообщить(ЗначениеИзСтрокиВнутр(ТЗ2.ВнутреннееПредставление));
               Сообщить("Дата КПК - "+ТЗ2.ДатаКПК+", Дата Загрузки "+ТЗ2.ДатаКонтроль);
               Сообщить("----");
   КонецЦикла;
3 spock
 
07.01.13
13:38
(1)у него все не получается, даже не интересно, что за ошибка.
4 МастерВопросов
 
07.01.13
13:38
Эту статью читал?

http://www.1cpp.ru/forumfiles/Attachments/mod_002.zip

Для DBF версии рекомендуется использовать объект “ OLEDBData”(для версии 1С++ 2.0.0.0 и выше) следующим образом:
       База = СоздатьОбъект("OLEDBData");
       Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
       Рез = База.Соединение(Соединение);
       Запрос = База.СоздатьКоманду();
А что делать, если на компьютере не установлен драйвер фокса? Дык, качать!
5 МастерВопросов
 
07.01.13
13:39
(0) в базе никто монопольно не сидит?
6 woha
 
07.01.13
13:40
(4) драйвер установлен
7 МастерВопросов
 
07.01.13
13:41
(0) что за подозрительный реквизит?

"$Спр.ИД"
8 woha
 
07.01.13
13:42
(7) есть такой реквизит.
9 МастерВопросов
 
07.01.13
13:42
(6) ты может объяснишь уже что у тебя не получается?
10 woha
 
07.01.13
13:43
(3) спасибо на добром слове.
11 woha
 
07.01.13
13:45
если база дбф нужно использовать "ODBCRecordset"?
12 Cthulhu
 
07.01.13
13:45
(8): о. синхронизируем базы данных по Id объектов данныых?..
13 МастерВопросов
 
07.01.13
13:47
(11) см. (1)(9)
14 woha
 
07.01.13
13:48
База = СоздатьОбъект("OLEDBData");
   Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
   Рез = База.Соединение(Соединение);
   Запрос = База.СоздатьКоманду();
   ТекстЗапроса = "
   |SELECT  
   |        Спр.ID as [Элемент $Справочник.Товары]
   |,        $Спр.ИД as ИДД
   |FROM
   |        $Справочник.Товары as Спр
   |ORDER BY
   |        $Спр.ИД    DESС
   |";
   ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);


{Глобальный модуль(5849)}: FAILED! ICommandText::Execute(): Command contains unrecognized phrase/keyword.
15 МастерВопросов
 
07.01.13
13:50
(14) а если вместо
"as [Элемент $Справочник.Товары]"

написать:
"as Элемент"

ошибка остается?
16 woha
 
07.01.13
13:50
(8) ИД - числовой реквизит для связки с mySQL
17 woha
 
07.01.13
13:53
(15) Ответ тот же, что и в (14)
18 zladenuw
 
07.01.13
13:55
$Спр.ИД посмотри какое его имя.
Может это поможет

Как получить Id реквизита справочника (fieldid) ?

глМД = СоздатьОбъект("MetaDataWork");
ИДЮрАдрес = Прав(_IDToStr(глМД.ИДРеквизитаСправочника("ЮрЛица","ЮрАдрес")),4);
19 woha
 
07.01.13
13:56
(18) Мне не надо ID 1С. Как его получить я знаю.
20 woha
 
07.01.13
13:59
Поменял на:
ТекстЗапроса = "
   |SELECT  
   |      $Спр.Норма as Норма
   |FROM
   |        $Справочник.Товары as Спр
   |ORDER BY
   |        $Спр.Норма    DESС
Но результат тот же.
21 МастерВопросов
 
07.01.13
14:00
(17) может дело в этом?

==========================
"Правда, не все имена метапарсер преобразовывает в поля таблиц. Есть исключения – это предопределенные имена:
Для справочников
ИД (Ссылка)        ID"
==================================

попробуй убрать строку про "$Спр.ИД"
22 zladenuw
 
07.01.13
14:01
(20)
Возьми * и посмотри какие колонки ты получаешь. и харе гадать
23 woha
 
07.01.13
14:04
(21) поле ИД поменял на Норма, но ошибка та же.
24 МастерВопросов
 
07.01.13
14:05
(23) ага, я уже поздно увидел.
Ну пробуй (22) ....
25 woha
 
07.01.13
14:07
(22) Возвращает поля как в DD-файле
26 woha
 
07.01.13
14:08
(22) поля DBF
27 МастерВопросов
 
07.01.13
14:11
(25) а закеж запрос, который отработал без ошибок.
28 woha
 
07.01.13
14:11
База = СоздатьОбъект("OLEDBData");
   Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
   Рез = База.Соединение(Соединение);
   Запрос = База.СоздатьКоманду();
   //RS = СоздатьОбъект("ODBCRecordset");
   //RS.УстБД(Рез);
   ТекстЗапроса = "
   |SELECT  
   |      *
   |FROM
   |        $Справочник.Товары as Спр
   |";
   //Запрос.Выполнить(ТекстЗапроса);
   //ТЗ = СоздатьОбъект("ТаблицаЗначений");
   //RS.Отладка(1);
   ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
29 Попытка1С
 
07.01.13
14:13
Нафига тебе все это?
Используй 1CPP.dll + 1sqlite.dll будь человеком.
30 МастерВопросов
 
07.01.13
14:14
(28) аднака в нём нет сортировки и именно фразы "DESС"
31 woha
 
07.01.13
14:20
(29) Я могу обойтись и без этого. Хотелось что б побыстрей запросы выполнялись. А базу на SQL перевести не дают. Поиск документа по какому-нибудь реквизиту шапки запросом 1С это вообще жуть.
32 Попытка1С
 
07.01.13
14:22
(31) Ты не понял, на просвещайся
http://infostart.ru/public/15977/

+ для дбф юзай класс ПрямойЗапрос, после перевода на скуль не надо будет ничего переписывать.
33 woha
 
07.01.13
14:24
(32) Я все понял. Годами использую T-SQL на другой базе. Но он не работает с ДБФ
34 woha
 
07.01.13
14:25
(32) ToySQL
35 Попытка1С
 
07.01.13
14:27
(33) Мда.
36 woha
 
07.01.13
14:29
на форумах прочитал, что можно делать запросы к ДБФ и решил попробовать разогнать то, что изначально сделано тормозом (запросы 1С).
37 Попытка1С
 
07.01.13
14:30
(36) Я тебе еще раз говорю, ты не понял. toysql тут вообще никаким боком. Стукнись в асю расскажу как все сделать, только быстро давай.
38 woha
 
07.01.13
15:07
Проблему решил пока так:
       ТекстЗапроса = "
   |SELECT
   |      $Спр.ИД as ИДД
   |FROM
   |        $Справочник.Товары as Спр
   |ORDER BY
   |        $Спр.ИД
   |";

   ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   ТЗ.Сортировать("ИДД -");
оказывается, обратной сортировки он не понимает.
39 woha
 
07.01.13
15:11
(3) ну хоть что-то получилось. :)
40 МастерВопросов
 
07.01.13
15:58
(38) т.е. я был прав в (30)
41 woha
 
07.01.13
16:25
(40) Да.
42 woha
 
07.01.13
16:27
(40) с ТОР дело так же обстоит как DESC?
43 woha
 
07.01.13
16:30
хотя ТОР мне мало бы помог без DESC. мне надо было максимальное значение, а оно без DESC в последней строке.
44 woha
 
07.01.13
16:32
СПАСИБО ВСЕМ!!!
45 woha
 
07.01.13
16:33
и за критику тоже.
46 kiruha
 
07.01.13
16:52
>>оказывается, обратной сортировки он не понимает.
FAQ для 1С++ через фокс
http://www.1cpp.ru/forum/YaBB.pl?num=1148038411/15#24
в частности документация
http://vfpx.codeplex.com/releases/view/10203
в частности сортироыка

Детальный синтаксис рассматриваемой секции ORDER BY имеет следующий вид:
[ORDER BY Order_Item [ASC | DESC] [, ...]]
47 kiruha
 
07.01.13
16:54
Collating Sequence=MACHINE;
48 woha
 
07.01.13
17:29
(46) спасибо.