高级查询范围

use*_*036 6 x++ axapta

如何使用高级过滤(使用x ++)在Ax中进行查询:

我想在SalesTable表单上显示这样的过滤条件SalesTable.SalesId == "001" || SalesLine.LineAmount == 100.

那么结果应该显示SalesOrder 001和其他salesOrders至少有一个SalesLine与LineAmount = 100?

Jan*_*sen 8

AX select语句支持存在连接,例如:

 while select salesTable
     exits join salesLine
     where salesLine.SalesId == salesTable.SalesId &&
           salesLine.LineAmount == 100
Run Code Online (Sandbox Code Playgroud)

X ++不支持exists子句作为子句中的子查询where.因此不可能exists与之结合表达or.

但是AX支持查询中的查询表达式.

因此,您的查询应该可以这样表达:

static void TestQuery(Args _args)
{
    SalesTable st;
    QueryRun qr = new QueryRun(new Query());
    QueryBuildDataSource qst = qr.query().addDataSource(tableNum(SalesTable));
    QueryBuildDataSource qsl = qst.addDataSource(tableNum(SalesLine));
    str qstr = strFmt('((%1.SalesId == "%2") || (%3.LineAmount == %4))',
                      qst.name(), queryValue("001"),
                      qsl.name(), queryValue(100));
    qsl.relations(true);  // Link on SalesId
    qsl.joinMode(JoinMode::ExistsJoin);
    qsl.addRange(fieldNum(SalesLine,RecId)).value(qstr);
    info(qstr);           // This is the query expression
    info(qst.toString()); // This is the full query
    while (qr.next())
    {
        st = qr.get(tableNum(SalesTable));
        info(st.SalesId);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果销售订单001不包含行,则不会选择它.除此之外,输出是您所要求的:

((SalesTable_1.SalesId =="001")||(SalesLine_1.LineAmount == 100))

SELECT FIRSTFAST*FROM SalesTable EXISTS JOIN FIRINFAST*FROM SalesLine WHERE SalesTable.SalesId = SalesLine.SalesId AND((((SalesTable_1.SalesId =="001")||(SalesLine_1.LineAmount == 100))))

001

125

175


10p*_*10p 8

如果销售订单'001'只有在有销售线的情况下才能选择,那么Jan的解决方案可以正常工作.如果它没有线条,它将不会出现在输出中.

如果对您来说重要的是销售订单'001'应始终出现在输出中,即使它没有销售线,您也可以通过union进行,如下所示:

static void AdvancedFiltering(Args _args)
{
    Query q;
    QueryRun qr;
    QueryBuildDataSource qbds;
    SalesTable salesTable;
    ;

    q = new Query();
    q.queryType(QueryType::Union);

    qbds = q.addDataSource(tablenum(SalesTable), identifierstr(SalesTable_1));
    qbds.fields().dynamic(false);
    qbds.fields().clearFieldList();
    qbds.fields().addField(fieldnum(SalesTable, SalesId));
    qbds.addRange(fieldnum(SalesTable, SalesId)).value(queryValue('001'));

    qbds = q.addDataSource(tablenum(SalesTable), identifierstr(SalesTable_2), UnionType::Union);
    qbds.fields().dynamic(false);
    qbds.fields().clearFieldList();
    qbds.fields().addField(fieldnum(SalesTable, SalesId));

    qbds = qbds.addDataSource(tablenum(SalesLine));
    qbds.relations(true);
    qbds.joinMode(JoinMode::ExistsJoin);
    qbds.addRange(fieldnum(SalesLine, LineAmount )).value(queryValue(100));

    qr = new QueryRun(q);

    while (qr.next())
    {
        salesTable = qr.get(tablenum(SalesTable));
        info(salesTable.SalesId);
    }
}
Run Code Online (Sandbox Code Playgroud)