|
|
#1 |
|
Участник
|
Сортировка отчёта о физ. наличии
Стандартный отчёт Управление запасами/ Отчёты/ Статус/ Физ. наличие/ Физ. наличие по складам содержит данные, отсортированные по артикулу номенклатуры (ItemId).
Как бы так (с минимальными трудозатратами ) отсортировать данные отчёта по наименованию номенклатуры.
|
|
|
|
|
#2 |
|
Участник
|
Порядок минимальных трудозатрат:
1 Переделать порядок DataSource-ов и сделать его таким: InventTable->InventSum->InventDim 2 В поля сортировки первой таблицы добавляется ItemName; 3 Свойство OrderMode первых двух таблиц Groupby и всё !!! просто... |
|
|
|
|
#3 |
|
Moderator
|
Я бы еще индекс на это поле добавил
|
|
|
|
|
#4 |
|
Участник
|
И еще релейшен на InventDim (на Query в отчете)
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 01.11.2005 в 19:33. |
|
|
|
|
#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;
} |
|
|
|
|
#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);
...........
|
|
|
|
|
#7 |
|
Участник
|
Боюсь, что в этом запросе индекс по InventName что мертвому препарка. Сортировка будет выполнена уже после объединения и агрегации данных. Точнее сортировок будет две - одна до агрегации по ItemId и другим полям объединения, а другая после агрегации по полям в Order By (впрочем это зависит от статистики на таблицах, но окончательная сотрировка будет после агрегации)
__________________
Axapta v.3.0 sp5 kr2 |
|
|
|
|
#8 |
|
Участник
|
т.е. увеличить скорость выполнения запроса не получится ...
как узнать используется ли в запросе индекс по полю ItemID? |
|
|
|
|
#9 |
|
Участник
|
Так по ItemId и идет выборка, точнее по кластерному индексу.
Что бы узнать планы запросов - включите трассировку запросов в Axapta'е или используйте Profiler (если у вас MS SQL)
__________________
Axapta v.3.0 sp5 kr2 |
|
|
|
|
#10 |
|
Участник
|
к тому же назначение метода subQueryRun весьма сомнительно ...
|
|
|
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| Запасы в наличии в OLAP | 1 | |||
| Фильтрация в форме "В наличии" по агрегатному полю "Физ. наличие" | 13 | |||
| Сортировка в запросе "В Наличии" | 16 | |||
| Дата физ. проводки | 4 | |||
| Русская локализация Axapta 3 ? | 59 | |||
|