X++ QueryBuilder 嵌套结果

X++ QueryBuilder Nested Results

我有一个查询使用销售 Table 和销售线 table 作为查询的数据源(感谢所有提供帮助的人!)。在查询 运行 部分,如果销售订单附加了多个销售行,我如何循环销售行的结果?

static void TestQuery(Args _args)

{

    SalesTable salesTable;
    SalesLine salesLine;
    QueryBuildRange      querybuildrange;
    utcDateTime          mutcDateTime;
    date                 mDate;

    QueryRun queryrun = new QueryRun(new Query());
    QueryBuildDataSource datasourceA = queryrun.query().addDataSource(tableNum(SalesTable));
    QueryBuildDataSource datasourceB = datasourceA.addDataSource(tableNum(SalesLine));

    mDate        = str2Date("25/09/2016", 123);
    mutcDateTime = DateTimeUtil::newDateTime(mDate,0);
    querybuildrange = datasourceA.addRange(FieldNum(SalesTable, CreatedDateTime));
    querybuildrange.value(strFmt('>%1', mutcDateTime));

    datasourceB.relations(true);  // Link on SalesId
    datasourceB.joinMode(JoinMode::ExistsJoin);

    info(datasourceA.toString());      // This is the full query

    while (queryrun.next())
    {
        salesTable = queryrun.get(tableNum(SalesTable));
        salesLine = queryrun.get(tableNum(SalesLine));
        info(salesTable.SalesId);
        info(salesline.Name);
    }
}

当你需要使用 InnerJoin 时,你正在使用 ExistsJoins

更改此行

datasourceB.joinMode(JoinMode::ExistsJoin);

datasourceB.joinMode(JoinMode::InnerJoin);

此外,您可以使用 queryRun.changed(...) 方法来检查记录何时更改。像这样:

while (queryrun.next())
{
    if (queryrun.changed(tableNum(SalesTable)))
    {
        salesTable = queryrun.get(tableNum(SalesTable));
    }

    salesLine = queryrun.get(tableNum(SalesLine));
    info(salesTable.SalesId);
    info(salesline.Name);
}