Продолжаю писать прямые запросы на SQL параллельно разбираясь с самим SQL возникают вопросы:
Пишу: База = СоздатьОбъект("OLEDBData"); Соединение=" |Provider=VFPOLEDB.1; // |Deleted=Yes; |Null = Yes; |Exclusive = No; |SourceType = DBF; |Data Source=" + КаталогИБ() + "; |Mode=ReadWrite; |Extended Properties=""""; |User ID=""""; |Password=""""; |Mask Password=False; |Collating Sequence=MACHINE; |DSN=""""";
Рез = База.Соединение(Соединение); Запрос = База.СоздатьКоманду(); стрЭтапы=""; для фф=1 по спФильтрЭтапы.РазмерСписка() цикл Если фф=1 тогда значение1=спФильтрЭтапы.получитьЗначение(фф); стрЭтапы=стрЭтапы+",:значение1"; Запрос.УстановитьТекстовыйПараметр("значение1", значение1); ИначеЕсли фф=2 тогда значение2=спФильтрЭтапы.получитьЗначение(фф); стрЭтапы=стрЭтапы+",:значение2"; Запрос.УстановитьТекстовыйПараметр("значение2", значение2); ИначеЕсли фф=3 тогда значение3=спФильтрЭтапы.получитьЗначение(фф); стрЭтапы=стрЭтапы+",:значение3"; Запрос.УстановитьТекстовыйПараметр("значение3", значение3); ИначеЕсли фф=4 тогда значение4=спФильтрЭтапы.получитьЗначение(фф); стрЭтапы=стрЭтапы+",:значение4~"; Запрос.УстановитьТекстовыйПараметр("значение4", значение4); КонецЕсли; КонецЦикла; стрЭтапы=прав(стрЭтапы,стрДлина(стрЭтапы)-1); ВыбДата=ТекущаяДата(); ТекстЗапроса=" |SELECT | Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура], | Рег.Ном as [Ном $Число], | Рег.Этап as [Этап $Перечисление.Этапы], | Рег.ДокументДвижения as [ДокументДвижения $Документ.МесячныйПлан], | Рег.План as [План $Документ.ФормированиеЗаказа1], | SUM(Рег.КоличествоОстаток) as Количество |FROM | (SELECT | $Р.Ном as Ном, | $Р.Этап as Этап, | $Р.Продукция as Номенклатура, | $Р.ДокументДвижения AS ДокументДвижения, | $Р.План as План, | $Р.Количество AS КоличествоОстаток | FROM | $РегистрИтоги.ДвижениеПродукции as Р | WHERE | (period = :ПредМесяц~~) | AND ($Р.Количество>0) | | UNION ALL | | SELECT | $Р.Ном as Ном, | $Р.Этап as Этап, | $Р.Продукция as Номенклатура, | $Р.ДокументДвижения AS ДокументДвижения, | $Р.План as План, | $Р.Количество * (1 - Р.debkred * 2) AS КоличествоОстаток | FROM | $Регистр.ДвижениеПродукции AS Р | INNER JOIN | 1sjourn jr ON Р.iddoc = jr.iddoc | AND (jr.date BETWEEN :НачалоМесяца~~ AND :ПредДата~~) | AND ($ФлагРегистра.ДвижениеПродукции = 1) | ) Рег |WHERE | (Рег.План=:Заказ~) | AND (Рег.Этап IN ("+стрЭтапы+"))"; |GROUP BY | Рег.Номенклатура"; Запрос. УстановитьТекстовыйПараметр ("НачалоМесяца", НачМесяца(ВыбДата)); Запрос. УстановитьТекстовыйПараметр ("ПредДата", ВыбДата-1); Запрос. УстановитьТекстовыйПараметр ("ПредМесяц", НачМесяца(ДобавитьМесяц(ВыбДата,-1))); Запрос. УстановитьТекстовыйПараметр ("Заказ", Заказ); Запрос.Отладка(1); ТзДокументов=Запрос.ВыполнитьИнструкцию(ТекстЗапроса); ТзДокументов.Загрузить(ТзДокументов);
выдает в отладку:
Рег.Этап as [Этап_1c_type_Перечисление_Этапы], Рег.ДокументДвижения as [ДокументДвижения_1c_type_Документ_МесячныйПлан], Рег.План as [План_1c_type_Документ_ФормированиеЗаказа1], SUM(Рег.КоличествоОстаток) as Количество FROM (SELECT Р.sp27244 as Ном, Р.sp26448 as Этап, Р.sp26447 as Номенклатура, Р.sp26459 AS ДокументДвижения, Р.sp26449 as План, Р.sp26451 AS КоличествоОстаток FROM rg26452 as Р WHERE (period = {d '2008-09-01'}) AND (Р.sp26451>0)
UNION ALL
SELECT Р.sp27244 as Ном, Р.sp26448 as Этап, Р.sp26447 as Номенклатура, Р.sp26459 AS ДокументДвижения, Р.sp26449 as План, Р.sp26451 * (1 - Р.debkred * 2) AS КоличествоОстаток FROM ra26452 AS Р INNER JOIN 1sjourn jr ON Р.iddoc = jr.iddoc AND (jr.date BETWEEN {d '2008-10-01'} AND {d '2008-10-06'}) AND (rf26452 = 1) ) Рег WHERE (Рег.План=' KXK 5X33 ') AND (Рег.Этап IN (' L08 ',' L2L ',' L06 ',' KEM L07 '))
пишет ошибку:
ТзДокументов=Запрос.ВыполнитьИнструкцию(ТекстЗапроса); {D:\LIBR\ОБРАБОТКИ\МОИ\ПЛАНИРОВАНИЕ\НАВИГАТОРНОВЫЙ.ERT(1232)}: FAILED! ICommandText::Execute(): SQL: GROUP BY clause is missing or invalid.
|