Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Прямой запрос к DBF базе через 1cpp.dll

v7: Прямой запрос к DBF базе через 1cpp.dll
Я
   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);
 
    ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
 
 
   zladenuw
 
1 - 07.01.13 - 13:36
и что не получается ? что за ошибка ?
   zladenuw
 
2 - 07.01.13 - 13:38
Запрос = База.СоздатьКоманду();
    ТекстЗапроса = "
            |SELECT
            |*
            |FROM $Справочник."+"СТСостоянияОбъектов"+" as Спр where $Спр.КодВнешний=:ВыбКод";
    Запрос.УстановитьТекстовыйПараметр("ВыбКод","55169095549987777");        
    ТЗ2 = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
    ТЗ2.ВыбратьСтроки();
    Пока ТЗ2.ПолучитьСтроку()=1 Цикл
        Сообщить(ТЗ2.КодВнешний);
                Сообщить(ЗначениеИзСтрокиВнутр(ТЗ2.ВнутреннееПредставление));
                Сообщить("Дата КПК - "+ТЗ2.ДатаКПК+", Дата Загрузки "+ТЗ2.ДатаКонтроль);
                Сообщить("----");
    КонецЦикла;
   spock
 
3 - 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) в базе никто монопольно не сидит?
   woha
 
6 - 07.01.13 - 13:40
(4) драйвер установлен
   МастерВопросов
 
7 - 07.01.13 - 13:41
(0) что за подозрительный реквизит?

"$Спр.ИД"
   woha
 
8 - 07.01.13 - 13:42
(7) есть такой реквизит.
   МастерВопросов
 
9 - 07.01.13 - 13:42
(6) ты может объяснишь уже что у тебя не получается?
   woha
 
10 - 07.01.13 - 13:43
(3) спасибо на добром слове.
 
 Рекламное место пустует
   woha
 
11 - 07.01.13 - 13:45
если база дбф нужно использовать "ODBCRecordset"?
   Cthulhu
 
12 - 07.01.13 - 13:45
(8): о. синхронизируем базы данных по Id объектов данныых?..
   МастерВопросов
 
13 - 07.01.13 - 13:47
(11) см. (1)(9)
   woha
 
14 - 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 Элемент"

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

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

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

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

попробуй убрать строку про "$Спр.ИД"
   zladenuw
 
22 - 07.01.13 - 14:01
(20)
Возьми * и посмотри какие колонки ты получаешь. и харе гадать
   woha
 
23 - 07.01.13 - 14:04
(21) поле ИД поменял на Норма, но ошибка та же.
   МастерВопросов
 
24 - 07.01.13 - 14:05
(23) ага, я уже поздно увидел.
Ну пробуй (22) ....
   woha
 
25 - 07.01.13 - 14:07
(22) Возвращает поля как в DD-файле
   woha
 
26 - 07.01.13 - 14:08
(22) поля DBF
   МастерВопросов
 
27 - 07.01.13 - 14:11
(25) а закеж запрос, который отработал без ошибок.
   woha
 
28 - 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);
 
    ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   Попытка1С
 
29 - 07.01.13 - 14:13
Нафига тебе все это?
Используй 1CPP.dll + 1sqlite.dll будь человеком.
   МастерВопросов
 
30 - 07.01.13 - 14:14
(28) аднака в нём нет сортировки и именно фразы "DESС"
   woha
 
31 - 07.01.13 - 14:20
(29) Я могу обойтись и без этого. Хотелось что б побыстрей запросы выполнялись. А базу на SQL перевести не дают. Поиск документа по какому-нибудь реквизиту шапки запросом 1С это вообще жуть.
   Попытка1С
 
32 - 07.01.13 - 14:22
(31) Ты не понял, на просвещайся
http://infostart.ru/public/15977/

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

    ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
    ТЗ.Сортировать("ИДД -");
оказывается, обратной сортировки он не понимает.
   woha
 
39 - 07.01.13 - 15:11
(3) ну хоть что-то получилось. :)
   МастерВопросов
 
40 - 07.01.13 - 15:58
(38) т.е. я был прав в (30)
   woha
 
41 - 07.01.13 - 16:25
(40) Да.
   woha
 
42 - 07.01.13 - 16:27
(40) с ТОР дело так же обстоит как DESC?
   woha
 
43 - 07.01.13 - 16:30
хотя ТОР мне мало бы помог без DESC. мне надо было максимальное значение, а оно без DESC в последней строке.
   woha
 
44 - 07.01.13 - 16:32
СПАСИБО ВСЕМ!!!
   woha
 
45 - 07.01.13 - 16:33
и за критику тоже.
   kiruha
 
46 - 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] [, ...]]
   kiruha
 
47 - 07.01.13 - 16:54
Collating Sequence=MACHINE;
   woha
 
48 - 07.01.13 - 17:29
(46) спасибо.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует