Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Группировка() (число прочтений - 6376 )
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Группировка()
01. Августа 2009 :: 09:33
Печать  
интересует возможность организации выборки для использования её обхода каким-нибудь аналогом функции "Группировка()" в 7.7

неудобно и нереально обрабатывать таблицу данных полученную из прямого запроса... скажем для построения отчетов с динамическими группировками/фильтрами
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Группировка()
Ответ #1 - 01. Августа 2009 :: 09:37
Печать  
mrgreen писал(а) 01. Августа 2009 :: 09:33:
интересует возможность организации выборки для использования её обхода каким-нибудь аналогом функции "Группировка()" в 7.7

неудобно и нереально обрабатывать таблицу данных полученную из прямого запроса... скажем для построения отчетов с динамическими группировками/фильтрами

А чем ИТЗ и группировка в ней не устраивает?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #2 - 01. Августа 2009 :: 10:09
Печать  
ну скажем вот запрос

           |SELECT $ОстаткиИтоги.Номенклатура [Номенклатура $Справочник.Номенклатура]
           |      , $ОстаткиИтоги.Склад [Склад $Справочник.Склады]
           |      , Sum($ОстаткиИтоги.Кво) СуммаКво
           |FROM $РегистрИтоги.Остатки AS ОстаткиИтоги
           |WHERE ($ОстаткиИтоги.Номенклатура IN (:ВыбНоменклатура))
           |GROUP BY $ОстаткиИтоги.Номенклатура
           |      , $ОстаткиИтоги.Склад
           |ORDER BY $ОстаткиИтоги.Склад
           |      , $ОстаткиИтоги.Номенклатура
           |";

2-групировки - номенклатура и склад... так вот необходимо вывести таблицу "вниз" - номенклатура а "вправо" - склады... на пересечении  - количество

в этом конкретном случае конечно можно свернуть её по складам получив список оных затем выводя номенклатуру присоединять списком складов секции с данными о найдёном в исходной таблице значении о количестве

но так это простейший запрос а если добвляем под складами ещё разделения на виды движений (приход расход возвраты списание и т.д.)... номенклатуру по группам а склады с видами движений по перидам... + сап текст запроса зависит от настроек динамических группировок и фильтров

такая обработка уже малореальна... в 1с стандартном всё решается при помощи Запрос.получить(,,,) а там уже Запрос.Группировка()... в моём случае - получаем до уровня склад а там обходим уже по складам
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Группировка()
Ответ #3 - 01. Августа 2009 :: 11:30
Печать  
Во всех отчетах у себя сделал примерно следующим образом. На основании того, что там навыбирает пользователь в настройках отчета, динамически строится текст запроса. Результат инсертится во временную таблицу. Далее на эту временную таблицу ставлю индексы. При выводе отчета рекурсивно обхожу группировки(Номенклатура,Склад), для каждой группировки выполняется соотвт. селект, выводится результат. Все летает, и намного удобнее чем Запрос.получить(,,,) и тп.
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #4 - 01. Августа 2009 :: 12:31
Печать  
а тогда в чем разница между таким методом и методом простого выдёргивания каждого конкретного значения внутри цикла по строкам таблицы из исходной таблицы регистра данных.... ? ну таблица выборки меньше конечно т.к. уже содержит отфильтрованные данные и пошустрее значит

но скорость то падает из за рекурсий и циклических запросов

неужели нет метода выгружать в аналог структуры выборки данных в оригинальном 1с запросе ?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Группировка()
Ответ #5 - 01. Августа 2009 :: 12:49
Печать  
Ну, во-первых, не тянем на клиента сразу все данные в таблицу значений.
Пользователи любят сделать отчет, чтобы показало все и сразу, фильтрами не очень любят пользоватьсяУлыбка Инсерт во временную таблицу будет куда быстрее, чем загрузка в ТЗ/ИТЗ. Потом в тз загружаем уже порциями.
Во-вторых, удобно писать код, так как есть временная таблица, можно использовать просто sql, не нужны никакие доп.методы. В некоторых случаях нужно вывести, например, не просто сумму для группировки, а диапазон значений, мин/макс и т.д. На sql из врем.таблицы без проблем можно выбрать что угодно.
Скорость из-за циклов и рекурсии не страдает, т.к. в любом  случае нужно пройти циклом все строки и вывести в Таблицу. Только здесь нет, свертки/группировки тз/итз.
зы: ну не знаю, это ж просто вариантУлыбка Сам пользуюсь, устраивает)
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #6 - 02. Августа 2009 :: 16:12
Печать  
Для запросов с различными группировками вниз-вправо отлично подходит OLAP посмотри отличную вещь - консоль запросов от berezdetsky
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #7 - 02. Августа 2009 :: 18:40
Печать  
alexdd писал(а) 01. Августа 2009 :: 11:30:
Во всех отчетах у себя сделал примерно следующим образом. На основании того, что там навыбирает пользователь в настройках отчета, динамически строится текст запроса. Результат инсертится во временную таблицу. Далее на эту временную таблицу ставлю индексы. При выводе отчета рекурсивно обхожу группировки(Номенклатура,Склад), для каждой группировки выполняется соотвт. селект, выводится результат. Все летает, и намного удобнее чем Запрос.получить(,,,) и тп.


Делал подобное с помощью grouping & rollup
Вроде гораздо проще
Еще вариант - использование ИТЗ как говорили, так счас и делаю всегда (пришмандолил МФ из ТиС под прямые запросы)
  

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


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #8 - 05. Августа 2009 :: 08:32
Печать  
консоль запросов посмотрел - весчь не спорю разбираюсь пока

я вот что подумал... есть же такая весчь как курсоры... их может быть заюзать в этом деле - перемещение по выборке  - то что нужно вот ещё бы их как-то между собой связать (ну как вложенные группировки) так вообще задача была б решена только построением запроса а обработка при выводе минимальна
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #9 - 05. Августа 2009 :: 08:45
Печать  
mrgreen писал(а) 05. Августа 2009 :: 08:32:
консоль запросов посмотрел - весчь не спорю разбираюсь пока

я вот что подумал... есть же такая весчь как курсоры... их может быть заюзать в этом деле - перемещение по выборке  - то что нужно вот ещё бы их как-то между собой связать (ну как вложенные группировки) так вообще задача была б решена только построением запроса а обработка при выводе минимальна

не совсем понятно о каких курсорах речь. Лучше примерчик.
Если речь об sql курсорах то во первых их все ругают так как
очень много на них уходит ресурсов sql сервера.
Во вторых курсоры будут лезть за данными к основным таблицам
1с а эти таблицы очень часто могут полностью блокироваться ( 1с в обычном режиме работы ) со всеми вытекающими последствиями.
Лучше делать как говорит alexdd в посте № 3
либо какой либо локальный olap ( pivot ) , либо ИТЗ
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #10 - 06. Августа 2009 :: 06:34
Печать  
Цитата:
Если речь об sql курсорах то во первых их все ругают так как
очень много на них уходит ресурсов sql сервера.


о них самых... ну если не вариант то и фих с ним

Изменено:
Во вторых курсоры будут лезть за данными к основным таблицам
1с а эти таблицы очень часто могут полностью блокироваться


а простые выборки разве не лезут ? да и блокировка происходит полностью журнала док-тов в любом случае (а док-ты мне нужны - там в них птичек признаков много и простым добавлением доп. поля быстрой обработки движений на регистр для отбора по периоду не обойдёшся всё равно)
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #11 - 06. Августа 2009 :: 08:35
Печать  
Код
Выбрать все
посмотри отличную вещь - консоль запросов от berezdetsky  



мдя... а как с её помощью сдулать вывод группировки по документам регистраторам ? нельзя связать журнал документов с виртуальной таблицей "остаткиобороты"
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #12 - 06. Августа 2009 :: 08:58
Печать  
mrgreen писал(а) 06. Августа 2009 :: 08:35:
мдя... а как с её помощью сдулать вывод группировки по документам регистраторам ? нельзя связать журнал документов с виртуальной таблицей "остаткиобороты"

С чего вдруг? Хоть обсоединяйся.  Смех
Другой вопрос, что польза от использования ВТ ОстаткиОбороты в сводных таблицах представляется мне несколько сомнительной.  Круглые глаза
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #13 - 06. Августа 2009 :: 10:06
Печать  
mrgreen писал(а) 06. Августа 2009 :: 06:34:
Цитата:
Если речь об sql курсорах то во первых их все ругают так как
очень много на них уходит ресурсов sql сервера.


о них самых... ну если не вариант то и фих с ним

Изменено:
Во вторых курсоры будут лезть за данными к основным таблицам
1с а эти таблицы очень часто могут полностью блокироваться


а простые выборки разве не лезут ? да и блокировка происходит полностью журнала док-тов в любом случае (а док-ты мне нужны - там в них птичек признаков много и простым добавлением доп. поля быстрой обработки движений на регистр для отбора по периоду не обойдёшся всё равно)

Простые выборки свои можно  поставить ( только осознано )
(nolock) и не будет блокировки
Также в посте #3 все один раз закидывается в свою временую таблицу и крути ее сколько хочешь без блокировок.
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #14 - 06. Августа 2009 :: 10:37
Печать  
Ладно - бум ломать голову потом... пока использовал Rollup... итого получилось вот такое (писал вручную без конструктора в мелкософтском анализёре)

Задача была вывести вниз товар с размером а вправо склады с видами движений... т.е. получить на выходе хотяб таблицу с итогами по группировкам Товар,Размер,Склад и выч. полям Приход,  Списание, Продажа, КонОстаток


Код
Выбрать все
SELECT    

			_Номенклатура as НоменклатураСсылка, Размер, _Склад as СкладСсылка, -- ссылка на номенклатуру, размер, склад
			SUM(_НачОст) AS НачОст, -- начальный остаток
			SUM(CASE WHEN (ВидД = 105) OR (ВидД = 52) OR (ВидД = 3737) THEN _Приход ELSE 0 END) AS КвоПрих, -- приход (если Вид док = "Приход" или "ВводОстатков" или "Перемещение")
			SUM(CASE WHEN (ВидД = 443) OR (ВидД = 3737) THEN _Расход ELSE 0 END) AS КвоСпис, -- списание (если Вид док = "Списание" или "Перемещение")
			SUM(CASE WHEN ВидД = 3767 THEN _Расход ELSE 0 END) AS КвоПрод, -- продажа (если Вид док = "Продажа")
			SUM(_НачОст+_Приход-_Расход) AS КвоОст -- конечный остаток

FROM        (SELECT --итог нач. остатки

					SP565 AS _Номенклатура, SC21.DESCR As Размер, SP564 As _Склад,  0 As ВидД,
					SUM(0) AS _Приход,
					SUM(0) AS _Расход,
					SUM(ОстаткиИтоги.SP71) AS _НачОст

					FROM  RG67 AS ОстаткиИтоги
								INNER JOIN --получим ссылку на размеры
									SC21 ON ОстаткиИтоги.SP566 = SC21.ID
								INNER JOIN --получим ссылку на склады
									SC297 ON ОстаткиИтоги.SP564 = SC297.ID

                    WHERE (ОстаткиИтоги.PERIOD = '20090301') --отбираем период

                    GROUP BY  SP565, SC21.DESCR, SP564

             UNION ALL --объединение

             SELECT --итоги движения

					SP565 AS _Номенклатура, SC21_1.DESCR As Размер, SP564 As _Склад, TbD.IDDOCDEF As ВидД,
					SUM(Остатки.SP71 * CASE WHEN Остатки.DEBKRED = 0 THEN 1 ELSE 0 END) AS _Приход,
					SUM(Остатки.SP71 * CASE WHEN Остатки.DEBKRED = 1 THEN 1 ELSE 0 END) AS _Расход,
					SUM(0) AS _НачОст

                    FROM RA67 AS Остатки
								INNER JOIN --получим ссылку на размеры
                                    SC21 AS SC21_1 ON Остатки.SP566 = SC21_1.ID
								INNER JOIN --получим ссылку на виды док-тов
									_1SJOURN As TbD ON Остатки.IDDOC = TbD.IDDOC
								INNER JOIN --получим ссылку на склады
									SC297 As SC297_1 ON Остатки.SP564 = SC297_1.ID

                   WHERE     (CAST(LEFT(Остатки.DATE_TIME_IDDOC, 8) AS datetime) >= '20090401') AND (CAST(LEFT(Остатки.DATE_TIME_IDDOC, 8) AS datetime)<= '20090405') --отбираем период

                   GROUP BY SP565, SC21_1.DESCR, TbD.IDDOCDEF, SP564
			) AS TMP -- алиас виртуальной таблицы с полями Номенклатура,Размер,Склад, ВидД,_Приход,_Расход

WHERE  not((_НачОст=0) and (_Приход=0) and (_Расход=0) and ((_НачОст+_Приход-_Расход)=0)) -- отсекаем нулевые значения ресурсов

GROUP BY _Номенклатура, Размер, _Склад WITH ROLLUP
ORDER BY НоменклатураСсылка, Размер, СкладСсылка 



вот теперь думаю как "уложить" фильтры по складам и товарам (даты то ладно сами сгенерим)

склады ещё ладно - подгенерить код запроса с подсовыванием ИД складов не проблема но вот Товар - как группы отбирать ? (3х уровневый справочник)
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать