23.07.2013, 13:01 | #1 |
Участник
|
Запрос формы "В наличии"
Добрый день! Покопался на форуме, нашел много всего интересного по теме, но ничего "в яблочко". Поэтому, уважаемые форумчане, укажите ссылку на существующую ветку или окажите посильную помощь. Проблема в следующем: К тому же одновременно группировать и сортировать axapta не позволяет. PS: Еще, как я полагаю, камнем преткновения встанет вопрос производительности, но это в дальнейшем. |
|
23.07.2013, 13:14 | #2 |
Участник
|
Стояла почти аналогичная задача.
Пришлось нарисовать свою форму, группировки, сортировки это своими силами, а вот для сбора данных воспользовался классом InventOnHand. Еще в дополнение пригодится еще хорошая статья по InventSum Может поможет. |
|
24.07.2013, 07:10 | #3 |
Участник
|
Цитата:
Сообщение от sparco
Стояла почти аналогичная задача.
Пришлось нарисовать свою форму, группировки, сортировки это своими силами, а вот для сбора данных воспользовался классом InventOnHand. Еще в дополнение пригодится еще хорошая статья по InventSum Может поможет. |
|
24.07.2013, 08:17 | #4 |
Banned
|
Пути решения:
- перенумеровать номенклатуру - построить view и сделать свою форму - сделать отчет вместо формы - модифицировать класс, который применяет группировку к источнику данных в форме InventOnhand - поступить так, как предлагает sparco |
|
24.07.2013, 12:29 | #5 |
Участник
|
Цитата:
К тому же одновременно группировать и сортировать axapta не позволяет.
Вам никто не мешает включить в группировку поля по которым вы хотите отсортировать и даже приписать desc. Цитата:
а также сортировка (определенным образом) по номенклатуре в пределах каждой группы
|
|
24.07.2013, 12:48 | #6 |
Участник
|
Цитата:
Сообщение от ansoft
Группировка сама по себе является сортировкой.
Вам никто не мешает включить в группировку поля по которым вы хотите отсортировать и даже приписать desc. А если сортировать в пределах каждой группы (группировки) надо по-разному, то вам поможет только временная таблица или другое заполняемое хранилище... Плюс по каждой группе необходимо выполнить сортировку номенклатур. Эта сортировка выполняется согласно третьей таблице X_table (не стандартная таблица), которая содержит ItemId и SortOrder. Таблица X_table join-ся по X++: X_table.ItemId == InventSum.ItemId && X_table.InventLocationId == InventDim.InventLocationId |
|
24.07.2013, 13:02 | #7 |
Участник
|
Тогда в вашем случае сортирока по X_table методом включения в группировку поля SortOrder и добавление группировки в InventDim по полю InventLocationId и должно заработать...
|
|
24.07.2013, 13:59 | #8 |
Участник
|
Цитата:
X++: SELECT WITH SELECT_ORDER, NESTED_LOOP, FORCE_PLACEHOLDERS INDEXISHINT SUM(PostedQty), SUM(PostedValue), SUM(PhysicalValue), SUM(Deducted), SUM(Registered), SUM(Received), SUM(Picked), SUM(ReservPhysical), SUM(ReservOrdered), SUM(OnOrder), SUM(Ordered), SUM(Arrived), SUM(QuotationReceipt), SUM(QuotationIssue), SUM(PhysicalInvent), SUM(PostedValueSecCur_RU), SUM(PhysicalValueSecCur_RU), SUM(AvailPhysical), SUM(AvailOrdered) FROM InventSum GROUP BY InventSum.ItemId ASC USING INDEX ClosedItemDimIdx WHERE ((Closed = )) JOIN INDEXISHINT * FROM InventDim GROUP BY InventDim.InventLocationId ASC, InventDim.inventBatchId ASC USING INDEX DimIdIdx WHERE InventSum.InventDimId = InventDim.inventDimId |
|
24.07.2013, 14:32 | #9 |
Участник
|
Я так понимаю нам надо получить типа:
X++: SELECT WITH SELECT_ORDER, NESTED_LOOP, FORCE_PLACEHOLDERS INDEXISHINT SUM(PostedQty), SUM(PostedValue), SUM(PhysicalValue), SUM(Deducted), SUM(Registered), SUM(Received), SUM(Picked), SUM(ReservPhysical), SUM(ReservOrdered), SUM(OnOrder), SUM(Ordered), SUM(Arrived), SUM(QuotationReceipt), SUM(QuotationIssue), SUM(PhysicalInvent), SUM(PostedValueSecCur_RU), SUM(PhysicalValueSecCur_RU), SUM(AvailPhysical), SUM(AvailOrdered) FROM InventSum USING INDEX ClosedItemDimIdx WHERE ((Closed = )) JOIN INDEXISHINT * FROM InventDim GROUP BY InventDim.InventLocationId ASC USING INDEX DimIdIdx WHERE InventSum.InventDimId = InventDim.inventDimId JOIN ItemId, SotrOrder FROM X_table GROUP BY X_table.SotrOrder, X_table.ItemId ASC WHERE X_table.ItemId = InventSum.ItemId Добиться подобного запроса можно добавив X_table datasource в форму с inner join к InventSum... Далее придеться переписать init X_table datasource как-то примерно так: X++: void init() { Query q; QueryBuildDatasource qbds; ; super(); q = this.Query(); qbds = q.dataSourceTable(tableNum(InventSum)); qbds.orderMode(OrderMode::GroupBy); qbds.fetchMode(QueryFetchMode::One2One); qbds.sortClear(); // долой ItemId qbds.addSortField(fieldNum(InventSum, dataAreaId)); // наверное можно и без этого qbds = q.dataSourceTable(tableNum(InventDim)); qbds.orderMode(OrderMode::GroupBy); qbds.fetchMode(QueryFetchMode::One2One); qbds.sortClear(); // долой сортировку/группировку... qbds.addSelectionField(fieldNum(InventDim, InventLocationId)); qbds.addSortField(fieldNum(InventDim, InventLocationId)); qbds = q.dataSourceTable(tableNum(X_Table)); qbds.orderMode(OrderMode::GroupBy); qbds.fetchMode(QueryFetchMode::One2One); qbds.addSelectionField(fieldNum(X_Table, SortOrder)); qbds.addSelectionField(fieldNum(X_Table, ItemId)); qbds.addSortField(fieldNum(X_Table, SortOrder)); qbds.addSortField(fieldNum(X_Table, ItemId)); // sql: /* qbds = q.dataSourceTable(tableNum(InventSum)); box::info(qbds.toString()); */ } Соот-но... по-правильному этот метод необходимо перестраивать с учетом настройки, поэтому лучше свою форму или... Фактически совет EVGL Цитата:
- модифицировать класс, который применяет группировку к источнику данных в форме InventOnhand
Последний раз редактировалось ansoft; 24.07.2013 в 15:32. |
|
25.07.2013, 14:30 | #10 |
Участник
|
А разве при этом:
X++: SELECT WITH SELECT_ORDER, NESTED_LOOP, FORCE_PLACEHOLDERS INDEXISHINT SUM(PostedQty), SUM(PostedValue), SUM(PhysicalValue), SUM(Deducted), SUM(Registered), SUM(Received), SUM(Picked), SUM(ReservPhysical), SUM(ReservOrdered), SUM(OnOrder), SUM(Ordered), SUM(Arrived), SUM(QuotationReceipt), SUM(QuotationIssue), SUM(PhysicalInvent), SUM(PostedValueSecCur_RU), SUM(PhysicalValueSecCur_RU), SUM(AvailPhysical), SUM(AvailOrdered) FROM InventSum USING INDEX ClosedItemDimIdx WHERE ((Closed = )) JOIN INDEXISHINT * FROM InventDim GROUP BY InventDim.InventLocationId ASC USING INDEX DimIdIdx WHERE InventSum.InventDimId = InventDim.inventDimId JOIN ItemId, SotrOrder FROM X_table GROUP BY X_table.SotrOrder, X_table.ItemId ASC WHERE X_table.ItemId = InventSum.ItemId Группировка по номенклатуре в InventSum не просто так ведь стоит. |
|
26.07.2013, 12:11 | #11 |
Участник
|
X++: GROUP BY InventDim.InventLocationId ASC GROUP BY X_table.SotrOrder, X_table.ItemId ASC (Будем иметь итоги сумм по группировке склад, SotrOrder и номенклатуре, отсортированные в таком же порядке). Должно работать... P.S. Да... приведенный вариант "абстрактный" (на уровне идеи)... на форме InventOnhandItem 100% работать не будет... В executeQuery датасоурса InventSum все поламается после вызова element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS); так как там сам запрос и формируется в соответствии с настройками отображения аналитик. Т.е. помещать в init бестолку... затреться... а поместив в executeQuery поламаем соответствие настройкам отображения аналитик (всегда будет работать только наш вариант), поэтому или переписывать modifyQuery после добавления датасоурса X_table или в новой форме реализвовывать. |
|
26.07.2013, 12:19 | #12 |
Участник
|
Цитата:
Сообщение от Евгений88
А разве при этом:
X++: SELECT WITH SELECT_ORDER, NESTED_LOOP, FORCE_PLACEHOLDERS INDEXISHINT SUM(PostedQty), SUM(PostedValue), SUM(PhysicalValue), SUM(Deducted), SUM(Registered), SUM(Received), SUM(Picked), SUM(ReservPhysical), SUM(ReservOrdered), SUM(OnOrder), SUM(Ordered), SUM(Arrived), SUM(QuotationReceipt), SUM(QuotationIssue), SUM(PhysicalInvent), SUM(PostedValueSecCur_RU), SUM(PhysicalValueSecCur_RU), SUM(AvailPhysical), SUM(AvailOrdered) FROM InventSum USING INDEX ClosedItemDimIdx WHERE ((Closed = )) JOIN INDEXISHINT * FROM InventDim GROUP BY InventDim.InventLocationId ASC USING INDEX DimIdIdx WHERE InventSum.InventDimId = InventDim.inventDimId JOIN ItemId, SotrOrder FROM X_table GROUP BY X_table.SotrOrder, X_table.ItemId ASC WHERE X_table.ItemId = InventSum.ItemId Группировка по номенклатуре в InventSum не просто так ведь стоит. X++: .....JOIN ItemId, SotrOrder FROM X_table GROUP BY X_table.SotrOrder, X_table.ItemId ASC
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
26.07.2013, 12:26 | #13 |
Участник
|
Всем огромное спасибо за помощь!
По крайней мере теперь понятно, куда копать. |
|