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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.02.2012, 16:36   #1  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Борьба с Query Extended Range. Он пока побеждает...
Дано : есть форма, на ней датасорсы InventTable - InventSum - InventDim. Показывает AvailPhysical по каждой номенклатуре - аналитике, формирует строки Заказа на перемещение.

Форма работает, с задачей своей прекрасно справляется.

Задача : добавить возможность вызова той же формы с параметром "Процент срока годности (номенклатуры)", с тем, чтобы показываемое AvailPhysical соответствовало этому критерию (то есть если, например, "Процент срока годности" = 50 - показывалось бы только то кол-во, у которого срок годности истек наполовину или менее).

Решение : присобачиваем к запросу еще один датасорс (InventBatch), добавляем Range по InventBatch.ExpDate. Все просто, казалось бы.

Дальше начинается цирк.

Сам Range имеет следующий вид:
X++:
    qbr  = qbds.addRange(fieldNum(InventBatch, ExpDate));

    rangeValue = strfmt('(%1.ExpDate >= ((%2 + ((%3)* (%4.Applicationtime_OK))))) and (%1.ItemId == %5.ItemId)',
                        q.dataSourceTable(tableNum(InventBatch)).name(),
                        date2StrXpp(today()),
                        0.2,             // <<<--- Тот самый Процент срока годности, 20% / 100
                        q.dataSourceTable(tableNum(InventTable)).name(),
                        q.dataSourceTable(tableNum(InventSum)).name()
                       );
При выполнении имею следующее:

1. Вывод запроса Axapta в Infolog дает:

SELECT FIRSTFAST * FROM
InventTable GROUP BY InventTable.ItemId ASC, InventTable.ItemName ASC, InventTable.Applicationtime_OK ASC
JOIN FIRSTFAST * FROM
InventSum GROUP BY InventSum.AvailPhysical ASC WHERE InventTable.ItemId = InventSum.ItemId
JOIN FIRSTFAST * FROM
InventDim WHERE InventSum.InventDimId = InventDim.inventDimId
JOIN FIRSTFAST * FROM
InventBatch GROUP BY InventBatch.inventBatchId ASC, InventBatch.expDate ASC
WHERE (((InventBatch_1.ExpDate >= ((27\02\2012 + ((0.2) * (InventTable_1.Applicationtime_OK))))) and (InventBatch_1.ItemId == InventSum_1.ItemId)))

, то есть как бы все хорошо. Передали 0.2, и в запросе тоже 0.2.

2. Трассировка SQL дает, соответственно:

SELECT
A.ITEMID,A.ITEMNAME,A.APPLICATIONTIME_OK,
B.AVAILPHYSICAL,
D.INVENTBATCHID,
D.EXPDATE

FROM
INVENTTABLE A,
INVENTSUM B,
INVENTDIM C,
INVENTBATCH D

WHERE (A.DATAAREAID=N'ok') AND ((B.DATAAREAID=N'ok') AND (A.ITEMID=B.ITEMID)) AND ((C.DATAAREAID=N'ok') AND (B.INVENTDIMID=C.INVENTDIMID)) AND ((D.DATAAREAID=N'ok')

AND (D.EXPDATE>=({ts '2012-02-27 00:00:00.000'}+(255*A.APPLICATIONTIME_OK))))

GROUP BY A.ITEMID,A.ITEMNAME,A.APPLICATIONTIME_OK,B.AVAILPHYSICAL,D.INVENTBATCHID,D.EXPDATE
ORDER BY A.ITEMID,A.ITEMNAME,A.APPLICATIONTIME_OK,B.AVAILPHYSICAL,D.INVENTBATCHID,D.EXPDATE

, и вот этого я уже не понимаю... Передавали, вроде, не 255 вовсе...

Any idea?

Экспериментально наблюдено, что 0.1 = 255, 0.2 = 255, 1.2 = 0 (???)
---
DAX2009 Kernel 5.0.1500.4570 Application 5.0.1500.4570
__________________
Best Regards,
Roman
Старый 27.02.2012, 17:48   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Привет

Когда-то долго и мучительно боролся с подобным поведением при решении практически идентичной задачи
Но у меня почему-то проблема всплывала не с процентом, а с датой (в вашем случае сегодняшней). Вместо неё тоже непойми что уходио в запрос.

Победил это только тем, что присоединил в запрос таблицу с нужной мне датой.
В моём случае это было можно сделать.

В вашем случае, если это параметр на форме - выкрутится будет сложнее, но можно.
(Добавить типа Parm-таблицы, для текущей сессии, куда всунуть дату и процент)

Попробуйте, думаю поможет.
__________________
Zhirenkov Vitaly
Старый 27.02.2012, 18:23   #3  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
а 2.5 случаем не 10 отправит в запрос?

Похоже на косяк приведения типов (real to ???)

Попробуйте 20*Applicationtime_OK/100, т.е. избавьтесь от real

Или явно опишите 0.2 как real переменную
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
За это сообщение автора поблагодарили: RVS (1).
Старый 28.02.2012, 14:10   #4  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от Russland Посмотреть сообщение
Похоже на косяк приведения типов (real to ???)
Точно Как-то там все не очень хорошо, с этим преобразованием
Цитата:
Сообщение от Russland Посмотреть сообщение
Попробуйте 20*Applicationtime_OK/100, т.е. избавьтесь от real
Все чуть веселее было, эти 20 - тоже переменная, типа Real. Заработало только после преобразования её, переменной, в Int. Без долей процента пользователь обойдется
__________________
Best Regards,
Roman
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dates In An Extended Query Range Blog bot DAX Blogs 4 15.12.2011 10:50
sumitax: AX Queries – Passing query range as parameter Blog bot DAX Blogs 0 29.06.2011 13:11
msdax: How to Specify Range Values on a Query in a AX SSRS Report - AX Support - Site Home - MSDN Blogs Blog bot DAX Blogs 0 31.03.2011 11:11
emeadaxsupport: Passing UtcDateTime values in extended query syntax Blog bot DAX Blogs 0 10.05.2010 21:05
axaptafreak: Label for Query Range cannot be modified (still) Blog bot DAX Blogs 2 25.07.2007 10:09

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

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

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