01.11.2005, 15:12 | #1 |
Участник
|
Сортировка отчёта о физ. наличии
Стандартный отчёт Управление запасами/ Отчёты/ Статус/ Физ. наличие/ Физ. наличие по складам содержит данные, отсортированные по артикулу номенклатуры (ItemId).
Как бы так (с минимальными трудозатратами ) отсортировать данные отчёта по наименованию номенклатуры. |
|
01.11.2005, 17:35 | #2 |
Участник
|
Порядок минимальных трудозатрат:
1 Переделать порядок DataSource-ов и сделать его таким: InventTable->InventSum->InventDim 2 В поля сортировки первой таблицы добавляется ItemName; 3 Свойство OrderMode первых двух таблиц Groupby и всё !!! просто... |
|
01.11.2005, 18:01 | #3 |
Moderator
|
Я бы еще индекс на это поле добавил
|
|
01.11.2005, 19:25 | #4 |
Участник
|
И еще релейшен на InventDim (на Query в отчете)
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 01.11.2005 в 19:33. |
|
02.11.2005, 07:40 | #5 |
Участник
|
2 AndyD релейшен есть (его не может не быть )
2 Андре добавить индекс на поле ... программно? Метод fetch отчёта: Код: public boolean fetch() { QueryRun subQueryRun; InventDim subInventDim; boolean rangeNotViewed; QueryRun qRun; ; rangeNotViewed = this.checkRangesNotViewed(); qRun = new QueryRun(query); while (qRun.next()) { InventSum = qRun.get(tableNum(InventSum)); InventDim = qRun.get(tableNum(InventDim)); if (rangeNotViewed) { inventSumDateValueReportDim = null; subQueryRun = this.subQueryRun(InventSum, InventDim); while (subQueryRun.next()) { subInventDim = subQueryRun.get(tableNum(InventDim)); if (! inventSumDateValueReportDim) { inventSumDateValueReportDim = InventSumDateValueReportDim::newParameters( inventDimReport.parmPerDate(), inventSum.ItemId, subInventDim, inventDimReport.parmInventDimParm() ); } else { inventSumDateValueReportDim.parmInventDim(subInventDim); inventSumDateValueReportDim.init(); } } } else { inventSumDateValueReportDim = InventSumDateValueReportDim::newParameters( inventDimReport.parmPerDate(), inventSum.ItemId, inventDim, inventDimReport.parmInventDimParm() ); } if (this.printLine() && inventSumDateValueReportDim) { this.send(InventSum); this.send(InventDim); } } return true; } Хотя есть ещё метод subQueryRun, но он работает для каждой строки (думаю этот метод не подходит). Вот код этого метода: Код: queryRun subQueryRun(InventSum _inventSum, InventDim _inventDim) { QueryRun subQueryRun; QueryBuildDataSource subQbdsDim; QueryBuildDataSource subQbdsSum; QueryBuildRange rangeItemId; Counter h; FieldId x,y; ; subQbdsDim = subQuery.dataSourceTable(tableNum(InventDim)); subQbdsSum = subQuery.dataSourceTable(tableNum(InventSum)); for (h=1; h<=subQbdsDim.rangeCount(); h++) { y = fieldName2Id(tableNum(InventDim),subQbdsDim.range(h).name()); x = InventDim::dim2dimParm(y); if (conFind(subFieldList,y)) { if (subQbdsDim.range(h)) { subQbdsDim.addSortField(y); subQbdsDim.orderMode(OrderMode::GroupBy); } if (_inventDim.(y)) subQbdsDim.range(h).value(_inventDim.(y)); else if ( inventDimReport.parmInventDimParm().(x) && !_inventDim.(y) && !subQbdsDim.range(h).value()) subQbdsDim.range(h).value(SysQuery::valueEmptyString()); } } rangeItemId = subQbdsSum.findRange(fieldNum(InventSum,ItemId)); if (! rangeItemId) subQbdsSum.addRange(fieldNum(InventSum,ItemId)); rangeItemId.value(strfmt('"%1"',_inventSum.ItemId)); subQueryRun = new QueryRun(subQuery); return subQueryRun; } |
|
02.11.2005, 08:36 | #6 |
Участник
|
Изменения в методе fetch:
Код: public boolean fetch() { QueryRun subQueryRun; InventDim subInventDim; boolean rangeNotViewed; QueryRun qRun; //--->>>tumev QueryBuildDataSource subQbdsTable; //<<<---tumev ; rangeNotViewed = this.checkRangesNotViewed(); //--->>>tumev subQbdsTable = subQuery.dataSourceTable(tableNum(InventTable)); subQbdsTable.addSortIndex(indexnum(InventTable,ItemnameIdx)); //<<<---tumev qRun = new QueryRun(query); ........... |
|
02.11.2005, 09:24 | #7 |
Участник
|
Боюсь, что в этом запросе индекс по InventName что мертвому препарка. Сортировка будет выполнена уже после объединения и агрегации данных. Точнее сортировок будет две - одна до агрегации по ItemId и другим полям объединения, а другая после агрегации по полям в Order By (впрочем это зависит от статистики на таблицах, но окончательная сотрировка будет после агрегации)
__________________
Axapta v.3.0 sp5 kr2 |
|
02.11.2005, 09:53 | #8 |
Участник
|
т.е. увеличить скорость выполнения запроса не получится ...
как узнать используется ли в запросе индекс по полю ItemID? |
|
02.11.2005, 10:07 | #9 |
Участник
|
Так по ItemId и идет выборка, точнее по кластерному индексу.
Что бы узнать планы запросов - включите трассировку запросов в Axapta'е или используйте Profiler (если у вас MS SQL)
__________________
Axapta v.3.0 sp5 kr2 |
|
02.11.2005, 10:08 | #10 |
Участник
|
к тому же назначение метода subQueryRun весьма сомнительно ...
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
Запасы в наличии в OLAP | 1 | |||
Фильтрация в форме "В наличии" по агрегатному полю "Физ. наличие" | 13 | |||
Сортировка в запросе "В Наличии" | 16 | |||
Дата физ. проводки | 4 | |||
Русская локализация Axapta 3 ? | 59 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|