Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Группировка с разверткой по документам (число прочтений - 3086 )
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Группировка с разверткой по документам
11. Июня 2008 :: 07:33
Печать  
Делаю выборку по остаткам товаров с разверткой по документам:

     

|FROM д),(Количество)) as Рег

Далее группирую по товару, складу, позиции документа с использованием WITH ROLLUP.

Как мне получить правильные остатки на начало и на конец по группам?

Т.е., к примеру, ситуация такая:

ОстНаНачало=0
Тов1 Склад1 Док1 приход 2 (ОстНаНачало=0)
Тов1 Склад1 Док2 приход 1 (ОстНаНачало=2)
Тов1 Склад1 Док3 расход 1 (ОстНаНачало=3)

По логике вещей, если брать итог по Тов1, то остаток на начало в целом должен быть=0, а запрос все суммирует и выдает 5.

То же самое и с остатком на конец. Как выйти из этой ситуации?  Очень довольный


  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Группировка с разверткой по документам
Ответ #1 - 11. Июня 2008 :: 08:26
Печать  
Neo писал(а) 11. Июня 2008 :: 07:33:
Как мне получить правильные остатки на начало и на конец по группам?

В учебнике есть примерчик использования группировок с ключевым словом WITH ROLLUP
и там в блоке SELECT добавлены группировочные переменные, на подобии:
Код
Выбрать все
GROUPING(РегП.Склад) ГрМаг 



а по каким полям группируешь?
желательно, увидеть запрос полностью.

  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Группировка с разверткой по документам
Ответ #2 - 11. Июня 2008 :: 08:44
Печать  
     ТекстЗапроса="
     |SELECT
     |Max(ВложЗапрос1.Код) as Код,
     |ВложЗапрос1.Товар as [Товар $Справочник.Товары],
     |ВложЗапрос1.Склад as [Склад $Справочник.Склады],
     |ВложЗапрос1.ПозицияДокумента as [ПозицияДокумента],
     |Max(ВложЗапрос1.Док) as [Док $Документ],
     |Max(ВложЗапрос1.Док_вид) as [Док_вид],
     |Sum(ВложЗапрос1.НачКол) as НачКол,
     |Sum(РегПартии.КоличествоНачальныйОстаток) as НачКолП,
     |Sum(РегПартии.СуммаУпрНачальныйОстаток) as НачСтоимП,
     |Sum(ВложЗапрос1.ПриходКол) as ПриходКол,
     |Sum(РегПартии.КоличествоПриход) as ПриходКолП,
     |Sum(РегПартии.СуммаУпрПриход) as ПриходСтоимП,
     |Sum(ВложЗапрос1.РасходКол) as РасходКол,
     |Sum(РегПартии.КоличествоРасход) as РасходКолП,
     |Sum(РегПартии.СуммаУпрРасход) as РасходСтоимП,
     |Sum(ВложЗапрос1.КонКол) as КонКол,
     |Sum(РегПартии.КоличествоКонечныйОстаток) as КонКолП,
     |Sum(РегПартии.СуммаУпрКонечныйОстаток) as КонСтоимП,
     |GROUPING(ВложЗапрос1.Товар) as ИтПоТовару,
     |GROUPING(ВложЗапрос1.Склад) as ИтПоСкладу,
     |GROUPING(ВложЗапрос1.ПозицияДокумента) as ИтПоПозицииДока
     |FROM
     |(SELECT
     |Max(СпрТов.Code) as Код,
     |Рег.Товар as [Товар],
     |Рег.Склад as [Склад],
     |Рег.ПозицияДокумента as ПозицияДокумента,
     |Max(Жур.IDDOC) as [Док],
     |Max(Жур.IDDOCDEF) as Док_вид,
     |Sum(Рег.КоличествоНачальныйОстаток) as НачКол,
     |Sum(Рег.КоличествоПриход) as ПриходКол,
     |Sum(Рег.КоличествоРасход) as РасходКол,
     |Sum(Рег.КоличествоКонечныйОстаток) as КонКол
     |FROM
     ад),(Количество)) as Рег
     |LEFT JOIN
     |$Справочник.Товары as СпрТов With (NOLOCK) ON Рег.Товар=СпрТов.ID
     |LEFT JOIN
     |$Справочник.Склады as СпрСкл With (NOLOCK) ON Рег.Склад=СпрСкл.ID
     |INNER JOIN
     |_1SJOURN as Жур With (NOLOCK) ON Рег.ПозицияДокумента=Жур.DATE_TIME_IDDOC
     |GROUP BY Рег.Товар,Рег.Склад,Рег.ПозицияДокумента) as ВложЗапрос1
     |
     |LEFT JOIN
     личество,СуммаУпр)) as РегПартии
     |ON ВложЗапрос1.Товар=РегПартии.Товар AND ВложЗапрос1.ПозицияДокумента=РегПартии.ПозицияДокумента
     |";
     
     Проверк=0;
     Если ВыбТовар.Выбран()=1 Тогда
           Если Проверк>0 Тогда
                 ТекстЗапроса=ТекстЗапроса+" AND ";
           Иначе
                 ТекстЗапроса=ТекстЗапроса+ " WHERE ";
           КонецЕсли;
           Если ВыбТовар.ЭтоГруппа() = 1 Тогда
                 Recordset.УложитьСписокОбъектов(ВыбТовар,"#ВыбТовар","Товары");
                 ТекстЗапроса=ТекстЗапроса+"(ВложЗапрос1.Товар IN (SELECT Val FROM #ВыбТовар))";
                 Проверк=Проверк+1;
           Иначе
                 Recordset.УстановитьТекстовыйПараметр("ВыбТовар",ВыбТовар);
                 ТекстЗапроса=ТекстЗапроса+"ВложЗапрос1.Товар=:ВыбТовар";
                 Проверк=Проверк+1;
           КонецЕсли;
     КонецЕсли;
     
     Если ВыбСклад.Выбран()=1 Тогда
           Recordset.УстановитьТекстовыйПараметр("ВыбСклад",ВыбСклад);
           Если Проверк>0 Тогда
                 ТекстЗапроса=ТекстЗапроса+" AND ";
           Иначе
                 ТекстЗапроса=ТекстЗапроса+ " WHERE ";
           КонецЕсли;
           ТекстЗапроса=ТекстЗапроса+"ВложЗапрос1.Склад=:ВыбСклад";
           Проверк=Проверк+1;
     КонецЕсли;
     
     ТекстЗапроса=ТекстЗапроса+"
     |GROUP BY ВложЗапрос1.Товар,ВложЗапрос1.Склад,ВложЗапрос1.ПозицияДокумента WITH ROLLUP
     |ORDER BY ВложЗапрос1.Товар,ВложЗапрос1.Склад,ВложЗапрос1.ПозицияДокумента, ИтПоТовару DESC, ИтПоСкладу DESC, ИтПоПозицииДока DESC
     |";
     
     Recordset.УстановитьТекстовыйПараметр("ДатаНач",ДатаНач);
     Recordset.УстановитьТекстовыйПараметр("ДатаКон",ДатаКон);
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Группировка с разверткой по документам
Ответ #3 - 11. Июня 2008 :: 08:47
Печать  
По стоимости можно даже и не смотреть, для начала хочу разобраться с количеством, то есть, тем, что извлекается в $РегистрОстаткиОбороты.ОстаткиТоваров...
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Группировка с разверткой по документам
Ответ #4 - 11. Июня 2008 :: 09:00
Печать  
Я вот подумал, может GROUPING внести во ВложЗапрос1, тогда он правильно будет остатки на начало и конец считать?  Нерешительный
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Группировка с разверткой по документам
Ответ #5 - 11. Июня 2008 :: 09:02
Печать  
Эта вещь - ROOLLUP - умеет правильно работать с обортами в принципе, или она всегда тупо суммирует по группам?
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Группировка с разверткой по документам
Ответ #6 - 11. Июня 2008 :: 09:10
Печать  
Код
Выбрать все
	|ORDER BY ВложЗапрос1.Товар,ИтПоТовару desc,
		    |ВложЗапрос1.Склад, ИтПоСкладу DESC, ВложЗапрос1.ПозицияДокумента, ИтПоПозицииДока DESC
	|"; 



вот так должно работать
Итог по всем будет 1-й строкой и значения всех группировочных переменных будет 1
для строк по документам значения группир переменных будет 0

Мне ИМХОется, что у тебя с порядком группировок не лады. У тебя разве в документе может быть много складов? Не лучше ли применить: Склад-Товар-Документ?
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Группировка с разверткой по документам
Ответ #7 - 11. Июня 2008 :: 09:13
Печать  
А разве изменение порядка сортировки может как-то повлиять на результат вычислений?  Озадачен
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Группировка с разверткой по документам
Ответ #8 - 11. Июня 2008 :: 09:15
Печать  
>>> Итог по всем будет 1-й строкой и значения всех группировочных переменных будет 1 для строк по документам значения группир переменных будет 0

- Ну оно так у меня и есть. Просто сам итог по количеству есть простая сумма всех остатков на начало по всем документам, а не остаток на начало по нужному товару и складу...
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Группировка с разверткой по документам
Ответ #9 - 11. Июня 2008 :: 09:20
Печать  
Короче, пока возникло лишь две идеи:

1.Попробовать внести GROUPING  во ВложЗапрос1... если не прокатит, то:
2. Сделать еще один вложенный запрос без группироки по докам, и приджойнить его к этому запросу....
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Группировка с разверткой по документам
Ответ #10 - 11. Июня 2008 :: 09:23
Печать  
если ты применишь: Склад-Товар-Документ, то получишь итоги:
1-я строка: по всем складам товарам документам,
промежуточные итоги по складу: По всем товарам и документам
промежуточные итоги по складу и товару: по всем документам
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Группировка с разверткой по документам
Ответ #11 - 11. Июня 2008 :: 09:28
Печать  
Это понятно, тут просто специфическая ситуация.

Задача такая:

Например,

                           ОстНаНачало    Приход

Товар1 Склад1               0
Товар1 Склад1 Док1      0                   1
Товар1 Склад1 Док2      1                   2

То есть, мне надо, чтобы остаток на начало по товару и складу по всем докам был 0, так как на начало периода он и был 0.

А запрос суммирует 1+0 и выдает 1.
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Группировка с разверткой по документам
Ответ #12 - 11. Июня 2008 :: 11:14
Печать  
Neo писал(а) 11. Июня 2008 :: 09:28:
Это понятно, тут просто специфическая ситуация.

Задача такая:

Например,

                           ОстНаНачало    Приход

Товар1 Склад1               0
Товар1 Склад1 Док1      0                   1
Товар1 Склад1 Док2      1                   2

То есть, мне надо, чтобы остаток на начало по товару и складу по всем докам был 0, так как на начало периода он и был 0.

А запрос суммирует 1+0 и выдает 1.

и правильно делает, поскольку остаток по товару и складу должен включать в себя остатки по всем документам, вот он и суммирует: 0 (по док1) + 1 (по док2) = 1
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Группировка с разверткой по документам
Ответ #13 - 11. Июня 2008 :: 12:43
Печать  
Neo писал(а) 11. Июня 2008 :: 09:28:
То есть, мне надо, чтобы остаток на начало по товару и складу по всем докам был 0, так как на начало периода он и был 0.

Глянь. К твоей конфигурации не подойдёт, но идея должна быть понятна.
  

OSV.ert ( 41 KB | Загрузки )

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать