27.02.2012, 16:36 | #1 |
Сенбернар
|
Борьба с 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 |
MCITP
|
Привет
Когда-то долго и мучительно боролся с подобным поведением при решении практически идентичной задачи Но у меня почему-то проблема всплывала не с процентом, а с датой (в вашем случае сегодняшней). Вместо неё тоже непойми что уходио в запрос. Победил это только тем, что присоединил в запрос таблицу с нужной мне датой. В моём случае это было можно сделать. В вашем случае, если это параметр на форме - выкрутится будет сложнее, но можно. (Добавить типа Parm-таблицы, для текущей сессии, куда всунуть дату и процент) Попробуйте, думаю поможет.
__________________
Zhirenkov Vitaly |
|
27.02.2012, 18:23 | #3 |
MCTS
|
а 2.5 случаем не 10 отправит в запрос?
Похоже на косяк приведения типов (real to ???) Попробуйте 20*Applicationtime_OK/100, т.е. избавьтесь от real Или явно опишите 0.2 как real переменную
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
|
За это сообщение автора поблагодарили: RVS (1). |
28.02.2012, 14:10 | #4 |
Сенбернар
|
Точно Как-то там все не очень хорошо, с этим преобразованием
Все чуть веселее было, эти 20 - тоже переменная, типа Real. Заработало только после преобразования её, переменной, в Int. Без долей процента пользователь обойдется
__________________
Best Regards, Roman |
|
|
|