Дано : есть форма, на ней датасорсы 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