Имя: Пароль:
1C
 
Чтение данных из dbf из 8.3 1 с
,
0 olegon7
 
30.03.16
15:54
Имеются файлы dbf visual fox pro c memo полями
файлы большие больше миллиона записей
хотелось бы организовать чтение dbf запросами причем с временными таблицами...чтобы выполнялись друг за другом...для последующей загрузки в регистр сведений

какой порекомендуете драйвер(оптимальный) и почему запрос мой второй не выполняется?
**********************************
Connection = Новый COMОбъект("ADODB.CONNECTION");
Connection.Open("DRIVER={Microsoft FoxPro VFP Driver (*.dbf)};SourceDB=d:\dbf\; SourceType=DBF; Exclusive=No;BackgroundFetch=Yes;Collate=Russian;Null=No;Deleted=Yes;");

Исключение
       Сообщить("Все плохо:"+ОписаниеОшибки());
       Возврат;
   КонецПопытки;
  
   RecordSet = Новый COMОбъект("ADODB.Recordset");
    
    попытка
        

     Запрос= "
    |select MAX(kartkvgd.yearmon) AS yearmon,
    |kartkvgd.lic_sch,
    |kartkvgd.data_new
    |from
    |kartkvgd
    |GROUP BY kartkvgd.lic_sch INTO Cursor temp1;
    |select temp1.data_new AS data_new,
    |temp1.lic_sch AS lic_sch_t1,
    |temp1.yearmon AS yearmon,
    |kartab.lic_sch AS lic_sch_kartab1
    |from temp1 left join kartab
    |on temp1.lic_sch=kartab.lic_sch";

        RecordSet.Open(Запрос, Connection );
        
        
    исключение
        Сообщить ("Проблемы с выполнением запроса");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;

   ТЗ = Новый ТаблицаЗначений;
   Тз.Колонки.Добавить("ЛицевойСчет_1", Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(30)));
   Тз.Колонки.Добавить("ЛицевойСчет_2", Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(30)));
   Тз.Колонки.Добавить("ПоказаниеПоследующее", Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(20)));
   Тз.Колонки.Добавить("ОплаченныйМесяц", Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(20)));


   Пока Не RecordSet.EOF() Цикл
       Строка=Тз.Добавить();
        Строка.ЛицевойСчет_1= RecordSet.Fields("lic_sch_t1").Value;
        Строка.ЛицевойСчет_2= RecordSet.Fields("lic_sch_kartab1").Value;
        Строка.ПоказаниеПоследующее= RecordSet.Fields("data_new").Value;
        Строка.ОплаченныйМесяц= RecordSet.Fields("yearmon").Value;
                
     RecordSet.MoveNext();
КонецЦикла;


  Connection.Close();
1 aka AMIGO
 
30.03.16
16:06
Не знаю причину, но.. извини, мне не очень нравится, что ты выбрал имя переменной, совпадающее с именем функции 1С: "Строка"
2 ptiz
 
30.03.16
16:06
(0) Для начала:
Сообщить(ОписаниеОшибки());
вставь перед Сообщить ("Проблемы с выполнением запроса");
3 olegon7
 
30.03.16
16:23
ошибки нет
запрос второй не выполняется
Запрос= "
    |select MAX(kartkvgd.yearmon) AS yearmon,
    |kartkvgd.lic_sch,
    |kartkvgd.data_new
    |from
    |kartkvgd
    |GROUP BY kartkvgd.lic_sch INTO Cursor temp1;
    |select temp1.data_new AS data_new,
    |temp1.lic_sch AS lic_sch_t1,
    |temp1.yearmon AS yearmon,
    |kartab.lic_sch AS lic_sch_kartab1
    |from temp1 left join kartab
    |on temp1.lic_sch=kartab.lic_sch";

здесь два запроса результат первого помещаю во времен табл темп1 а затем выполняю второй запрос(должен выполнятся , но он не выполняется)
4 olegon7
 
30.03.16
16:26
может что -то в запросе неправильно написал?
5 olegon7
 
30.03.16
17:13
Собака зарыта в запросе втором - он просто не выполняется- только первый выполняется.
Вообще можно так последовательно запросы выполнять с временными таблицами?
6 Записьдампа
 
30.03.16
17:34
(5) Исполнение пакетного запроса и возврат его результата - на усмотрении драйвера и провайдера. То, что, например, провайдер MSSQL выполняет все и возвращает последний результат - его право, но не обязанность. Смирись.
7 hhhh
 
30.03.16
17:50
может

|select MAX(kartkvgd.yearmon) AS yearmon,
    |kartkvgd.lic_sch,
    |kartkvgd.data_new
    |from
    |kartkvgd
    |GROUP BY kartkvgd.lic_sch,
    |kartkvgd.data_new
8 Записьдампа
 
30.03.16
18:17
select
    temp1.data_new AS data_new,
    temp1.lic_sch  AS lic_sch_t1,
    temp1.yearmon  AS yearmon,
    kartab.lic_sch AS lic_sch_kartab1
    
from (
    select
        MAX(kartkvgd.yearmon) AS yearmon,
        kartkvgd.lic_sch,
        kartkvgd.data_new
    from
        kartkvgd
    GROUP BY
        kartkvgd.lic_sch
) AS temp1

left join
    kartab
on
    temp1.lic_sch = kartab.lic_sch

    
И убедится, что kartab есть индекс по lic_sch
9 cons74
 
30.03.16
19:15
Немного не в тему, но... Я из dbf в  access втягивал, и там уже запрос строил. А таблицу - результат  в xls и оттуда в 1С
10 olegon7
 
30.03.16
20:42
о вложенном запросе тоже думал , но он медленнее чем пакетный запрос. Может знаете какой драйвер умеет работать с пакетами запросов?
Еще вопрос
таблица kartkvgd
поля yearmon   тип дата    дата последней оплаты
     lic_sch   тип строка  лицевой счет
     data_new  тип число   показания
записей более миллиона , ни одно поле не уникально

как правильно выбрать всех абонентов(неповторяющихся) по последней оплате
правильно ли я написал запрос вот этот?
на поле data_new нет ни группировки ни агрегатной функции

select MAX(kartkvgd.yearmon) AS yearmon,
    |kartkvgd.lic_sch,
    |kartkvgd.data_new
    |from
    |kartkvgd
    |GROUP BY kartkvgd.lic_sch INTO Cursor temp1;
11 Записьдампа
 
30.03.16
23:01
(10) Ну дык сымитируй пакетный запрос через несколько вызовов. create table там, insert, select, drop... Индексы по вкусу.
12 olegon7
 
31.03.16
08:40
При выполнеии вложенного бьет ошибку
{Обработка.импортдбф.Форма.Форма.Форма(114)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC Visual FoxPro Driver]Syntax error.

Неправильно составлен запрос или драйвер не умеет
13 Записьдампа
 
31.03.16
08:46
(12) Там чистым английским ведь написано, что.
15 aka AMIGO
 
модератор
31.03.16
09:21
(14) Капслок на форуме запрещен.
16 olegon7
 
31.03.16
09:23
Ругается на запрос, который вы предложили.

Не подскажите как составить пакетный через несколько вызовов
17 Записьдампа
 
31.03.16
09:40
(16) Вполне может быть, я его не проверял.
Не надо составлять пакетный запрос. Надо составить несколько запросов, каждый из которых реализует часть логики - создание таблицы, заполнение ее данными, использование таблицы для получения результатов, и возможно удаление таблицы.
Конкретный код я тебе писать не буду, извини.
18 Записьдампа
 
31.03.16
09:54
В (8) возможно ошибка в GROUP BY
19 olegon7
 
31.03.16
11:30
может кто подключал ole db драйвер к dbf?

у меня сервер win serv 2008
1c x86 сервер  x86  субд ms sql

драйвер установил VFPOLEDB x86 последний

но программа ругается на него

поставщик не найден

НО!!!в файловом варианте все работает
я так понимаю дело в разрядности драйвера
кто нибудь ставил x64 разрядный драйвер ole db и есть ли он вообще в природе
20 George Wheels
 
31.03.16
11:41
Проверь может
temp1.lic_sch = "ЛицевойСчет"
, а
kartab.lic_sch = "ЛицевойСчет    "
21 olegon7
 
31.03.16
12:12
как реализовать несколько запросов исходя из моего программного кода?

кажДый раз создавать новый record set?


Connection.Open("DRIVER={Microsoft FoxPro VFP Driver (*.dbf)};SourceDB=d:\dbf\; SourceType=DBF; Exclusive=No;BackgroundFetch=Yes;Collate=Russian;Null=No;Deleted=Yes;");

Запрос= "запрос1";

        RecordSet.Open(Запрос1, Connection );
Connection.Close();

Connection.Open("DRIVER={Microsoft FoxPro VFP Driver (*.dbf)};SourceDB=d:\dbf\; SourceType=DBF; Exclusive=No;BackgroundFetch=Yes;Collate=Russian;Null=No;Deleted=Yes;");

Запрос= "запрос2";

        RecordSet.Open(Запрос2, Connection );
Connection.Close();
22 olegon7
 
31.03.16
14:16
приведите работающий пример на несколько вызовов?
что бы можно было обращаться к таблицам
можно схемно