|
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) помимо индексов , всё остальное тоже не верно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |