AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.11.2005, 15:12   #1  
tumev is offline
tumev
Участник
 
30 / 10 (1) +
Регистрация: 12.09.2005
Сортировка отчёта о физ. наличии
Стандартный отчёт Управление запасами/ Отчёты/ Статус/ Физ. наличие/ Физ. наличие по складам содержит данные, отсортированные по артикулу номенклатуры (ItemId).
Как бы так (с минимальными трудозатратами ) отсортировать данные отчёта по наименованию номенклатуры.
Старый 01.11.2005, 17:35   #2  
tumev is offline
tumev
Участник
 
30 / 10 (1) +
Регистрация: 12.09.2005
Порядок минимальных трудозатрат:
1 Переделать порядок DataSource-ов и сделать его таким:
InventTable->InventSum->InventDim
2 В поля сортировки первой таблицы добавляется ItemName;
3 Свойство OrderMode первых двух таблиц Groupby

и всё !!! просто...
Старый 01.11.2005, 18:01   #3  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Я бы еще индекс на это поле добавил
Старый 01.11.2005, 19:25   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
И еще релейшен на InventDim (на Query в отчете)
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 01.11.2005 в 19:33.
Старый 02.11.2005, 07:40   #5  
tumev is offline
tumev
Участник
 
30 / 10 (1) +
Регистрация: 12.09.2005
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  
tumev is offline
tumev
Участник
 
30 / 10 (1) +
Регистрация: 12.09.2005
Изменения в методе 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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Боюсь, что в этом запросе индекс по InventName что мертвому препарка. Сортировка будет выполнена уже после объединения и агрегации данных. Точнее сортировок будет две - одна до агрегации по ItemId и другим полям объединения, а другая после агрегации по полям в Order By (впрочем это зависит от статистики на таблицах, но окончательная сотрировка будет после агрегации)
__________________
Axapta v.3.0 sp5 kr2
Старый 02.11.2005, 09:53   #8  
tumev is offline
tumev
Участник
 
30 / 10 (1) +
Регистрация: 12.09.2005
т.е. увеличить скорость выполнения запроса не получится ...
как узнать используется ли в запросе индекс по полю ItemID?
Старый 02.11.2005, 10:07   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Так по ItemId и идет выборка, точнее по кластерному индексу.

Что бы узнать планы запросов - включите трассировку запросов в Axapta'е или используйте Profiler (если у вас MS SQL)
__________________
Axapta v.3.0 sp5 kr2
Старый 02.11.2005, 10:08   #10  
tumev is offline
tumev
Участник
 
30 / 10 (1) +
Регистрация: 12.09.2005
к тому же назначение метода subQueryRun весьма сомнительно ...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Запасы в наличии в OLAP AlexeyBP DAX: Функционал 1 16.11.2006 12:46
Фильтрация в форме "В наличии" по агрегатному полю "Физ. наличие" miaa DAX: Программирование 13 29.08.2006 23:45
Сортировка в запросе "В Наличии" linney DAX: Программирование 16 20.01.2005 20:01
Дата физ. проводки Yprit DAX: Функционал 4 17.12.2004 15:29
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:44.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.