gifts2017

ТаблицаЗначений в виде сводной таблицы

Опубликовал Андрей Чунихин (ApocalypseNTC) в раздел Программирование - Практика программирования




Зарегистрирован: 15 апр 2009, 07:58
Сообщений: 26  

Очень часто приходилось преобразовывать ТаблицуЗначений в вид, наподобие Сводной таблицы в Excel (типа шахматки).
Для себя написал функцию, которая этим как раз и занимается. Возможно кому-то и пригодится.

///////////////////////////////////////////////////////////////////////
// ТЗ - обрабатываемая таблица                                       //
// Строки - Колонка для представления ее значений в виде строк       //
// Колонки - Колонка для представления ее значений в виде столбцов   //
// Значения - Колонка, вычисляемая на пересечении строк и столбцов   //
///////////////////////////////////////////////////////////////////////
//Функция преобразует таблицу значений подобно функции в Экселе      //
///////////////////////////////////////////////////////////////////////

Функция СводнаяТаблицаЗначений(ТЗ,Строки,Колонки,Значения);
   
   Колонки=СокрЛП(Колонки);
   
   //формируем таблицу с колонкой "строк" и "значений"
   ТЗ_Строк=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Строк.Загрузить(ТЗ);
   ТЗ_Строк.Свернуть(Строки,Значения);
   
   //формируем таблицу с колонкой "столбцов" и "значений"
   ТЗ_Колонок=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Колонок.Загрузить(ТЗ);
   ТЗ_Колонок.Свернуть(Колонки,Значения);
   ТЗ_Колонок.Сортировать(Колонки);
   
   //создаем каркас сводной таблицы
   ТЗ_Результ=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Результ.Загрузить(ТЗ_Строк);
   ЗначенияГруппировки="";
   Для Стр=1 по ТЗ_Колонок.КоличествоСтрок() Цикл     
      ТЗ_Результ.НоваяКолонка(СокрЛП(Строка(ТЗ_Колонок.ПолучитьЗначение(Стр,Колонки))),"Число");
      ЗначенияГруппировки=ЗначенияГруппировки+СокрЛП(Строка(ТЗ_Колонок.ПолучитьЗначение(Стр,Колонки)))+",";
   КонецЦикла;
   ТЗ_Результ.УдалитьСтроки();

   //заполняем данными          
   ТЗ_Данные=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Данные.Загрузить(ТЗ);
   Для Н=1 по ТЗ_Данные.КоличествоСтрок() Цикл
      ТЗ_Результ.НоваяСтрока();
      ТЗ_Результ.УстановитьЗначение(Н,Строки,ТЗ_Данные.ПолучитьЗначение(Н,Строки));
      ТЗ_Результ.УстановитьЗначение(Н,СокрЛП(ТЗ_Данные.ПолучитьЗначение(Н,Колонки)),ТЗ_Данные.ПолучитьЗначение(Н,Значения));
   КонецЦикла;
   
   //Формируем итоговую колонку с суммами по строке
   ТЗ_Результ.НоваяКолонка("Всего","Число");
   Для Стр=1 по ТЗ_Результ.КоличествоСтрок() Цикл
      Для Н=2 по ТЗ_Результ.КоличествоКолонок() Цикл
         Всего=Всего+ТЗ_Результ.ПолучитьЗначение(Стр,Н);
      КонецЦикла; 
      ТЗ_Результ.УстановитьЗначение(Стр,"Всего",Всего);
      Всего=0;
   КонецЦикла;         
   ТЗ_Результ.Свернуть(Строки,ЗначенияГруппировки+"Всего");
   
   Возврат ТЗ_Результ;
КонецФункции
///////////////////////////////////////////////////////////////////////

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Денис Плясовских (Denizzz) 08.06.10 06:19
Нюанс - значения колонки, указаные в параметре "Колонки" должны соответствовать требованиям для именования колонок (изв. за тавталогию). :D
2. Brr (brr) 08.06.10 15:11
   //создаем каркас сводной таблицы
   ТЗ_Результ=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Результ.Загрузить(ТЗ_Строк);
   ТЗ_Колонок.ВыбратьСтроки();


здесь

ТЗ_Колонок.ВыбратьСтроки();
что делает?
Denizzz; ApocalypseNTC; +2 Ответить 1
3. Андрей Чунихин (ApocalypseNTC) 09.06.10 05:51
Спасибо за внимательность brr(2). Строка ТЗ_Колонок.ВыбратьСтроки(); оказалась лишней и была удалена.
4. Епрст (Ёпрст) 09.06.10 08:34
Не надо пользоваться Загрузить.. это гораздо медленнее, чем Выгрузить.
5. Епрст (Ёпрст) 09.06.10 08:36
+4 Не надо присоединять колонки к НЕ пустой ТЗ и потом удалять строки, нужно наоборот.

ЗЫ: ну и мини-пример работы функции просто необходим, а то влом смотреть сам код, чтоб понять, что нужно передать в параметры Строки/Колонки/Значения..
6. Galytskyy Volodymyr (arithmometr) 10.06.10 00:41
После изучения алгоритма, делаем вывод: Строки,Колонки,Значения - идентификаторы 3-х колонок таблицы ТЗ.
Далее: сомнительная конструкция СокрЛП(Строка(ТЗ_Колонок.ПолучитьЗначение(Стр,Колонки)))
В общем случае получим строку с пробелами (недопустимо для идентификаторов колонок)
В идеальном случае, на выходе получим шахматку, если на входе ТЗ с тремя колонками.
Где приближение к Ексель?
Резюме: алгоритм несовершенен.
7. Dmitry The Wing (wing) 28.09.10 05:20
Попробовал адаптировать для работы с перечислением колонок и строк через:
списКолонокПараметр = СоздатьОбъект("СписокЗначений");
списКолонокПараметр.ИзСтрокиСРазделителями("""" + СтрЗаменить(Колонки, ",", """,""") + """");

Пришел к выводу, что логику формирования итоговой таблицы надо реализовывать с нуля, т.е. согласен с (6).
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа