Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема группировка (число прочтений - 1832 )
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
группировка
29. Июня 2009 :: 12:39
Печать  
Подскажите с группировкой, плиз.
пример из FAQ (http://www.1cpp.ru/forum/YaBB.pl?num=1148038411):

fez писал(а) 19. Мая 2006 :: 11:57:
Вычисление остатков

Теперь практика.

Пример запроса на 1С и 1С++

Код
Выбрать все
|Товар = Регистр.ОстаткиТоваров.Товар;
|Склад = Регистр.ОстаткиТоваров.Склад;
|ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
|Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
|Группировка Товар;
|Условие(Товар в ВыбТовар);
|Условие(Склад в ВыбСклад);
 

     

и

Код
Выбрать все
ТекстЗапроса = "
  |Select
  |    Товар [Товар $Справочник.Товары],
  |    Склад [Склад $Справочник.Склады],  
  |    ОстатокТовараОстаток ОстатокТовара
  |FROM
  |    $РегистрОстатки.ОстаткиТовара(
  |	,
  |	,
  |	Товар in (Select val from #ВыбТовар)
  |				   And
  |	Склад in (Select val from #ВыбСклад),
  |	(Товар, Склад),
  |	ОстатокТовара
  |	) остатки
  |";
  Запрос = СоздатьОбъект("ODBCRecordSet");
  Запрос.УложитьСписокОбъектов(ВыбСклад,"#ВыбСклад","Склады");
  Запрос.УложитьСписокОбъектов(ВыбТовар,"#ВыбТовар","Товары");
  ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
  ТЗ.ВыбратьСтроку();
 



Конечно в этих запросах есть немного отличий, а именно в обработке пустых фильтров. В прямом запросе результат будет пустой



Отличие на самом деле еще и в том, что в 1С-ном запросе будут строки группировки по каждому товару.
Мне нужно отчет перевести на прямой запрос. Сейчас в нем формируется ТЗ, которая в дальнейшем обрабатывается. Надо сделать ТЗ той же структуры прямым запросом.
"Без групп" все замечательно, с группировкой - не получается.
Подскажите, пожалуйста, на примере выше, как этого добиться.
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: группировка
Ответ #1 - 29. Июня 2009 :: 12:54
Печать  
Bibr писал(а) 29. Июня 2009 :: 12:39:
ТекстЗапроса = "
 |Select
 |    Товар [Товар $Справочник.Товары],
 |    Склад [Склад $Справочник.Склады],  
 |    ОстатокТовараОстаток ОстатокТовара
 |FROM
 |    $РегистрОстатки.ОстаткиТовара(
 |      ,
 |      ,
 |      Товар in (Select val from #ВыбТовар)
 |                           And
 |      Склад in (Select val from #ВыбСклад),
 |      (Товар, Склад),
 |      ОстатокТовара
 |      ) остатки
 |";
 


В доке про группировки тоже есть. В вашем случае так:
Код
Выбрать все
ТекстЗапроса = "
  |Select
  |    grouping(остатки.Товар) Итог1,
  |    grouping(остатки.Склад) Итог2,
  |    остатки.Товар [Товар $Справочник.Товары],
  |    остатки.Склад [Склад $Справочник.Склады],  
  |    sum(остатки.ОстатокТовараОстаток) ОстатокТовара
  |FROM
  |    $РегистрОстатки.ОстаткиТовара(
  |	,
  |	,
  |	Товар in (Select val from #ВыбТовар)
  |				   And
  |	Склад in (Select val from #ВыбСклад),
  |	(Товар, Склад),
  |	ОстатокТовара
  |	) остатки
  |GROUP BY остатки.Товар, остатки.Склад WITH ROLLUP
  |"; 

  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: группировка
Ответ #2 - 29. Июня 2009 :: 13:21
Печать  
Можно использовать индексированную таблицу (будет проще и универсальнее)... хотя по памяти медленнее чем в запросе
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: группировка
Ответ #3 - 29. Июня 2009 :: 13:31
Печать  
pavel_tr писал(а) 29. Июня 2009 :: 12:54:
В доке про группировки тоже есть. В вашем случае так:
Код
Выбрать все
ТекстЗапроса = "
  |Select
  |    grouping(остатки.Товар) Итог1,
  |    grouping(остатки.Склад) Итог2,
  |    остатки.Товар [Товар $Справочник.Товары],
  |    остатки.Склад [Склад $Справочник.Склады],  
  |    sum(остатки.ОстатокТовараОстаток) ОстатокТовара
  |FROM
  |    $РегистрОстатки.ОстаткиТовара(
  |	,
  |	,
  |	Товар in (Select val from #ВыбТовар)
  |				   And
  |	Склад in (Select val from #ВыбСклад),
  |	(Товар, Склад),
  |	ОстатокТовара
  |	) остатки
  |GROUP BY остатки.Товар, остатки.Склад WITH ROLLUP
  |"; 



Это не будет аналогом 1С-запроса.
А для группировки только по одному товару?

Код
Выбрать все
ТекстЗапроса = "
  |Select
  |    grouping(остатки.Товар) Итог1,
  |    остатки.Товар [Товар $Справочник.Товары],
  |    остатки.Склад [Склад $Справочник.Склады],  
  |    sum(остатки.ОстатокТовараОстаток) ОстатокТовара
  |FROM
  |    $РегистрОстатки.ОстаткиТовара(
  |	,
  |	,
  |	Товар in (Select val from #ВыбТовар)
  |				   And
  |	Склад in (Select val from #ВыбСклад),
  |	(Товар, Склад),
  |	ОстатокТовара
  |	) остатки
  |GROUP BY остатки.Товар WITH ROLLUP
  |"; 



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


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: группировка
Ответ #4 - 29. Июня 2009 :: 14:14
Печать  
А зачем в точности получать аналог 1Сного запроса, так трудно переписать код вывода отчета?Подмигивание
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: группировка
Ответ #5 - 30. Июня 2009 :: 11:51
Печать  
alexdd писал(а) 29. Июня 2009 :: 14:14:
А зачем в точности получать аналог 1Сного запроса, так трудно переписать код вывода отчета?Подмигивание


Формируется ТЗ, из которой печатается 4 разных формы, причем ТЗ в разных случаях по разному обрабатывается.
Т.е кн. "Сформировать" предварительно формирует табл. и по кн. "Печать" происходит печать разных форм. Можно переписать вывод, но это геморройней.

Родился вопрос:
В Groupp BY нужно указывать все нестатистические столбцы выборки. Если у меня их 10, то нужно все перечислить.
Но если указывать еще rollup - породится 10 итоговых строк по каждому полю.

Как можно сделать одну итоговую строку с группировкой по одному полю? (товар например)
остальные нестатистические столбцы можно просто Nullами заполнить..
« Последняя редакция: 30. Июня 2009 :: 13:34 - Bibr »  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: группировка
Ответ #6 - 30. Июня 2009 :: 18:03
Печать  
указать Min(ПолеГруппировкиНенакапливаемое)
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать