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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2011, 09:58   #1  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
можно сделать одним запросом

X++:
select firstonly NewPrice from RetailItemPriceHistory
    order by NewPrice
    where  RetailItemPriceHistory.ItemId            ==  itemId
          && RetailItemPriceHistory.InventLocationId  ==  InventLocationId
          && RetailItemPriceHistory.TransDate         >=  "05.01.2011"
          && RetailItemPriceHistory.TransDate         <=  "20.02.2011"
          && RetailItemPriceHistory.NewPrice
join firstonly NewPrice from RetailItemPriceHistory2
    order by TransDate desc
    where  RetailItemPriceHistory2.ItemId                ==  RetailItemPriceHistory.ItemId
          && RetailItemPriceHistory2.InventLocationId  ==  RetailItemPriceHistory.InventLocationId
          && RetailItemPriceHistory2.TransDate           <    "05.01.2011";

return min(RetailItemPriceHistory.NewPrice, RetailItemPriceHistory2.NewPrice);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 11.11.2011, 09:59   #2  
Borsugg is offline
Borsugg
Участник
 
22 / 10 (1) +
Регистрация: 09.08.2011
Цитата:
Сообщение от lev Посмотреть сообщение
можно сделать одним запросом

Ммм, а в таком случае RetailItemPriceHistory вернет первую цену, а не минимальную за период =)
Старый 11.11.2011, 10:03   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Borsugg Посмотреть сообщение
Ммм, а в таком случае RetailItemPriceHistory вернет первую цену, а не минимальную за период =)
Там же сделана сортировка по цене по умолчанию она "ASC" - от сюда следут, что будет возвращена минимальная цена в периоде (если это не так и тест это подтверждает, напишите плиз)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 11.11.2011, 10:07   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
можно сделать одним запросом
Теоретически может так оказаться, что одна из частей запроса не найдёт не одной записи (например период в которм ищем минимальную цену начинается раньше чем первая запись о цене). И тогда джойн не вернёт ничего.

В случае с двумя запросами, перед тем как искать минимум среди двух результатов нужно принудительно проверить что результаты не пусты.

Последний раз редактировалось S.Kuskov; 11.11.2011 в 10:14.
Старый 11.11.2011, 10:16   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Теоретически может так оказаться, что вторая часть запроса не найдёт не одной записи (например период в которм ищем минимальную цену насчинается раньше чем первая запись о цене). И тогда джойн не вернёт ничего.
да, такое возможно... я думаю что можно это будет учесть. в начале выбрать с помощью джойна, если там ничего не нашлось, тогда получается что достаточно сделать один запрос с указанием периода. он и найдет минимальную цену. Т.е. в итоге метод получится что то типа:
X++:
....
Price    returnPrice;
;

select firstonly NewPrice from RetailItemPriceHistory
    order by NewPrice
    where  RetailItemPriceHistory.ItemId            ==  itemId
          && RetailItemPriceHistory.InventLocationId  ==  InventLocationId
          && RetailItemPriceHistory.TransDate         >=  "05.01.2011"
          && RetailItemPriceHistory.TransDate         <=  "20.02.2011"
          && RetailItemPriceHistory.NewPrice
join firstonly NewPrice from RetailItemPriceHistory2
    order by TransDate desc
    where  RetailItemPriceHistory2.ItemId                ==  RetailItemPriceHistory.ItemId
          && RetailItemPriceHistory2.InventLocationId  ==  RetailItemPriceHistory.InventLocationId
          && RetailItemPriceHistory2.TransDate           <    "05.01.2011";

if (RetailItemPriceHistory.RecId != 0)
    returnPrice = min(RetailItemPriceHistory.NewPrice, RetailItemPriceHistory2.NewPrice);
else
{
    select minOf(NewPrice) from RetailItemPriceHistory
                                where  RetailItemPriceHistory.ItemId            ==  itemId
                                    && RetailItemPriceHistory.InventLocationId  ==  InventLocationId
                                    && RetailItemPriceHistory.TransDate         >=  "05.01.2011"
                                    && RetailItemPriceHistory.TransDate         <=  "20.02.2011"
                                    && RetailItemPriceHistory.NewPrice;   

    returnPrice = RetailItemPriceHistory.NewPrice;
}

return returnPrice;
P.S. в общем конечно этот вариант надо обдумывать с тестированием (гонять на разных вариантах), тогда в итоге можно получить наиболее сбалансированный результат
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: Borsugg (1).
Старый 11.11.2011, 10:26   #6  
Borsugg is offline
Borsugg
Участник
 
22 / 10 (1) +
Регистрация: 09.08.2011
Цитата:
Сообщение от lev Посмотреть сообщение
да, такое возможно... я думаю что можно это будет учесть. в начале выбрать с помощью джойна, если там ничего не нашлось, тогда получается что достаточно сделать один запрос с указанием периода. он и найдет минимальную цену. Т.е. в итоге метод получится что то типа:
X++:
....
....
if (RetailItemPriceHistory.RecId != 0)
    returnPrice = min(RetailItemPriceHistory.NewPrice, RetailItemPriceHistory2.NewPrice);
else
{
    select minOf(NewPrice) from RetailItemPriceHistory
                                where  RetailItemPriceHistory.ItemId            ==  itemId
                                    && RetailItemPriceHistory.InventLocationId  ==  InventLocationId
                                    && RetailItemPriceHistory.TransDate         >=  "05.01.2011"
                                    && RetailItemPriceHistory.TransDate         <=  "20.02.2011"
                                    && RetailItemPriceHistory.NewPrice;   

    returnPrice = RetailItemPriceHistory.NewPrice;
}

return returnPrice;
P.S. в общем конечно этот вариант надо обдумывать с тестированием (гонять на разных вариантах), тогда в итоге можно получить наиболее сбалансированный результат
А если RetailItemPriceHistory.RecId и так ничего не вернул в первом запросе с join'ом, то скорее же всего и второй запрос тоже ничего не вернет? Условия выборки то одинаковые...

Последний раз редактировалось Borsugg; 11.11.2011 в 10:29.
Старый 11.11.2011, 10:29   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
да, такое возможно... я думаю что можно это будет учесть. в начале выбрать с помощью джойна, если там ничего не нашлось, тогда получается что достаточно сделать один запрос с указанием периода. он и найдет минимальную цену.
пустой может оказаться и первая часть запроса (например когда цена уже год не менялась, а мы ищем минимум за последний месяц)
Старый 11.11.2011, 10:46   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
пустой может оказаться и первая часть запроса (например когда цена уже год не менялась, а мы ищем минимум за последний месяц)
смотри мое P.S. я же говорю, нужно все варианты обдумать и протестить. с джойном я предложил как вариант, что бы не писать по 10 запросов если этот вариант не подходит, то его нужно выкинуть в корзину

Цитата:
Сообщение от Borsugg
А если RetailItemPriceHistory.RecId и так ничего не вернул в первом запросе с join'ом, то скорее же всего и второй запрос тоже ничего не вернет? Условия выборки то одинаковые...
нет, первый запрос с джойном ничего не вернет, если нет записей в истории с датой ранее начальной датой периода поиска.
второй запрос вернет если в заданном периоде есть записи.
это разные выборки.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 11.11.2011, 10:48   #9  
Borsugg is offline
Borsugg
Участник
 
22 / 10 (1) +
Регистрация: 09.08.2011
Цитата:
Сообщение от lev Посмотреть сообщение
нет, первый запрос с джойном ничего не вернет, если нет записей в истории с датой ранее начальной датой периода поиска.
второй запрос вернет если в заданном периоде есть записи.
это разные выборки.
Тобишь джойн отработает как INNER JOIN в SQL. Понятно)
Теги
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, время: 13:40.