我正在尝试编写一个查询,根据 ItemId 或商品条形码检索商品。
这是使用 x++、Dynamics AX 2012 R2
select firstOnly * from inventTable
where (inventTable.ItemId == _upc || inventItemBarcode.itemBarCode == _upc)
outer join inventItemBarcode
where inventItemBarcode.itemId == inventTable.ItemId;
当它被翻译成 sql 时,结果是......
FROM INVENTTABLE T1 LEFT
OUTER
JOIN INVENTITEMBARCODE T2 ON (((T2.PARTITION=?)
AND (T2.DATAAREAID=?))
AND (T1.ITEMID=T2.ITEMID))
WHERE (((T1.PARTITION=?)
AND (T1.DATAAREAID=?))
AND (T1.ITEMID=?))
您可以看到最后一行完全省略了 OR 条件。
我尝试像这样编写查询
select firstOnly * from inventTable
outer join inventItemBarcode
where
//join
inventItemBarcode.itemId == inventTable.ItemId
//ilc
&& (inventTable.ItemId == _upc
|| inventItemBarcode.itemBarCode == _upc);
但它将外连接中的 OR 条件置于 ON,然后返回 InventTable 中的第一行。
有人知道如何在 X++ 中实现此功能吗?
最佳答案
如果使用 AX 2012,您将必须使用 Query和 QueryRun相反,然后将您的 or 表达式添加为 query expression使用addQueryFilter .
static void Job117(Args _args)
{
str search = "5705050765989";
QueryRun qr = new QueryRun(new Query());
QueryBuildDataSource ds1 = qr.query().addDataSource(tableNum(InventTable));
QueryBuildDataSource ds2 = ds1.addDataSource(tableNum(InventItemBarcode));
str qstr1 = '((%1.%2 == "%5") || (%3.%4 == "%5"))';
str qstr2 = strFmt(qstr1, ds1.name(), fieldStr(InventTable,ItemId),
ds2.name(), fieldStr(InventItemBarcode,ItemBarCode),
queryValue(search));
qr.query().addQueryFilter(ds1, fieldStr(InventTable,ItemId)).value(qstr2);
ds2.joinMode(JoinMode::OuterJoin);
ds2.relations(true);
info(qstr2);
info(ds1.toString());
while (qr.next())
info(strFmt("%1", qr.getNo(1).RecId));
}
在之前的 AX 版本中,您可以创建 View ,然后使用 addRange 使用查询表达式查询 View 。方法。
关于axapta - 带有 where 条件 x++ 的外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416088/