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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2011, 10:32   #1  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,744 / 399 (17) ++++++
Регистрация: 23.03.2006
может лучше в качестве оптимизации сделать нужные индексы, чем делать громоздкий код?
Старый 11.11.2011, 10:46   #2  
Borsugg is offline
Borsugg
Участник
 
22 / 10 (1) +
Регистрация: 09.08.2011
Цитата:
Сообщение от ice Посмотреть сообщение
может лучше в качестве оптимизации сделать нужные индексы, чем делать громоздкий код?
А если не затруднит, можно поподробнее, что под нужными индексами подразумеваете?
Старый 11.11.2011, 10:55   #3  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,744 / 399 (17) ++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от Borsugg Посмотреть сообщение
А если не затруднит, можно поподробнее, что под нужными индексами подразумеваете?
индекс по полям участвующим в запросе
За это сообщение автора поблагодарили: Borsugg (1).
Старый 11.11.2011, 11:50   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Borsugg Посмотреть сообщение
А если не затруднит, можно поподробнее, что под нужными индексами подразумеваете?
Не обязательно пытаться все впихнуть в один запрос. В смысле, получить сразу результат. Может быть проще будет анализировать выборку. Ведь вряд ли будет очень уж большое количество записей в истории изменения цен для одного артикула и склада.

X++:
FromDate fromDate = 05\01\2011;
ToDate toDate = 20\02\2011;
newPrice minNewPrice = maxInt();
;

while select NewPrice, TransDate
	from RetailItemPriceHistory
	order by TransDate desc
	where RetailItemPriceHistory.ItemId            ==  itemId
		&& RetailItemPriceHistory.InventLocationId  ==  InventLocationId
		&& RetailItemPriceHistory.TransDate         <=  toDate
		&& RetailItemPriceHistory.NewPrice
{
	minNewPrice = min(minNewPrice, RetailItemPriceHistory.NewPrice);
	// Сравнение с начальной датой ПОСЛЕ вычисления значения
	// чтобы учесть цену, указанную ДО начальной даты
	if (RetailItemPriceHistory.TransDate <= fromDate)
	{
		break;
	}
}

if (minNewPrice == maxInt())
{
	// На дату окончания периода нет цены
	minNewPrice = 0;
}
Если же все-таки хочется все в одном запросе, то проблема заключается в том, что необходимо уточнить дату начала периода. Т.е. изменить начальную дату, если в истории есть запись с датой меньше указанной, но нет записи с датой равной указанной.

X++:
FromDate fromDate = 05\01\2011;
ToDate toDate = 20\02\2011;
;

// Уточняем "начальную дату"
select firstonly TransDate
from RetailItemPriceHistory
order by TransDate desc
where RetailItemPriceHistory.ItemId            ==  itemId
	&& RetailItemPriceHistory.InventLocationId  ==  InventLocationId
	&& RetailItemPriceHistory.TransDate         <=  fromDate 
	&& RetailItemPriceHistory.NewPrice;

// Если есть запись с датой меньше начальной и нет записи с датой
// равной начальной, то начальной датой считаем найденное значение
if (RetailItemPriceHistory.TransDate < fromDate)
{
	fromDate = RetailItemPriceHistory.TransDate;
}

// Теперь собственно запрос
select minOf(NewPrice) 
from RetailItemPriceHistory
where  RetailItemPriceHistory.ItemId            ==  itemId
	&& RetailItemPriceHistory.InventLocationId  ==  InventLocationId
	&& RetailItemPriceHistory.TransDate         >=  fromDate
	&& RetailItemPriceHistory.TransDate         <=  toDate
	&& RetailItemPriceHistory.NewPrice;
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Borsugg (1).
Старый 11.11.2011, 12:14   #5  
Borsugg is offline
Borsugg
Участник
 
22 / 10 (1) +
Регистрация: 09.08.2011
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Если же все-таки хочется все в одном запросе, то проблема заключается в том, что необходимо уточнить дату начала периода. Т.е. изменить начальную дату, если в истории есть запись с датой меньше указанной, но нет записи с датой равной указанной.
Вот я и тоже ж пытался найти начальную дату, да и не туда ушел. У вас все просто и понятно.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Не обязательно пытаться все впихнуть в один запрос. В смысле, получить сразу результат. Может быть проще будет анализировать выборку. Ведь вряд ли будет очень уж большое количество записей в истории изменения цен для одного артикула и склада.
И первый вариант красивый, даже теперь незнаю какой выбрать)) Будем тестить
Спасибо всем за помощь!
Старый 13.11.2011, 13:11   #6  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
А если так?

X++:
FromDate                fromDate = 05\01\2011;
ToDate                  toDate = 20\02\2011;
ItemId                  itemId = ...;
InventLocationId        inventLocationId = ...
RetailItemPriceHistory  retailItemPriceHistory;
RetailItemPriceHistory  retailItemPriceHistoryJoin;

select minof(NewPrice) from retailItemPriceHistory
    where retailItemPriceHistory.ItemId             == itemId           &&
          retailItemPriceHistory.InventLocationId   == inventLocationId &&
          retailItemPriceHistory.TransDate          <= toDate
notexists join retailItemPriceHistoryJoin
    where retailItemPriceHistoryJoin.ItemId             == retailItemPriceHistory.ItemId            &&
          retailItemPriceHistoryJoin.InventLocationId   == retailItemPriceHistory.InventLocationId  &&
          retailItemPriceHistoryJoin.TransDate          >  retailItemPriceHistory.TransDate         &&
          retailItemPriceHistoryJoin.TransDate          <= fromDate;
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Теги
retailitempricehistory, запрос (query)

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Поиск набором в выпадающем списке.. propeller DAX: Программирование 0 04.04.2011 17:31
Поиск сотрудников по наименованию (ФИО) в AX 2009 propeller DAX: Программирование 12 15.11.2010 12:42
"поиск" braathe DAX: Программирование 6 24.03.2006 13:07
Поиск по подстроке JohNick DAX: Программирование 8 06.03.2004 22:24
Поиск по полю временной таблицы Swetik DAX: Программирование 2 10.12.2003 11:35
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:28.