|
![]() |
#1 |
Участник
|
To sparur
Ответ на Ваш изначальный вопрос. Я для группировки данных использую класс RHolderData и его наследников. Для примера можно использовать любую из ОСВ, разработынные локализаторами. |
|
![]() |
#2 |
Участник
|
Плюс необходимая вам сортировка по складу, т.д. появится автоматически при группировке по этим полям на inventDim (правда, если до этого нет группировки по ItemId)
|
|
![]() |
#3 |
Участник
|
Все дело в fetchMode
![]() Попробуйте вот так ![]() static void Job1(Args _args) { Query q; QueryBuildDataSource qbdsISum; QueryBuildDataSource qbdsITable; QueryBuildDataSource qbdsIDim; ; q = new Query(); qbdsISum = q.addDataSource(tableNum(InventSum)); qbdsITable = qbdsISum.addDataSource(tableNum(InventTable)); qbdsITable.fetchMode(QueryFetchMode::One2One); qbdsITable.relations(true); qbdsIDim = qbdsISum.addDataSource(tableNum(InventDim)); qbdsIDim.fetchMode(QueryFetchMode::One2One); qbdsIDim.relations(true); box::info(q.dataSourceNo(1).toString()); } |
|
|
За это сообщение автора поблагодарили: sparur (1). |
![]() |
#4 |
Участник
|
Цитата:
Сообщение от kashperuk
Все дело в fetchMode
![]() Попробуйте вот так ![]() static void Job1(Args _args) { Query q; QueryBuildDataSource qbdsISum; QueryBuildDataSource qbdsITable; QueryBuildDataSource qbdsIDim; ; q = new Query(); qbdsISum = q.addDataSource(tableNum(InventSum)); qbdsITable = qbdsISum.addDataSource(tableNum(InventTable)); qbdsITable.fetchMode(QueryFetchMode::One2One); qbdsITable.relations(true); qbdsIDim = qbdsISum.addDataSource(tableNum(InventDim)); qbdsIDim.fetchMode(QueryFetchMode::One2One); qbdsIDim.relations(true); box::info(q.dataSourceNo(1).toString()); } |
|
![]() |
#5 |
Участник
|
Цитата:
Сообщение от kashperuk
Все дело в fetchMode
![]() Попробуйте вот так ![]() static void Job1(Args _args) { Query q; QueryBuildDataSource qbdsISum; QueryBuildDataSource qbdsITable; QueryBuildDataSource qbdsIDim; ; q = new Query(); qbdsISum = q.addDataSource(tableNum(InventSum)); qbdsITable = qbdsISum.addDataSource(tableNum(InventTable)); qbdsITable.fetchMode(QueryFetchMode::One2One); qbdsITable.relations(true); qbdsIDim = qbdsISum.addDataSource(tableNum(InventDim)); qbdsIDim.fetchMode(QueryFetchMode::One2One); qbdsIDim.relations(true); box::info(q.dataSourceNo(1).toString()); } ![]() |
|
![]() |
#6 |
Программатор
|
qbdsITable.fetchMode(QueryFetchMode::One2One);
Это и есть чтото типа JOIN'ов. Попробуйте - может получится. |
|
![]() |
#7 |
Участник
|
Цитата:
Сообщение от Sada
qbdsITable.fetchMode(QueryFetchMode::One2One);
Это и есть чтото типа JOIN'ов. Попробуйте - может получится. ![]() |
|
![]() |
#8 |
Программатор
|
Напоминаем про зеленые квадратики по аватарой
![]() ![]() |
|
![]() |
#9 |
Участник
|
Цитата:
Сообщение от Sada
Напоминаем про зеленые квадратики по аватарой
![]() ![]() |
|
![]() |
#10 |
Участник
|
![]()
Ну, вообще, fetchMode - это не join - это то, как таблицы будут соединяться. Один ко многим или один к одному.
А вот само соединение происходит при указании relations(true) - при этом условие соединения подтягивается из сведений о таблицах и их полях. См. узел relations на таблицах и таблицы, указанные на EDT. (Типа ItemId ссылается на inventTable) Это аналогично написанию addLink() по этим полям. |
|
![]() |
#11 |
Участник
|
теперь, однако, встала проблема с группировкой и сортировкой данных в запросе... код мой громоздкий поэтому приводить не буду, скажу лишь следующее:
допустим надо мне сгруппировать по складу, в результате выполнения моего кода получается запрос вида: SELECT SUM(PostedQty), SUM(Received), SUM(Deducted), SUM(Picked), SUM(Registered), SUM(PostedValue) FROM InventSum GROUP BY InventSum.ItemId ASC, InventSum.InventDimId ASC WHERE ((LastUpdDatePhysical<=08.06.2006)) JOIN * FROM InventTable WHERE InventSum.ItemId = InventTable.ItemId JOIN * FROM InventDim GROUP BY InventDim.InventLocationId ASC WHERE InventSum.InventDimId = InventDim.inventDimId в результате которого у мну не получается никакой группировки...и тем более сортировки данных ![]() подскажите в чем трабл... |
|
![]() |
#12 |
Участник
|
yне надо группировать по InventSum.InventDimId - лучше выберите maxOf(InventSum.RecID)
|
|
![]() |
#13 |
Участник
|
Цитата:
Сообщение от belugin
yне надо группировать по InventSum.InventDimId - лучше выберите maxOf(InventSum.RecID)
|
|
![]() |
#14 |
Участник
|
после поправок с Вашей подсказки:
а именно добавления строки: qbdsISum.addSelectionField(fieldnum(InventSum,RecID),SelectionField::Max); и удаления группировки по InventDimID получил запрос вида: SELECT SUM(PostedQty), SUM(Received), SUM(Deducted), SUM(Picked), SUM(Registered), SUM(PostedValue) FROM InventSum GROUP BY InventSum.ItemId ASC WHERE ((LastUpdDatePhysical<=08.06.2006)) JOIN * FROM InventTable WHERE InventSum.ItemId = InventTable.ItemId AND ((ItemId = 10002000111)) JOIN * FROM InventDim GROUP BY InventDim.InventLocationId ASC WHERE InventSum.InventDimId = InventDim.inventDimId не пойму почему в запросе не появилось поле с RecID |
|
![]() |
#15 |
Участник
|
>>>а почему не надо то
а зачем надо >>> Selection по RecID в данном случае не нужен. |
|
![]() |
#16 |
Участник
|
Цитата:
Сообщение от belugin
>>>а почему не надо то
а зачем надо Цитата:
Сообщение от belugin
>>> Selection по RecID
в данном случае не нужен. ![]() |
|
![]() |
#17 |
Программатор
|
Покажите ваш ужасный запрос (если конечно это не секрет). А мы посмотрим, что там не так или так
![]() |
|
![]() |
#18 |
Участник
|
Цитата:
Сообщение от Sada
Покажите ваш ужасный запрос (если конечно это не секрет). А мы посмотрим, что там не так или так
![]() ![]() q = new Query(); qbdsISum = q.addDataSource(tableNum(InventSum)); qbdsITable = qbdsISum.addDataSource(tableNum(InventTable)); qbdsITable.fetchMode(QueryFetchMode::One2One); qbdsITable.relations(true); qbdsIDim = qbdsISum.addDataSource(tableNum(InventDim)); qbdsIDim.fetchMode(QueryFetchMode::One2One); qbdsIDim.relations(true); //указываем поля, необходимые нам в результате запроса qbdsISum.addSelectionField(fieldnum(InventSum,LastUpdDatePhysical),SelectionField::Max); qbdsISum.addSelectionField(fieldnum(InventSum,InventDimId),SelectionField:database); qbdsISum.addSelectionField(fieldnum(InventSum,ItemId),SelectionField:database); qbdsISum.addSelectionField(fieldnum(InventSum,PostedQty),SelectionField::Sum); qbdsISum.addSelectionField(fieldnum(InventSum,Received),SelectionField::Sum); qbdsISum.addSelectionField(fieldnum(InventSum,Deducted),SelectionField::Sum); qbdsISum.addSelectionField(fieldnum(InventSum,Picked),SelectionField::Sum); qbdsISum.addSelectionField(fieldnum(InventSum,Registered),SelectionField::Sum); qbdsISum.addSelectionField(fieldnum(InventSum,PostedValue),SelectionField::Sum); //добавляем ограничение по таблице InventSum qbdsISum.addRange(fieldnum(InventSum,LastUpdDatePhysical)).value(".."+Fdate.valueStr()); //добавляем ограничение по таблице InventTable qbdsITable.addRange(fieldnum(InventTable,ItemId)); qbdsITable.addRange(fieldnum(InventTable,ItemGroupId)); //добавляем ограничение по таблице InventDim qbdsIDim.addRange(fieldnum(Inventdim, InventLocationId)); qbdsIDim.addRange(fieldnum(Inventdim, InventMOLId)); qbdsIDim.addRange(fieldnum(Inventdim, InventBatchId)); //забиваем значение ограничений(фильтров) if (TMC.valueStr()!="") qbdsITable.FindRange(fieldnum(InventTable,ItemId)).value(TMC.valueStr()); if (GroupTMC.valueStr()!="") qbdsITable.FindRange(fieldnum(InventTable,ItemGroupId)).value(GroupTMC.valueStr()); if (Sklad.valueStr()!="") qbdsIDim.FindRange(fieldnum(InventDim,InventLocationId)).value(Sklad.valueStr()); if (MOL.valueStr()!="") qbdsIDim.FindRange(fieldnum(InventDim,InventMOLId)).value(MOL.valueStr()); if (Batch.valueStr()!="") qbdsIDim.FindRange(fieldnum(InventDim,InventBatchId)).value(Batch.valueStr()); qbdsISum.addSortField(fieldnum(InventSum,ItemId)); qbdsISum.orderMode(OrderMode::GroupBy); //делаем группировку for (i=LevelСount-1;i>=0;i--) //for (i=0;i<LevelСount;i++) { level=SelList.getItem(i).data(); [tableid,fieldid]=conpeek(groupfields,level); switch (tableid) { case tableNum(InventTable): switch (fieldid) { case fieldNum(InventTable,ItemId): qbdsITable.addSortField(fieldid); qbdsITable.orderMode(OrderMode::GroupBy); //qbdsITable.addSortIndex(indexnum(InventTable,ItemIdx)); break; case fieldNum(InventTable,ItemGroupId): qbdsITable.addSortField(fieldid); qbdsITable.orderMode(OrderMode::GroupBy); //qbdsITable.addSortIndex(indexnum(InventTable,GroupItemIdx)); break; } break; case tablenum(InventDim) : qbdsISum.addSortField(fieldNum(InventSum,InventDimId)); qbdsISum.orderMode(OrderMode::GroupBy); switch (fieldId) { case fieldNum(InventDim,InventLocationId): qbdsIDim.addSortField(fieldid); qbdsIDim.orderMode(OrderMode::GroupBy); //qbdsIDim.addSortIndex(indexnum(InventDim,LocationIdIdx)); break; case fieldNum(InventDim,InventMOLId): qbdsIDim.addSortField(fieldid); qbdsIDim.orderMode(OrderMode::GroupBy); //qbdsIDim.addSortIndex(indexnum(InventDim,InventMOLIdIdx)); break; case fieldNum(InventDim,InventBatchId): qbdsIDim.addSortField(fieldid); qbdsIDim.orderMode(OrderMode::GroupBy); //qbdsIDim.addSortIndex(indexnum(InventDim,BatchIdIdx)); break; } break; } } здесь ситуация следующая: есть список (ListView) в котором хранятся поля, по которым надо группировать, в каждом элементе ListView в поле data хранится контейнер с идентификатором Таблицы и идентификатором поля. Собственно конструкции switch и обеспечивают вытягивание из data этого контейнера и точно определяют по каким полям и из каких таблиц надо делать группировки!! вот такие пироги... смотрите |
|
![]() |
#19 |
Участник
|
Цитата:
Сообщение от Sada
Покажите ваш ужасный запрос (если конечно это не секрет). А мы посмотрим, что там не так или так
![]() ![]() |
|
![]() |
#20 |
Участник
|
надо группировать InventDim по складу - это уже есть. А вот как вы собираетесь одновременно группировать по складу и читать зругие поля???
>>>а зачем тогда советовали?? это нужно былобы если бы InventSum был не 1 таблицей в запросе |
|