4.
NCCSOFT
56
03.11.09 10:26
Сейчас в теме
Прямые запросы писал и для MS SQL и через LiteSQL (в режиме DBF), например процедура для ускорения "Подбор" в Номенклатуре.
//***************************************************************
Процедура ЗаполнитьКЭШ()
ЕСЛИ глДБФ=0 ТОГДА //Режим SQL
//SQL
Запрос = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
|SELECT ОстаткиТМЦОстатки.Номенклатура [Номенклатура $Справочник.Номенклатура]
| , ОстаткиТМЦОстатки.КоличествоОстаток
| , РезервыТМЦОстатки.КоличествоОстаток РезервыТМЦОстаткиКоличествоОстаток
| , ОстаткиТМЦОстатки1.КоличествоОстаток ОстаткиТМЦОстатки1КоличествоОстаток
|FROM $РегистрОстатки.ОстаткиТМЦ(,,
| (Склад = :ВыбСклад),
| (Склад, Номенклатура),) AS ОстаткиТМЦОстатки
| FULL OUTER JOIN $РегистрОстатки.РезервыТМЦ(,,
| (Склад = :ВыбСклад),
| (Склад, Номенклатура),) AS РезервыТМЦОстатки ON РезервыТМЦОстатки.Номенклатура = ОстаткиТМЦОстатки.Номенклатура
| FULL OUTER JOIN $РегистрОстатки.ОстаткиТМЦ(,,
| (Склад = :ВыбСкладВПути),
| (Склад, Номенклатура),) AS ОстаткиТМЦОстатки1 ON ОстаткиТМЦОстатки1.Номенклатура = ОстаткиТМЦОстатки.Номенклатура";
Запрос.УстановитьТекстовыйПараметр("ВыбСклад", Складик);
Запрос.УстановитьТекстовыйПараметр("ВыбСкладВПути", Константа.СкладВПути);
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
//SQL
ИНАЧЕ //Режим DBF
//DBF
Попытка
База = СоздатьОбъект("SQLiteBase");
Исключение
ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
База = СоздатьОбъект("SQLiteBase");
КонецПопытки;
База = СоздатьОбъект("SQLiteBase");
База.Открыть(":memory:");
Запрос = База.НовыйЗапрос();
Запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");
Запрос.ВыполнитьЗапрос("CREATE VIRTUAL TABLE ОстаткиИтоги USING DBENG(РегистрИтоги.ОстаткиТМЦ)");
Запрос.ВыполнитьЗапрос("CREATE VIRTUAL TABLE РезервыИтоги USING DBENG(РегистрИтоги.РезервыТМЦ)");
Запрос.Подставлять("ДатаТА", НачМесяца( ПолучитьДатуТА() ));
Запрос.Подготовить("
|SELECT
|Рез.Номенклатура [Номенклатура :Справочник.Номенклатура],
|SUM(Рез.Остаток),
|SUM(Рез.Резерв),
|SUM(Рез.ВПути)
|FROM (
|SELECT
|ОстаткиИтоги.Номенклатура Номенклатура,
|ОстаткиИтоги.Количество Остаток,
|0 Резерв,
|0 ВПути
|FROM ОстаткиИтоги
|WHERE (ОстаткиИтоги.Period = :ДатаТА) AND (ОстаткиИтоги.Склад = @ВыбСклад)
|
|UNION ALL
|
|SELECT
|ОстаткиИтоги.Номенклатура Номенклатура,
|0 Остаток,
|0 Резерв,
|ОстаткиИтоги.Количество ВПути
|FROM ОстаткиИтоги
|WHERE (ОстаткиИтоги.Period = :ДатаТА) AND (ОстаткиИтоги.Склад = @ВыбСкладВПути)
|
|UNION ALL
|
|SELECT
|РезервыИтоги.Номенклатура Номенклатура,
|0 Остаток,
|РезервыИтоги.Количество Резерв,
|0 ВПути
|FROM РезервыИтоги
|WHERE (РезервыИтоги.Period = :ДатаТА) AND (РезервыИтоги.Склад = @ВыбСклад)
|
|) Рез
|GROUP BY Рез.Номенклатура
|");
Запрос.УстановитьПараметр("@ВыбСклад", Складик);
Запрос.УстановитьПараметр("@ВыбСкладВПути", Константа.СкладВПути);
ТЗ = Запрос.Выполнить();
//DBF
КОНЕЦЕСЛИ;
ОстаткиТоваров.Загрузить(ТЗ);
КонецПроцедуры
Ёпрст по поводу чистоты кода :-) Именно эту обработку писали мои два студента-практиканта, а я им выдал рыбу самого отчета - поэтому твои замечания правильные и им как студентам 3-му курсу можно поставить "4-", поскольку делали первые шаги, но никак не мне :-)