Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс Отчет.ИтогиПоГруппировкам (число прочтений - 19291 )
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Класс Отчет.ИтогиПоГруппировкам
05. Февраля 2008 :: 08:59
Печать  
Класс для вывода плоской таблицы в печатную форму с подсчётом промежуточных итогов по группировкам.  Давно собирался выложить, и собрался наконец-то.   Это наш ответ на метод ИТ::Группировать()  Улыбка

Принцип подсчёта итогов примерно такой:
- берём первую строку данных, отрисовываем строки группировок без цифр, запоминая расположение их в печатной форме
- перебираем строки ТЗ, и как только строка ""выходит"" из текущей группы, выводим итоговые цифры во все строки групп, которые уже завершились, после этого выводим строки новых групп без цифр, и всё по новой

Для подсчёта итогов используются массивы, поэтому всё работает достаточно быстро. Правда из-за использования массивов есть и ограничения: 1) группировок м.б. не более 100; 2) <Количество группировок> * <Количество сумм> не может быть больше 10000.  Если кто-то ухитрится перевалить за эти ограничения, то ему придётся увеличить размерность массивов в классе.

Для вывода строк в печатную форму используются callback-методы (ВывестиСекцию() и ФорматСтроки()), что позволяет получить произвольное оформление.  Для дополнительных рассчётов с использованием итоговых сумм по каждой группе также используется callback-метод  (ПослеВыводаСтрокиИтогов()).

11.01.2009: пример дополнен визуальной настройкой группировок, и демонстрацией разворота по горизонтали. За визуальную часть отвечает класс Отчет.Группировки.

Брать здесь: http://www.rikcenter.ru/download/RiK_Sums.rar
« Последняя редакция: 11. Января 2009 :: 08:40 - ADirks »  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #1 - 05. Февраля 2008 :: 09:25
Печать  
А среднее считать можно? или там подсчет уникальных значений
  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #2 - 05. Февраля 2008 :: 09:29
Печать  
Nick писал(а) 05. Февраля 2008 :: 09:25:
А среднее считать можно? или там подсчет уникальных значений

Можно и среднее.  Вводишь фиктивную колонку с количеством, заполняешь её единичкой, и потом в ПослеВыводаСтрокиИтогов() считаешь среднее.  В примере таким макаром считаются колонки про наценку.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #3 - 05. Февраля 2008 :: 13:58
Печать  
Алексей, процетирую Sadovnikov'a с кубани:
Цитата:
Поверь, рядом со мной сидит автор индексированной таблицы. Так вот он сам говорит - не надо пользоваться методом Группировать. Это левый метод.

Как это понимать?  Ужас Я (и думаю не только я) использую этот метод везде где можно, а тут такое заряжают...  Нерешительный
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #4 - 05. Февраля 2008 :: 14:22
Печать  
JohnyDeath писал(а) 05. Февраля 2008 :: 13:58:
Алексей, процетирую Sadovnikov'a с кубани:
Цитата:
Поверь, рядом со мной сидит автор индексированной таблицы. Так вот он сам говорит - не надо пользоваться методом Группировать. Это левый метод.

Как это понимать?  Ужас Я (и думаю не только я) использую этот метод везде где можно, а тут такое заряжают...  Нерешительный

Интересно, в какой ветке это было?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #5 - 05. Февраля 2008 :: 14:36
Печать  
ADirks

Леша, это все здорово, но группировка итогов без иерархии справочников и сейчас волшебно делается (опять же спасибо ИТ).
Мозг плавит именно иерархия групп справочников, а отказаться от нее народ не готов.

Я еще год назад почти сделал красивое решение и для всего этого хозяйства, но допустил одну ошибку, но фатальную.
Я захотел, чтобы можно было делать и вертикальные и горизонтальные группировки, и чтобы это все было понятно для использования и модификации.
Короче, забил пока. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #6 - 05. Февраля 2008 :: 14:45
Печать  
kms писал(а) 05. Февраля 2008 :: 14:36:
ADirks

Леша, это все здорово, но группировка итогов без иерархии справочников и сейчас волшебно делается (опять же спасибо ИТ).
Мозг плавит именно иерархия групп справочников, а отказаться от нее народ не готов.

Я еще год назад почти сделал красивое решение и для всего этого хозяйства, но допустил одну ошибку, но фатальную.
Я захотел, чтобы можно было делать и вертикальные и горизонтальные группировки, и чтобы это все было понятно для использования и модификации.
Короче, забил пока. Улыбка

Ну у меня тоже есть клас делающий подобное но пока руки недоходят довести до ума. И сейчас группы добавляются отдельно, потом делается вертикальная ТЗ, потом считаются итоги. т.е три прохода по таблице но в принципе достаточно быстро а на выходе вертикальная ТЗ
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #7 - 05. Февраля 2008 :: 15:09
Печать  
artbear писал(а) 05. Февраля 2008 :: 14:22:
JohnyDeath писал(а) 05. Февраля 2008 :: 13:58:
Алексей, процетирую Sadovnikov'a с кубани:
Цитата:
Поверь, рядом со мной сидит автор индексированной таблицы. Так вот он сам говорит - не надо пользоваться методом Группировать. Это левый метод.

Как это понимать?  Ужас Я (и думаю не только я) использую этот метод везде где можно, а тут такое заряжают...  Нерешительный

Интересно, в какой ветке это было?

http://www.kuban.ru/cgi-bin/forum/forum9.cgi?view=0&page=1&ask=306835
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #8 - 06. Февраля 2008 :: 04:48
Печать  
Когда я сравнивал скорость ИТ::Группировать() и приведенного класса, то результат был не в пользу ИТ, только и всего. Правда это было довольно давно, и с тех пор ИТ стараниями kms стала быстрее. Надо как-нить сравнить ещё разик.  И ещё в ИТ::Группировать() мне не нравится методика - она явно затратная сверх всякой меры, и об этом я уже писал.  Итоги по группам справочника - это да, штука конечно незаменимая, тут ничего не скажешь. Но пока что не понадобилась, как ни странно. Т.е. в отчётах, где такие итоги нужны, мы втыкаем группировку типа "группа товаров", и этого хватает. В общем, в реальной работе я не использую этот метод. Можете меня пнуть  Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #9 - 06. Февраля 2008 :: 06:22
Печать  
ADirks писал(а) 06. Февраля 2008 :: 04:48:
Т.е. в отчётах, где такие итоги нужны, мы втыкаем группировку типа "группа товаров", и этого хватает.

Это как? Поясни, плиз.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #10 - 06. Февраля 2008 :: 06:43
Печать  
Не разворачиваем всю структуру подчиненности справочника, а выводим только непосредственного родителя и по нему делаем группировку.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #11 - 06. Февраля 2008 :: 07:07
Печать  
ADirks писал(а) 06. Февраля 2008 :: 04:48:
в ИТ::Группировать() мне не нравится методика - она явно затратная сверх всякой меры, и об этом я уже писал.

А можешь напомнить для склерозников?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #12 - 06. Февраля 2008 :: 07:42
Печать  
Ну вот например здесь: http://www.1cpp.ru/forum/YaBB.pl?num=1151059953/36#36
И где-то ещё писал, найти не смог.  В общем, проблемы такие:
- при группировке создаётся очень много индексов - п одному на каждую таблицу, а операция эта трудоёмкая
- создаётся куча вложенных объектов, и строки перемещаются из одной таблицы в другую - тоже не добавляет скорости
- никак не используется тот факт, что исходная таблица может быть уже отсортирована в нужном порядке, и не надо больше ничего делать
- вообще плоские структуры эффективнее древовидных, принципиально

Плюс к этому, у нас например есть такая специфика - данные для отчётов получаются прямыми запросами, и логично доверить сортировку результата серверу. Он собака это очень хорошо умеет делать!  Имея же плоскую таблицу, уже должным образом отсортированную, логичнее не наворачивать более никаких доп. структур, типа индексов, и вложенных таблиц. Нам нужно из ТЗ получить печатную форму, и мы делаем это с минимальными затратами памяти и процессора.  На терминалах об этих вещах забывать нельзя.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #13 - 06. Февраля 2008 :: 13:22
Печать  
ADirks писал(а) 06. Февраля 2008 :: 04:48:
Т.е. в отчётах, где такие итоги нужны, мы втыкаем группировку типа "группа товаров", и этого хватает. В общем, в реальной работе я не использую этот метод. Можете меня пнуть  Улыбка

Нет, не можем Улыбка

Хотя, конечно, хитрые вы; в этом случае - это уже не группа, а простая характеристика.
Я, кстати, припоминаю, что у вас группы писАлись триггерами в дополнительные колонки (т.е. такая обоснованная денормализация).
Леша, это ведь у вас было? Или как всегда музыка навеяла? Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Класс Отчет.ИтогиПоГруппировкам
Ответ #14 - 06. Февраля 2008 :: 13:48
Печать  
kms писал(а) 06. Февраля 2008 :: 13:22:
Я, кстати, припоминаю, что у вас группы писАлись триггерами в дополнительные колонки (т.е. такая обоснованная денормализация).
Леша, это ведь у вас было? Или как всегда музыка навеяла? Улыбка


Я за Алексея напишу - он уже дома отдыхает Улыбка
Не совсем так (если я правильно понял "группы писАлись триггерами в дополнительные колонки").
Пишется в отдельные таблицы структуры:
Код
Выбрать все
Функция СоздатьТаблицуИерархииСправочника(ВидСправочника)
	-------
	// Вспомогательная таблица для хранения иерархии элементов справочника
	ТекстЗапроса_Таблица = "
	|Set NoCount ON
	|CREATE TABLE Дерево_"+ВидСправочника+"(
	|	ID char(9) NOT NULL,
	|	ParentID char(9) NOT NULL
	|)";

	ТекстЗапроса_Индексы = "
	|Set NoCount ON
	|CREATE INDEX [IX_Дерево_"+ВидСправочника+"_ID]
	|	ON dbo.[Дерево_"+ВидСправочника+"](ID)
	|CREATE INDEX [IX_Дерево_"+ВидСправочника+"_ParentID]
	|	ON dbo.[Дерево_"+ВидСправочника+"](ParentID)
	|";

	Возврат СоздатьТаблицу("Дерево_"+ВидСправочника, ТекстЗапроса_Таблица, ТекстЗапроса_Индексы);
КонецФункции

 



Прописывается текущий элемент и все его родители. Где-то здесь, кстати, не сильно давно Алексей подробно описывал эту технологию и тексты триггеров приводил.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать