05.06.2006, 07:13 | #1 |
Участник
|
Методы группировки данных в отчетах
Уважаемые, поделитесь опытом по данной проблеме...
Кто как реализует группировку данных в отчетах... Хотелось бы узнать есть ли универсальный метод, достаточно простой и гибкий в использовании... Сейчас пытаюсь использовать временную таблицу, в которую загоняю некоторые результаты запроса, потом обрабатываю полученную таблицу и вывожу результаты в Ёксель... Но возникают некоторые проблемы... В связи с чем и хотелось услышать кто как реализует данный функционал... |
|
05.06.2006, 10:05 | #2 |
Участник
|
Вы имеете в виду, когда не удается сгруппировать стандартным запросом?
Именно так и делаю, создаю временную таблицу - заполняю и вывожу. У вас проблемы с Экселем или именно с группировкой? Опишите, может, что именно за проблемы |
|
05.06.2006, 10:36 | #3 |
Участник
|
Создайте класс, который будет выводить в ёксел обработанные (сгруппированные)данные. Передавайте в него заполненную временную таблицу, список полей группировок, поля данных, и тп. У нас при помощи подобного класса отчеты выводятся в OWC SpreadSheet.
Хотя использование временной таблицы для формирования отчетов не самое грамотное решение - низкая скорость, использование впустую RecId... |
|
05.06.2006, 11:52 | #4 |
Участник
|
Цитата:
Сообщение от rINT
Создайте класс, который будет выводить в ёксел обработанные (сгруппированные)данные. Передавайте в него заполненную временную таблицу, список полей группировок, поля данных, и тп. У нас при помощи подобного класса отчеты выводятся в OWC SpreadSheet.
Хотя использование временной таблицы для формирования отчетов не самое грамотное решение - низкая скорость, использование впустую RecId... |
|
05.06.2006, 11:55 | #5 |
Участник
|
Цитата:
Сообщение от kashperuk
У вас проблемы с Экселем или именно с группировкой?
Опишите, может, что именно за проблемы ну а потом в Ёксель выводить... |
|
05.06.2006, 12:05 | #6 |
Программатор
|
В чём именно проблема? Написать выборку из таблицы или что? Я просто понять не могу...Может имеет место быть группировка при формировании временной таблицы?
С уважением - Sada... |
|
05.06.2006, 12:14 | #7 |
Moderator
|
Цитата:
Сообщение от sparur
проблемы пока именно с группировкой...создал временную таблицу, заполнил ее (вроде как нужными данными из запроса без группировки), теперь надо в этой таблице данные привести в нужный вид, то есть сгруппировать...
ну а потом в Ёксель выводить... |
|
05.06.2006, 12:15 | #8 |
Участник
|
Цитата:
Сообщение от Sada
В чём именно проблема? Написать выборку из таблицы или что? Я просто понять не могу...Может имеет место быть группировка при формировании временной таблицы?
С уважением - Sada... может канешно можно как то проще, но я не знаю как |
|
05.06.2006, 12:16 | #9 |
Участник
|
Цитата:
Сообщение от Gustav
А несгруппированных данных много? Сколько тысяч строк? Может быть, имеет смысл сначала выгрузить всё в Ёксель, а уже в нём группировать - сводной таблицей, например?
|
|
05.06.2006, 12:26 | #10 |
Программатор
|
Я может чего не понимаю, но в чём проблема??? С выводем в Excel или с группировкой? Или и с тем, и с другим? Используйте group by или order by наконец
для группировки Что Вы имеете в виду под словом "группировка"? Я не смогу например вам помоч, не зная почему у вас не выходит группировка. С уважением - Sada... |
|
05.06.2006, 12:35 | #11 |
Участник
|
Давайте просто перейдем уже к более конкретным полям, запросам, таблицам.
И я обычно сначала группирую, а потом эти данные заполняю во временную таблицу. Иначе, какой из нее толк? Обычно делается цикл по всем строкам нужным, и добавляются переменные, в которые суммируются необходимые группировки, и записываются и обнуляются при изменении поля, по которому группировка. Тогда у нас сразу во временной таблице готовые данные получаются, и их тупо надо вывести в Эксель. |
|
05.06.2006, 12:36 | #12 |
Moderator
|
Цитата:
Сообщение от sparur
но если можно то объясните ваш метод подробнее
А сценарий примерно такой (предполагается, что всё выполняется кодом): 1. Выгружаем несгруппированные данные из Аксапты в Excel (назовем этот лист "Приемник") 2. На основе данных этого листа строим в Excel сводную таблицу с нужным вариантом группировки (лист "Сводная") 3. Копируем данные из сводной таблицы в чистый лист (лист "Финал"), рисуем заголовки колонок и форматируем нужным образом 4. Удаляем листы "Приемник" и "Сводная", оставляя лист "Финал" как результат. P.S. А может быть Ваш пользователь захочет, чтобы Вы остановились на этапе 2 и дали ему возможность выполнять всякие другие группировки, а не только ту, которая изначально предполагалась Последний раз редактировалось Gustav; 05.06.2006 в 12:39. |
|
05.06.2006, 12:43 | #13 |
Участник
|
Цитата:
Сообщение от Sada
Я может чего не понимаю, но в чём проблема??? С выводем в Excel или с группировкой? Или и с тем, и с другим? Используйте group by или order by наконец
для группировки Что Вы имеете в виду под словом "группировка"? Я не смогу например вам помоч, не зная почему у вас не выходит группировка. С уважением - Sada... делаю фильтрацию по группе номенклатуры (выбираю какую нить группу), указываю что данные в отчете должны быть сгруппированы например по складу, так вот в результате запроса данные выдаются без группировки (в запросе учитывается только указанные фильтры) я их поочередно загоняю в таблицу, в результате имеем таблицу со всеми ТМЦ из указанной номенклатурной группы. теперь эти данные надо сгруппировать по складу и выдать в ексель!!! |
|
05.06.2006, 12:48 | #14 |
Участник
|
Цитата:
Сообщение от kashperuk
Давайте просто перейдем уже к более конкретным полям, запросам, таблицам.
И я обычно сначала группирую, а потом эти данные заполняю во временную таблицу. Иначе, какой из нее толк? Обычно делается цикл по всем строкам нужным, и добавляются переменные, в которые суммируются необходимые группировки, и записываются и обнуляются при изменении поля, по которому группировка. Тогда у нас сразу во временной таблице готовые данные получаются, и их тупо надо вывести в Эксель. q=new Query(); qr=new QueryRun(q); qbds=qr.query().addDataSource(tablenum(InventTable)); qr.query().dataSourceTable(tablenum(InventTable)).relations(false); q1=new Query(); qr1=new QueryRun(q1); qbds1=qr1.query().addDataSource(tablenum(InventSum)); qbds1.addSortField(fieldnum(InventSum,InventDimId)); qbds1.addSortField(fieldnum(InventSum,LastUpdDatePhysical)); qbds1.orderMode(OrderMode::GroupBy); qbds1.addSelectionField(fieldnum(InventSum,LastUpdDatePhysical),SelectionField::Max); qbds1.addSelectionField(fieldnum(InventSum,InventDimId),SelectionField:atabase); qbds1.addSelectionField(fieldnum(InventSum,ItemId),SelectionField:atabase); qbds1.addSelectionField(fieldnum(InventSum,PostedQty),SelectionField::Sum); qbds1.addSelectionField(fieldnum(InventSum,Received),SelectionField::Sum); qbds1.addSelectionField(fieldnum(InventSum,Deducted),SelectionField::Sum); qbds1.addSelectionField(fieldnum(InventSum,Picked),SelectionField::Sum); qbds1.addSelectionField(fieldnum(InventSum,Registered),SelectionField::Sum); qbds1.addSelectionField(fieldnum(InventSum,PostedValue),SelectionField::Sum); qbds1.addRange(fieldnum(InventSum, ItemId)); qbds1.addRange(fieldnum(InventSum,LastUpdDatePhysical)).value(".."+Fdate.valueStr()); qr1.query().dataSourceTable(tablenum(InventSum)).addDataSource(tablenum(InventDim)); qr1.query().dataSourceTable(tablenum(InventDim)).joinMode(joinMODE::InnerJoin); qr1.query().dataSourceTable(tablenum(InventDim)).addLink(fieldnum(InventDim,InventDimId),fieldnum(InventSum,InventDimId)); qr.query().dataSourceNo(1).clearRanges(); if (TMC.valueStr()!='') qr.query().dataSourceNo(1).addRange(fieldnum(InventTable,ItemId)).value(TMC.valueStr()); if (GroupTMC.valueStr()!='') qr.query().dataSourceNo(1).addRange(fieldnum(InventTable,ItemGroupId)).value(GroupTMC.valueStr()); qr.init(); //запрос по таблицам InventSum и InventTable while (qr.next()) { it = qr.get(tablenum(InventTable)); qr1.query().dataSourceNo(2).clearRanges(); qr1.query().dataSourceNo(1).FindRange(fieldnum(InventSum, ItemId)).value(it.ItemId); //накладываем основные ограничения-фильтры для 2-го запроса (по склад. аналитикам) if (Sklad.valueStr()!='') qr1.query().dataSourceNo(2).addRange(fieldnum(InventDim,InventLocationId)).value(Sklad.valueStr()); if (MOL.valueStr()!='') qr1.query().dataSourceNo(2).addRange(fieldnum(InventDim,InventMOLId)).value(MOL.valueStr()); if (Batch.valueStr()!='') qr1.query().dataSourceNo(2).addRange(fieldnum(InventDim,InventBatchId)).value(Batch.valueStr()); //выполняем 2-ой запрос по складским аналитикам qr1.init(); While (qr1.next()) { .......... } в данном случае тут 2 запроса, один по InventTable, результаты которого передаются во 2-ой запрос в качестве ограничения по таблице InventSum |
|
|
За это сообщение автора поблагодарили: raniel (1). |
05.06.2006, 12:50 | #15 |
Участник
|
Цитата:
Сообщение от Gustav
Нуу... Во-первых, нужно уверенно себя чувствовать в обращении со сводными таблицами в Excel. Если это сейчас не так, то настоятельно рекомендую потратить день-два и освоить этот механизм - это хороший навык, который всегда пригодится.
А сценарий примерно такой (предполагается, что всё выполняется кодом): 1. Выгружаем несгруппированные данные из Аксапты в Excel (назовем этот лист "Приемник") 2. На основе данных этого листа строим в Excel сводную таблицу с нужным вариантом группировки (лист "Сводная") 3. Копируем данные из сводной таблицы в чистый лист (лист "Финал"), рисуем заголовки колонок и форматируем нужным образом 4. Удаляем листы "Приемник" и "Сводная", оставляя лист "Финал" как результат. P.S. А может быть Ваш пользователь захочет, чтобы Вы остановились на этапе 2 и дали ему возможность выполнять всякие другие группировки, а не только ту, которая изначально предполагалась |
|
05.06.2006, 12:52 | #16 |
Программатор
|
Идем по строкам времееной таблицы, упарядоченной по складу и по группе номенклатуры, присваеваем какой - нить переменной первую записи склада этой таблицы. Как только сменился склад, выводим итоги... присваеваем нашей временной перемной новый склад. Это на вскидку, но будет работать по крайней мере
|
|
05.06.2006, 12:55 | #17 |
Участник
|
Цитата:
Сообщение от Sada
Идем по строкам времееной таблицы, упарядоченной по складу и по группе номенклатуры, присваеваем какой - нить переменной первую записи склада этой таблицы. Как только сменился склад, выводим итоги... присваеваем нашей временной перемной новый склад. Это на вскидку, но будет работать по крайней мере
|
|
05.06.2006, 13:07 | #18 |
Программатор
|
Цитата:
Сообщение от sparur
а кто сказал что таблица отсортирована по складу??
Цитата:
Сообщение от sparur
делаю фильтрацию по группе номенклатуры (выбираю какую нить группу), указываю что данные в отчете должны быть сгруппированы например по складу |
|
05.06.2006, 13:16 | #19 |
Участник
|
Цитата:
Сообщение от Sada
или это не то?
в моем запросе учитывается только фильтрация, то есть в запросе устанавливается ограничение что в результате должны получить только записи из выбранной номенклатурной группы, а сортировки тут нет!! данные просто будут выдаваться поочереди и заносится во врем. таблицу (без всякой сортировки по складу!! если конечно есть стандартный метод, которым бы можно было полученную из запроса таблицу отсортировать по укзанным полям, то было бы замечательно и дальше ваш метод бы подошел, НО я не знаю такой стандартной функции!! |
|
05.06.2006, 13:16 | #20 |
Moderator
|
Цитата:
Сообщение от sparur
хм, интересный вариант, надо будет при наличии времени разобраться что да как... а инфой по работе со сводными таблицами на уровне кода не поделитесь??
Вы его создайте сами при помощи макрорекордера в Excel - заодно и сами прочувствуете. Описание найдёте в справке Excel VBA - объект PivotTable. Для доступа к частям сводной таблицы рекомендую обратить внимание на следующие свойства этого объекта: ColumnRange, DataBodyRange, DataLabelRange, PageRange, PageRangeCells, RowRange, TableRange1, TableRange2. В частности, они будут нужны для копирования (шаг 3 сценария выше). Записав макрорекордером код VBA, преобразуйте этот код в код X++. А можете попробовать применить подход, изложенный здесь Axapta программирует Excel на VBA (в этом случае код VBA не придется преобразовывать в X++). |
|