Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос 1С++ к DBF через OLEDBCommand и виртуальные таблицы
,
0 Sk0rp
 
15.02.12
20:02
В запросе есть обращение к $РегистрОстаткиОбороты.ПартииТоваров
в SQL все работает, в DBF метапарсер ругается: " Meta name parser error: это метаимя разрешить невозможно "$РегистрОстаткиОбороты.ПартииТоваров""
В документации нигде не нашел, что при запросе через OLEDBCommand нельзя использовать виртуальные таблицы регистров.
Чего я не знаю?
1 Кириллка
 
15.02.12
20:07
при запросе через OLEDBCommand нельзя использовать виртуальные таблицы
2 ДенисЧ
 
15.02.12
20:09
теперь ты знаешь
3 Sk0rp
 
15.02.12
20:12
Обходить выборкой остатков из таблицы итогов + выборка оборотов из таблицы движений? Или есть путь проще?
4 Кириллка
 
15.02.12
20:18
$РегистрОстаткиОбороты.<ИмяРегистра> - разворачивается в выборку остатков из таблицы итогов + выборка оборотов из таблицы движений. Путя проще нет.
5 orefkov
 
15.02.12
22:00
Класс ПрямойЗапрос помогает
6 nicxxx
 
16.02.12
02:40
(0) скинуть тебе шаблончик виртуальной таблицы для DBF базы?
7 big
 
16.02.12
04:03
(6) И мне, и мне тоже, если можно. :) Мыло в личке.
8 nicxxx
 
16.02.12
04:41
(7)s'il vous plait
ТекстЗапроса:
       select
           Номенклатура
           ,Склад
           ,Качество
           ,sum(НачОст) as КоличествоНачОст
           ,sum(Приход) as КоличествоПриход
           ,sum(Расход) as КоличествоРасход
           ,sum(НачОст+Приход-Расход) as КоличествоКонОст
       from
       (
       select
           $Рег.Номенклатура as Номенклатура
           ,$Рег.Склад as Склад
           ,$Рег.Качество as Качество
           ,$Рег.Количество as НачОст
           ,0 as Приход
           ,0 as Расход
           ,0 as КонОст
       from
           $РегистрИтоги.ОстаткиТМЦ as Рег
       where
           period = {d '2011-12-01'}
       and
           $Рег.Количество<>0
       
       UNION ALL
       
       select
           Номенклатура
           ,Склад
           ,Качество
           ,0 as НачОст
           ,sum(quantity_receipt) as Приход
           ,sum(quantity_expense) as Расход
           ,0 as КонОст
       from
       (
       select
           $Рег.Номенклатура as Номенклатура
           ,$Рег.Склад as Склад
           ,$Рег.Качество as Качество
           ,$Рег.Количество as quantity_receipt
           ,0 as quantity_expense
       from
           $Регистр.ОстаткиТМЦ as Рег
           inner join 1sjourn as j on j.iddoc = Рег.iddoc
       where
           j.date between {d '2012-01-01'} and {d '2012-01-30'}
       and
           $Рег.Количество<>0
       and
           Рег.debkred = 0    
       
       UNION ALL
       
       select
           $Рег.Номенклатура
           ,$Рег.Склад
           ,$Рег.Качество
           ,0
           ,$Рег.Количество
       from
           $Регистр.ОстаткиТМЦ as Рег
           inner join 1sjourn as j on j.iddoc = Рег.iddoc
       where
           j.date between {d '2012-01-01'} and {d '2012-01-30'}
       and
           $Рег.Количество<>0
       and
           Рег.debkred = 1
       ) as turnovers1
       
       group by
           Номенклатура,Склад,Качество
       ) as TurnOvers
       group by
           Номенклатура,Склад,Качество
9 nicxxx
 
16.02.12
04:45
2 запроса, самые внутренние, которые дают выборку turnovers1 нужны потому, что конструкция
                       ,IIF(Рег.debkred = 0, $Рег.Количество, 0) as quantity_receipt
,IIF(Рег.debkred = 1, $Рег.Количество, 0) as quantity_expense

нифига не правильно работает. но может это у меня руки кривые, покритикуйте
10 Ёпрст
 
16.02.12
09:24
(9) не то слово..всё в топку
11 nicxxx
 
16.02.12
10:30
кстати я сегодня попробовал переписать на вариант с использованием IIF, вроде правильные движения показывает. может в предыдущий раз база была не проиндексирована
12 Ёпрст
 
16.02.12
10:39
(11) мало того, что никакой iif там не нужен , это раз.
Получение останков идёт только на ТА, это два
Индексы не используются, это три..

Всё в топку..
ЗЫ: на вот, развлекайся:
Перем ОлеДБ,Запрос;
//======================================================================
Процедура ПриОткрытии()
   ОлеДБ = СоздатьОбъект("OLEDBData");
   Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
   Рез = ОлеДБ.Соединение(Соединение);
   Запрос = ОлеДБ.СоздатьКоманду();
   Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");
   // Устанавливаем время ожидания захвата таблиц , если во время выполнения запроса кто то проводит документы
   // Очень полезная функция - аналогична времени ожидания в 1С
   Запрос.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
   // Убираем буфепизацию, чтобы данные возвращаемые запросам всегда были актуальны
   Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");
   Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')");// Отключили блокировки
КонецПроцедуры // ПриОткрытии
//======================================================================
Процедура Сформировать()

       Запрос = ОлеДБ.СоздатьКоманду();

       ТекстЗапроса = " --- Останки и Обороты за период ----
       |SELECT
       |   Рег.Номенклатура as [Товар $Справочник.Номенклатура]
       |   ,Рег.Склад as [Склад $Справочник.Склады]
       |   ,SUM(Рег.НачОст) НачОст
       |   ,SUM(Рег.Приход) Приход
       |   ,SUM(Рег.Расход) Расход
       |   ,SUM(Рег.НачОст+Рег.Приход-Рег.Расход) КонОст
       |FROM
       |    (
       |   SELECT -- останки на начало пред. периодичности
       |         $Итоги.Номенклатура Номенклатура
       |        ,$Итоги.Склад Склад
       |        ,$Итоги.Количество НачОст
       |        ,0 Приход
       |        ,0 Расход
       |    FROM
       |        $РегистрИтоги.ОстаткиТМЦ Итоги
       |    WHERE
       |        DTOS(Итоги.period)+$Итоги.Номенклатура
       |        LIKE  (DTOS(:ПредПериод~~)+'_________')
       |    
       |   UNION ALL  -- прибавляем движения к останкам
       |
       |    SELECT
       |         $Движения.Номенклатура
       |        ,$Движения.Склад
       |        ,$Движения.Количество * (1 - Движения.debkred * 2)
       |        ,0
       |        ,0
       |    FROM
       |        $Регистр.ОстаткиТМЦ  Движения
       |    WHERE
       |        DTOS(Движения.date)+Движения.time+Движения.iddoc+STR(Движения.lineno,4)+STR(Движения.actno,6) BETWEEN
       |         DTOS(:НачПериод~~)+'    '+'       '+'    '+'    '
       |     And DTOS(:КонПериод~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZZ'+'ZZZZZZ'
       |
       |    UNION ALL -- обороты за период
       |
       |    SELECT
       |         $Оборот.Номенклатура
       |        ,$Оборот.Склад
       |        ,0
       |        ,$Оборот.Количество*(1-Оборот.Debkred)
       |        ,$Оборот.Количество*Оборот.Debkred
       |    FROM
       |        $Регистр.ОстаткиТМЦ  Оборот
       |    WHERE
       |        DTOS(Оборот.date)+Оборот.time+Оборот.iddoc+STR(Оборот.lineno,4)+STR(Оборот.actno,6) BETWEEN
       |         DTOS(:НачДата~~)+'    '+'       '+'    '+'    '
       |     And DTOS(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZZ'+'ZZZZZZ'
       |    ) Рег
       |Group by Рег.Номенклатура,Рег.Склад
       |";

       мд = СоздатьОбъект("MetaDataWork");
       НачПериод = мд.ПолучитьНачПериода(НачДата);
       ПредПериод = мд.ПолучитьНачПериода(НачПериод-1);

       Запрос.УстановитьТекстовыйПараметр("ПредПериод",ПредПериод);
       Запрос.УстановитьТекстовыйПараметр("НачПериод",НачПериод);
       Запрос.УстановитьТекстовыйПараметр("КонПериод",НачДата-1);
       Запрос.УстановитьТекстовыйПараметр("НачДата",НачДата);
       Запрос.УстановитьТекстовыйПараметр("КонДата",КонДата);

       ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
       ТЗ.Выгрузить(ТаблФормы);


КонецПроцедуры // Сформировать
13 nicxxx
 
16.02.12
11:27
ну так это просто пример. я ее не доделал, некогда. а с индексами развлекался подобным образом, в отчетах использовал
14 Ёпрст
 
16.02.12
11:37
(13) помимо индексов , всё остальное тоже не верно
Основная теорема систематики: Новые системы плодят новые проблемы.