外连接条件x ++

时间:2014-06-25 18:36:23

标签: axapta x++ ax

我正在尝试编写一个基于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条件置于外部联接中,然后返回InventTable中的第一行。

有谁知道如何在X ++中使用它?

1 个答案:

答案 0 :(得分:2)

如果使用AX 2012,则必须使用QueryQueryRun,然后使用query expression将您的or-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版本中,您可以创建视图,然后使用addRange方法使用查询表达式查询视图。