|
v7: Прямой запрос (Класс "Прямой запрос") с периодичностью "НЕДЕЛЯ" | ☑ | ||
---|---|---|---|---|
0
Dolly_EV
12.04.13
✎
11:49
|
Задача - сформировать табличку по остаткам/оборотам за период вот такого вида:
Год|Месяц|НомерНедели|Товар|НачОст|Приход|Продано|Прочее имеется запрос: ТекстЗапроса =" |ВЫБРАТЬ | ЛЕВО(РегПартОО.НачалоПериода,4) КАК Год | ,СРЕД(РегПартОО.НачалоПериода,5,2) КАК Месяц | ,РегПартОО.НачалоПериода КАК [Неделя $Дата] | ,СОКРП($СпрНом.Код) КАК [ТоварКод $Строка] | ,СОКРП($СпрНом.Наименование) КАК [ТоварИмя $Строка] | ,$СпрАлк.Емкость КАК [ТоварЕмкость $Число.5.3] | ,РегПартОО.КоличествоНачальныйОстаток КАК [КолНачОст $Число.19.3] | ,РегПартОО.КоличествоПриход КАК [КолПриход $Число.19.3] | ,РегПартОО.КоличествоРасход КАК [КолРасход $Число.19.3] | ,РегПартОО.КоличествоКонечныйОстаток КАК [КонОст $Число.19.3] |ИЗ | $РегистрОстаткиОбороты.ПартииТоваров(:лНачДата,:лКонДата~,Неделя ДОПОЛНЕНИЕ,ДвиженияИГраницыПериода | ,(1=1 И 3=3 И 4=4) | ,(Товар) | ,(Количество)) КАК РегПартОО |ЛЕВОЕ СОЕДИНЕНИЕ | Справочник.Номенклатура КАК СпрНом $nolock |ПО | $СпрНом.ТекущийЭлемент = РегПартОО.Товар |ЛЕВОЕ СОЕДИНЕНИЕ | Справочник.АлкНоменклатура КАК СпрАлк $nolock |ПО | $СпрАлк.Товар = $СпрНом.ТекущийЭлемент"; Все прекрасно, но в числовых показателях требуется подразбить суммы в зависимости от вида документа (операции) - в "Приход" - чистый приход, в "Продано" - за минусом возвратов, в "Прочее" - вся остальная движуха. Проблема в том, что в ВТ ОстаткиОбороты при периодичности не "ДОКУМЕНТ" соответственно нет поля ВидДокумента... Вопрос: Как решить задачу с наименьшими затратами? |
|||
1
Dolly_EV
12.04.13
✎
12:17
|
Решение через итз и ее перебор и группировку/индексы не предлагать - оно есть. Вопрос хочу решить красиво, прямым запросом, "зАраз"
|
|||
2
МихаилМ
12.04.13
✎
12:22
|
свернуть понедельно самостоятельно.
|
|||
3
Dolly_EV
25.04.13
✎
15:38
|
АП.
По условиям задачи: "Данные предоставляются еженедельно в течение первого рабочего дня (как правило понедельника), следующего за отчетной неделей. Содержит обороты и остатки за каждую неделю каждого месяца по каждой SKU за последние 4 месяца, включая текущий. Разбивка осуществляется для каждой недели каждого месяца. Если неделя принадлежит двум месяцам, то данные разбиваются на 2 части: с начала недели до конца месяца и с начала следующего месяца до конца недели." Т.е. в итоге оказалось проще сначала собрать периоды, и учесть разрывы недель, а потом под периоды тянуть данные |
|||
4
Dolly_EV
25.04.13
✎
15:38
|
Получился вот такой код:
//** ОСТАТКИ+ДВИЖУХА ** тзПрод=СоздатьОбъект("ТаблицаЗначений"); тзПрод.НоваяКолонка("Год","Число",4,0); тзПрод.НоваяКолонка("Месяц","Число",2,0); тзПрод.НоваяКолонка("Неделя","Число",2,0); тзПрод.НоваяКолонка("НачПериода","Дата"); тзПрод.НоваяКолонка("КонПериода","Дата"); тзПрод.НоваяКолонка("КолНачОст","Число",19,2); тзПрод.НоваяКолонка("КолПриход","Число",19,2); тзПрод.НоваяКолонка("КолРасход","Число",19,2); тзПрод.НоваяКолонка("КолКонОст","Число",19,2); Для сч=НачДата По КонДата-1 Цикл Если (НомерДняНедели(сч)<>1) И (сч<>НачДата) Тогда Продолжить; КонецЕсли; счКон=Мин(КонДата-1,сч+(7-НомерДняНедели(сч))); Если (ДатаГод(сч)<>ДатаГод(счКон)) ИЛИ (ДатаМесяц(сч)<>ДатаМесяц(счКон)) Тогда тзПрод.НоваяСтрока(); тзПрод.Год=ДатаГод(сч); тзПрод.Месяц=ДатаМесяц(сч); тзПрод.Неделя=НомерНеделиГода(сч); тзПрод.НачПериода=сч; тзПрод.КонПериода=КонМесяца(сч); тзПрод.НоваяСтрока(); тзПрод.Год=ДатаГод(счКон); тзПрод.Месяц=ДатаМесяц(счКон); тзПрод.Неделя=НомерНеделиГода(счКон); тзПрод.НачПериода=НачМесяца(счКон); тзПрод.КонПериода=счКон; Продолжить; КонецЕсли; тзПрод.НоваяСтрока(); тзПрод.Год=ДатаГод(сч); тзПрод.Месяц=ДатаМесяц(сч); тзПрод.Неделя=НомерНеделиГода(сч); тзПрод.НачПериода=сч; тзПрод.КонПериода=счКон; КонецЦикла; ПЗ = СоздатьОбъект("ПрямойЗапрос"); ПЗ.БухгалтерскийУчет = 0; ПЗ.ОперативныйУчет = 1; ПЗ.ПериодическиеЗначения = 0; ПЗ.РежимОтладки = 0; //ПЗ.УложитьТаблицуЗначений(тзПрод,"#тзПер"); ТекстЗапросаОстатки =" |ВЫБРАТЬ | :лГод КАК Год | ,:лМесяц КАК Месяц | ,:лНеделя КАК Неделя | ,:лНачДата КАК [НачПериода $Дата] | ,:лКонДата КАК [КонПериода $Дата] | ,РегПартОО.Товар КАК [Товар $Справочник.Номенклатура] | ,СОКРП($СпрНом.Код) КАК ТоварКод | ,СОКРП($СпрНом.Наименование) КАК ТоварИмя | ,$СпрАлк.Емкость КАК [ТоварЕмкость $Число.5.3] | ,РегПартОО.КоличествоНачальныйОстаток КАК КолНачОст | ,0 КАК КолПриход | ,0 КАК КолРасход | ,0 КАК КолПриходПНК | ,0 КАК КолРасходРНК | ,0 КАК КолВозврат | ,РегПартОО.КоличествоКонечныйОстаток КАК КолКонОст |ИЗ | $РегистрОстаткиОбороты.ПартииТоваров(:лНачДата,:лКонДата~,ПЕРИОД, | ,(1=1 И 3=3 И 4=4) | ,(Товар) | ,(Количество)) КАК РегПартОО |ЛЕВОЕ СОЕДИНЕНИЕ | Справочник.Номенклатура КАК СпрНом $nolock |ПО | $СпрНом.ТекущийЭлемент = РегПартОО.Товар |ЛЕВОЕ СОЕДИНЕНИЕ | Справочник.АлкНоменклатура КАК СпрАлк $nolock |ПО | $СпрАлк.Товар = $СпрНом.ТекущийЭлемент |УПОРЯДОЧИТЬ | $СпрНом.Наименование"; ТекстЗапросаОбороты =" |ВЫБРАТЬ | МАКСИМУМ(:лГод) КАК Год | ,МАКСИМУМ(:лМесяц) КАК Месяц | ,МАКСИМУМ(:лНеделя) КАК Неделя | ,МАКСИМУМ(:лНачДата) КАК [НачПериода $Дата] | ,МАКСИМУМ(:лКонДата) КАК [КонПериода $Дата] | ,РегПартОО.Товар КАК [Товар $Справочник.Номенклатура] | ,МАКСИМУМ(СОКРП($СпрНом.Код)) КАК ТоварКод | ,МАКСИМУМ(СОКРП($СпрНом.Наименование)) КАК ТоварИмя | ,МАКСИМУМ($СпрАлк.Емкость) КАК [ТоварЕмкость $Число.5.3] | ,0 КАК КолНачОст | ,СУММА(ВЫБОР КОГДА (РегПартОО.ВидДокумента<>:ВидДокумента.ПеремещениеТоваров И РегПартОО.ВидДокумента<>:ВидДокумента.ВозвратОтПокупателя) ТОГДА РегПартОО.КоличествоПриход ИНАЧЕ 0 КОНЕЦ) КАК КолПриход | ,СУММА(ВЫБОР КОГДА РегПартОО.ВидДокумента<>:ВидДокумента.ПеремещениеТоваров ТОГДА РегПартОО.КоличествоРасход ИНАЧЕ 0 КОНЕЦ) КАК КолРасход | ,СУММА(ВЫБОР КОГДА РегПартОО.ВидДокумента=:ВидДокумента.ПриходнаяНакладная ТОГДА РегПартОО.КоличествоПриход ИНАЧЕ 0 КОНЕЦ) КАК КолПриходПНК | ,СУММА(ВЫБОР КОГДА РегПартОО.ВидДокумента В (:ВидДокумента.РасходнаяНакладная,:ВидДокумента.РасходнаяРозница,:ВидДокумента.ЧекККМ) ТОГДА РегПартОО.КоличествоРасход ИНАЧЕ 0 КОНЕЦ) КАК КолРасходРНК | ,СУММА(ВЫБОР КОГДА РегПартОО.ВидДокумента=:ВидДокумента.ВозвратОтПокупателя ТОГДА РегПартОО.КоличествоПриход ИНАЧЕ 0 КОНЕЦ) КАК КолВозврат | ,0 КАК КолКонОст |ИЗ | $РегистрОбороты.ПартииТоваров(:лНачДата,:лКонДата~,ДОКУМЕНТ | ,(1=1 И 3=3 И 4=4) | ,(Товар) | ,(Количество)) КАК РегПартОО |ЛЕВОЕ СОЕДИНЕНИЕ | Справочник.Номенклатура КАК СпрНом $nolock |ПО | $СпрНом.ТекущийЭлемент = РегПартОО.Товар |ЛЕВОЕ СОЕДИНЕНИЕ | Справочник.АлкНоменклатура КАК СпрАлк $nolock |ПО | $СпрАлк.Товар = $СпрНом.ТекущийЭлемент |СГРУППИРОВАТЬ | РегПартОО.Товар |УПОРЯДОЧИТЬ | МАКСИМУМ($СпрНом.Наименование)"; //1. ОбъектМФ.Добавить("Справочник.Номенклатура","Товар","Номенклатура",""); //2. ОбъектМФ.Добавить("Справочник.Контрагенты","Клиент","Контрагенты",""); //3. ОбъектМФ.Добавить("Справочник.Проекты","Агент","Агенты (Проекты)",""); //4. ОбъектМФ.Добавить("Справочник.МестаХранения","Склад","Склады",""); //5. ОбъектМФ.Добавить("Справочник.Проекты","АгентЭТК","Агенты (ЭТК)",""); ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапросаОстатки,ПЗ,"Номенклатура","Товар",,1,1); ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапросаОбороты,ПЗ,"Номенклатура","Товар",,1,0); Если ВыбФирма.Выбран()=1 Тогда ТекстЗапросаОстатки=СтрЗаменить(ТекстЗапросаОстатки,"3=3","Фирма=:лФирма"); ТекстЗапросаОбороты=СтрЗаменить(ТекстЗапросаОбороты,"3=3","Фирма=:лФирма"); ПЗ.УстановитьТекстовыйПараметр("лФирма", ВыбФирма); КонецЕсли; ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапросаОстатки,ПЗ,"Склады","Склад",,4,1); ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапросаОбороты,ПЗ,"Склады","Склад",,4,0); //to do: //ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапроса,ПЗ,"По контрагентам","$РегПарт.Покупатель",,3,1); //ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапроса,ПЗ,"По агентам","$РегПарт.Проект",,4,1); тзПрод_=СоздатьОбъект("ИндексированнаяТаблица"); тзПрод.ВыбратьСтроки(); Пока тзПрод.ПолучитьСтроку()=1 Цикл Сообщить(""+тзПрод.НомерСтроки+",Неделя: "+тзПрод.Неделя+",Период: "+Строка(тзПрод.НачПериода)+" - "+Строка(тзПрод.КонПериода)); ПЗ.УстановитьТекстовыйПараметр("лГод", тзПрод.Год); ПЗ.УстановитьТекстовыйПараметр("лМесяц", тзПрод.Месяц); ПЗ.УстановитьТекстовыйПараметр("лНеделя", тзПрод.Неделя); ПЗ.УстановитьТекстовыйПараметр("лНачДата", тзПрод.НачПериода); ПЗ.УстановитьТекстовыйПараметр("лКонДата", тзПрод.КонПериода); тзДок=ПЗ.Выполнить(,ТекстЗапросаОстатки); тзПрод_.Объединить(тзДок); тзДок=ПЗ.Выполнить(,ТекстЗапросаОбороты); тзПрод_.Объединить(тзДок); КонецЦикла; СтрСвертки="Год,Месяц,Неделя,НачПериода,КонПериода,Товар,ТоварКод,ТоварИмя,ТоварЕмкость"; СтрСумм="КолНачОст,КолПриход,КолРасход,КолПриходПНК,КолРасходРНК,КолВозврат,КолКонОст"; тзПрод_.Свернуть(СтрСвертки,СтрСумм); тзПрод_.Сортировать("Товар,Год,Месяц,Неделя"); тзПрод_.НоваяКолонка("КолПродано"); тзПрод_.НоваяКолонка("КолПрочее"); тзПрод_.ВыбратьСтроки(); Пока тзПрод_.ПолучитьСтроку()=1 Цикл тзПрод_.КолПродано=тзПрод_.КолРасходРНК-тзПрод_.КолВозврат; тзПрод_.КолПрочее=тзПрод_.КолПриход-тзПрод_.КолПриходПНК-(тзПрод_.КолРасход-тзПрод_.КолРасходРНК); //** проверка арифметики: //Ostatok + Prihod - Prodano + Prochee = Остаток на конец отчетного периода. _Проверка = тзПрод_.КолНачОст+тзПрод_.КолПриходПНК-тзПрод_.КолПродано+тзПрод_.КолПрочее; Если _Проверка<>тзПрод_.КолКонОст Тогда ТЗОшибок.НоваяСтрока(); ТЗОшибок.ТипВидОбъекта = "Справочник.Номенклатура"; ТЗОшибок.Объект = тзПрод_.Товар; ТЗОшибок.Ошибка = "не сходится арифметика (№ недели: "+тзПрод_.Неделя+")"; Сообщить("АРИФМЕТИКА: "+Строка(тзПрод_.Товар)+" месяц: "+Строка(тзПрод_.Месяц)+" неделя: "+Строка(тзПрод_.Неделя),"!"); Сообщить(" |->НачОст:"+тзПрод_.КолНачОст+" Прих:"+тзПрод_.КолПриходПНК+" Продано:"+тзПрод_.КолПродано+" Прочее:"+тзПрод_.КолПрочее+" КонОст:"+тзПрод_.КолКонОст+" ПРОВЕРКА:"+Строка(_Проверка-тзПрод_.КолКонОст),"!"); КонецЕсли; ФайлВыгр.Добавить(); ФайлВыгр.УстановитьЗначениеПоля("TICKER",СокрП(DistribID)); ФайлВыгр.УстановитьЗначениеПоля("Year",тзПрод_.Год); ФайлВыгр.УстановитьЗначениеПоля("Month",тзПрод_.Месяц); ФайлВыгр.УстановитьЗначениеПоля("Week",тзПрод_.Неделя); ФайлВыгр.УстановитьЗначениеПоля("SKU_ID",тзПрод_.ТоварКод); ФайлВыгр.УстановитьЗначениеПоля("SKU_Name",тзПрод_.ТоварИмя); ФайлВыгр.УстановитьЗначениеПоля("Cap",тзПрод_.ТоварЕмкость); ФайлВыгр.УстановитьЗначениеПоля("Ostatok",тзПрод_.КолНачОст); ФайлВыгр.УстановитьЗначениеПоля("Prihod",тзПрод_.КолПриходПНК); ФайлВыгр.УстановитьЗначениеПоля("Prodano",тзПрод_.КолПродано); ФайлВыгр.УстановитьЗначениеПоля("Prochee",тзПрод_.КолПрочее); КонецЦикла; Сообщить("Готово!","iii"); |
|||
5
Ёпрст
25.04.13
✎
15:40
|
какя знакомая постановка задачи..нам тоже такую шляпу шлют постоянно
|
|||
6
Mikeware
25.04.13
✎
15:40
|
Зачем тебе тут виртуальная таблица?
считай по реальной! |
|||
7
Ёпрст
25.04.13
✎
15:41
|
Синергия поди какая-нить ?
|
|||
8
Ёпрст
25.04.13
✎
15:43
|
Ну и я считал тупо так - табличка с периодами + соедиение с запросом:
начОст на начало периода + Приход и Расход по периодичности таблички останков.. Усё собственно. На выходе тупо считается конОст при обходе результата запроса. усё |
|||
9
Mikeware
25.04.13
✎
15:44
|
(5) причем каждый поставщик - свое изобретает.
получали бы через EDI, и не факали мозг, урродыбл... |
|||
10
Dolly_EV
25.04.13
✎
15:44
|
(5) ну дык братья-алкоголики))) да, Синергия
(8) вот-вот! пытался сделать одним запросом и вложенным запросом ПЗ.УложитьТаблицуЗначений(тзПрод,"#тзПер"); потом "ВЫБРАТЬ из тзПер..." и вложенный типа (ВЫБРАТЬ ... |ИЗ | $РегистрОбороты.ПартииТоваров(тзПер.НачПериода,тзПер.КонПериода~,ДОКУМЕНТ.. но вложенный в упор не хочет видеть колонки тз верхнего запроса... хотя почитал про SQL/SQLite - понимать должен вложенный запрос поля из верхнего |
|||
11
Dolly_EV
25.04.13
✎
15:46
|
(6) Останки - проще из виртуальной выбрать, а обороты да, из реальной, но не суть. Не смог я все это в запросе с тзПериодов уложенной соединить :-(
|
|||
12
Mikeware
25.04.13
✎
15:51
|
(11) отпрофилируй запрос к ВТ ОстаткиОбороты с группировкой день, добавь вывод номера недели
и вместо группировки День сделай группировку по неделе. |
|||
13
Dolly_EV
25.04.13
✎
15:56
|
(12) И как внутри анализировать, где разрыв недели?
Ты лучше пни, как соединить уложенную тз с Периодами и запрос к регистру, чтобы Запрос к регистру был вложенный и брал Нач/Кон периода из вышестоящегО?... мне это уже просто для общего развития, конкретно эта задача решена, ошибок нет, скорость вполне достаточна и идет на этом Синергия лесом. |
|||
14
Mikeware
25.04.13
✎
15:58
|
(13) datepart(wk, )
|
|||
15
Ёпрст
25.04.13
✎
16:00
|
(10) ну на вот, для дбф
ТзПериодов = СоздатьОбъект("ТаблицаЗначений"); ТзПериодов.НоваяКолонка("ДатаНачала","Дата"); ТзПериодов.НоваяКолонка("ДатаКонца","Дата"); НачалоПериода = ДобавитьМесяц(КонДата,-4); НачалоПериода = Макс(НачМесяца(НачалоПериода),НачНедели(НачалоПериода)); КонецПериода = Мин(КонНедели(НачалоПериода),КонМесяца(НачалоПериода)); ТзПериодов.НоваяСтрока(); ТзПериодов.ДатаНачала = НачалоПериода; ТзПериодов.ДатаКонца = КонецПериода; Пока КонецПериода<КонДата Цикл НачалоПериода=КонецПериода+1; НачалоПериода = Макс(НачМесяца(НачалоПериода),НачНедели(НачалоПериода)); КонецПериода = Мин(КонНедели(НачалоПериода),КонМесяца(НачалоПериода)); ТзПериодов.НоваяСтрока(); ТзПериодов.ДатаНачала = НачалоПериода; ТзПериодов.ДатаКонца = КонецПериода; КонецЦикла; база.УложитьТЗ(ТзПериодов,"ТабПериодов"); //останки и обороты по периодам ТекстЗапроса = " |Select | ТабПериодов.ДатаНачала [ДатаНачала $Дата] | ,ТабПериодов.ДатаКонца [ДатаКонца $Дата] | ,Спр.descr Наименование | ,Спр.IDD IDD | ,Рег.МОЛ [МОЛ $Справочник.ФизЛица] | ,Алко.Емкость [Емкость :Число] | ,SUM(Рег.НачОст) [Ostatok $Число] | ,SUM(Рег.Поступление) [Prihod $Число] | ,SUM(Рег.Реализация-Рег.Возврат) [Prodano $Число] | ,SUM(Рег.Приход-Рег.Поступление-Рег.Расход+Рег.Реализация-Рег.Возврат) [Prochee $Число] |from ТабПериодов |left join | ( | SELECT | | Итоги.Номенклатура Номенклатура | ,Итоги.МОЛ МОЛ | ,:Дата1 Период | ,Итоги.Количество НачОст | ,0 Приход | ,0 Расход | ,0 Поступление | ,0 Реализация | ,0 Возврат | FROM | [РегистрИтоги.ПартииНаличие] as Итоги | | WHERE | Итоги.period = :ПредПериод | UNION ALL | SELECT | Движения.Номенклатура | ,Движения.МОЛ | ,:Дата1 | ,Движения.Количество * (1 - Движения.debkred * 2) | ,0 | ,0 | ,0 | ,0 | ,0 | FROM | [Регистр.ПартииНаличие] AS Движения | WHERE | Движения.date BETWEEN :НачПериод And :КонПериод | --движуха приход/расход | UNION ALL | SELECT | Движения2.Номенклатура | ,Движения2.МОЛ | ,Движения2.date | ,0 | ,Движения2.Количество*(1-Движения2.Debkred) --приход | ,Движения2.Количество*Движения2.Debkred --расход | ,case when Движения2.КодОперации = :ОперацияПоступление then | Движения2.Количество else 0 end | ,case when Движения2.КодОперации = :ОперацияПродажа then | Движения2.Количество else 0 end | ,case when Движения2.КодОперации = :ОперацияВозврат then | Движения2.Количество else 0 end | FROM | [Регистр.ПартииНаличие] AS Движения2 | WHERE | Движения2.date BETWEEN :Дата1 And :Дата2 | and Движения2.КодОперации <> :ОперацияПеремещение | ) Рег on Рег.Период between ТабПериодов.ДатаНачала and ТабПериодов.ДатаКонца | Left join [Справочник.Номенклатура] Спр on Спр.id = Рег.Номенклатура | Left join [Справочник.ТоварАлко] Алко On Алко.Id = Спр.АлкоСвойство | Where 1=1 and 2=2 |Group by Спр.descr,Спр.IDD,ТабПериодов.ДатаНачала,ТабПериодов.ДатаКонца,Алко.Емкость |"; НомСтроки = 0; НомКолонки = 0; Если ТаблицаМФ.НайтиЗначение("Номенклатура", НомСтроки, НомКолонки) = 1 Тогда Если ТаблицаМФ.ПолучитьЗначение(НомСтроки, "ФлВкл") = 2 Тогда Список = СоздатьОбъект("СписокЗначений"); ТаблицаМФ.ПолучитьЗначение(НомСтроки,"СписокЭлементов").Выгрузить(Список); база.УложитьОбъекты(Список,"ВыбНоменклатура",0,"Номенклатура"); ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"1=1"," | Where Рег.Номенклатура "+?(ТаблицаМФ.ПолучитьЗначение(НомСтроки,"ТипМФ")=1,""," NOT")+" IN (SELECT val FROM ВыбНоменклатура)"); КонецЕсли; КонецЕсли; НомСтроки = 0; НомКолонки = 0; Если ТаблицаМФ.НайтиЗначение("МОЛ", НомСтроки, НомКолонки) = 1 Тогда Если ТаблицаМФ.ПолучитьЗначение(НомСтроки, "ФлВкл") = 2 Тогда Список = СоздатьОбъект("СписокЗначений"); ТаблицаМФ.ПолучитьЗначение(НомСтроки,"СписокЭлементов").Выгрузить(Список); база.УложитьОбъекты(Список,"ВыбМОЛ",0,"ФизЛица"); ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"2=2"," | "+?(ЕстьWhere = 0,"Where","and")+" Рег.МОЛ "+?(ТаблицаМФ.ПолучитьЗначение(НомСтроки,"ТипМФ")=1,""," NOT")+" IN (SELECT val FROM ВыбМОЛ)"; КонецЕсли; КонецЕсли; мд = СоздатьОбъект("MetaDataWork"); нДата = ТзПериодов.ПолучитьЗначение(1,"ДатаНачала"); НачПериод = мд.ПолучитьНачПериода(нДата);//начало периода ПредПериод = мд.ПолучитьНачПериода(НачПериод-1);//предыдущее начало периода останков Запрос.Подставлять("ОперацияПоступление",глко.Закупка); Запрос.Подставлять("ОперацияПродажа",глко.Продажа); Запрос.Подставлять("ОперацияВозврат",глко.ВозвратОтПокупателя); Запрос.Подставлять("ОперацияПеремещение",глко.Перемещение); Запрос.Подставлять("ПредПериод",ПредПериод); Запрос.Подставлять("НачПериод",НачПериод); Запрос.Подставлять("КонПериод",нДата-1);//для вычисления НачОст Запрос.Подставлять("Дата1",нДата); Запрос.Подставлять("Дата2",КонДата); ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса); Файл = создатьОбъект("XBASE"); //создаем ссылку на файл DBF Файл.КодоваяСтраница(0); Файл.ДобавитьПоле("TICKER","S",20,0); Файл.ДобавитьПоле("Year","N",4,0); Файл.ДобавитьПоле("Month","N",2,0); Файл.ДобавитьПоле("Week","N",2,0); Файл.ДобавитьПоле("SKU_ID","S",17,0); Файл.ДобавитьПоле("SKU_Name","S",150,0); Файл.ДобавитьПоле("Cap","N",5,3); Файл.ДобавитьПоле("Ostatok","N",20,0); Файл.ДобавитьПоле("Prihod","N",20,0); Файл.ДобавитьПоле("Prodano","N",20,2); Файл.ДобавитьПоле("Prochee","N",20,0); Каталог = СокрЛП(Путь); Если ПустаяСтрока(Каталог)=1 Тогда Каталог = КаталогПользователя(); КонецЕсли; ИмяФайла = СокрЛП(Тикер)+Формат(ДатаЧисло(КонДата),"Ч(0)2")+Формат(ДатаМесяц(КонДата),"Ч(0)2")+"S.dbf"; СписокОтправки.УдалитьВсе(); Файл.СоздатьФайл(Каталог + "\"+ИмяФайла); //создаем файл физически СписокОтправки.ДобавитьЗначение(Каталог + "\"+ИмяФайла); ВыбНоменклатура=""; НачОстаток=0; ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Если ВыбНоменклатура<>ТЗ.IDD Тогда ВыбНоменклатура = ТЗ.IDD; НачОстаток = ТЗ.Ostatok; КонецЕсли; Файл.Добавить(); Файл.TICKER = СокрЛП(Тикер); Файл.Year = ДатаГод(ТЗ.ДатаНачала); Файл.Month = ДатаМесяц(ТЗ.ДатаНачала); Файл.Week = НомерНеделиГода(ТЗ.ДатаНачала); Файл.SKU_ID = ТЗ.IDD; Файл.SKU_Name = ТЗ.Наименование; Файл.Cap = ТЗ.Емкость; Файл.Ostatok = НачОстаток; Файл.Prihod = ТЗ.Prihod; Файл.Prodano = ТЗ.Prodano; Файл.Prochee = ТЗ.Prochee; НачОстаток = НачОстаток+ТЗ.Prihod-ТЗ.Prodano+ТЗ.Prochee; Файл.Записать(); КонецЦикла; Файл.ЗакрытьФайл(); Сообщить("записан файл "+Каталог + "\"+ИмяФайла); |
|||
16
Mikeware
25.04.13
✎
16:00
|
корелированый запрос, не?
|
|||
17
Ёпрст
25.04.13
✎
16:00
|
ну там ёмкость и код - свою воткнешь..
|
|||
18
Dolly_EV
25.04.13
✎
16:08
|
(15) Воооооооооот!
у тебя тоже )Рег on Рег.Период between ТабПериодов.ДатаНачала and ТабПериодов.ДатаКонца т.е. вложенный не видит напрямую ТабПериодов.ДатаНачала/ДатаКонца, а делается за весь период и далее группирповка по датам. (16) Да оне самые! http://msdn.microsoft.com/ru-ru/library/ms187638(v=sql.105).aspx вот нихера не выходит каменный цветок на 1С :-( |
|||
19
Dolly_EV
25.04.13
✎
16:11
|
Т.е. я хочу перебрать ТабПериодов.Неделя и чтобы вложенный запрос к регистру выполнился столько раз, сколько строк в ТабПериодов и сформировался согласно параметрам ТабПериодов.ДатаНачала / ТабПериодов.ДатаКонца
|
|||
20
Ёпрст
25.04.13
✎
16:13
|
(18) тебе коррелированный что ли надо ?
А занафига ? |
|||
21
Mikeware
25.04.13
✎
16:15
|
+(20) проще при постобработке запоминать значение предыдущей строки.
|
|||
22
Dolly_EV
25.04.13
✎
17:12
|
(20) "А занафига?" - чтоб знать и понимать, как пользоваться
|
|||
23
Dolly_EV
25.04.13
✎
17:14
|
+(19) "я хочу перебрать ТабПериодов.Неделя" - в запросе перебрать!
|
|||
24
Ёпрст
25.04.13
✎
17:15
|
Ну так и передавай строки из первого запроса в лефт джоин в качестве параметра( Только с ВТ такой фокус не получится, это раз, для вычисления границ для получения останков нужно будет писать свою функцию, это два)
|
|||
25
Dolly_EV
25.04.13
✎
17:16
|
(24) ну я так и понял, что фокус не удался как раз из-за ВТ :-( ясно. Спасибо!
|
|||
26
Dolly_EV
25.04.13
✎
17:30
|
(24) а как SQL/SQlite вообще понимает "кореллированность"? Т.е. что надо выполнять вложенный на каждую итерацию в верхнем? по наличию полей верхнего запроса во вложенном?
|
|||
27
Dolly_EV
25.04.13
✎
18:00
|
"коррелированность"
|
|||
28
Ёпрст
25.04.13
✎
18:03
|
(26) не совсем, тебе надо будет делать коррелированный подзапрос
|
|||
29
Ёпрст
25.04.13
✎
18:03
|
а так, да, для каждой строки будет свой подзапрос
|
|||
30
Ёпрст
25.04.13
✎
18:08
|
Грубо говоря, у тебя будет так:
|Select | ТабПериодов.ДатаНачала [ДатаНачала $Дата] | ,ТабПериодов.ДатаКонца [ДатаКонца $Дата] | (select что-то одно значение from ... where что-то =ТабПериодов.ДатаНачала )as Остаток, ........... |from ТабПериодов |
|||
31
Dolly_EV
25.04.13
✎
18:23
|
30 т.е. как и склоняют неявно в мсдн - ТабПериодов.ДатаНачала поймется только в WHERE?
|
|||
32
Ёпрст
25.04.13
✎
18:24
|
не только - где угодно в подзапросе
|
|||
33
Dolly_EV
25.04.13
✎
18:26
|
(32) ограничение - только ВТ?
|
|||
34
Ёпрст
25.04.13
✎
18:27
|
(33) в ВТ ты не можешь подставлять динамически параметры, ибо ВТ в скуле развернётся в обычный подзапрос..
|
|||
35
Dolly_EV
25.04.13
✎
18:30
|
|Select
| ТабПериодов.ДатаНачала [ДатаНачала $Дата] | ,ТабПериодов.ДатаКонца [ДатаКонца $Дата] | (select что-то одно значение from ... where что-то =ТабПериодов.ДатаНачала )as Остаток, ........... |from ТабПериодов |
|||
36
Dolly_EV
25.04.13
✎
18:36
|
вот так можно?
|Select | ТабПериодов.ДатаНачала [ДатаНачала $Дата] | ,ТабПериодов.ДатаКонца [ДатаКонца $Дата] | ,Рег.Что-то... |from ТабПериодов |left join (select что-то МНОГО значений from ... where что-то =ТабПериодов.ДатаНачала ) as Рег | не, нельзя, понял... почти))) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |