1

此代码应该能够在任何 AX 系统(更改项目和仓库)上运行。问题是 CustInvoiceJour 有时不会被返回。奇怪的是,如果我只是做一个具有相同关系的“select custInvoiceJour”,它会找到它吗?这怎么可能?

static void Job59(Args _args)
{
    CustInvoiceTrans            custInvoiceTrans;
    CustInvoiceJour             custInvoiceJour;
    InventTable             inventTable;
    QueryBuildRange             rangeItem;
    Query                       query;
    QueryBuildDataSource        qbds1;
    QueryBuildDataSource        qbds2;
    QueryBuildDataSource        qbds3;
    QueryRun                    qr;
    ;

    query = new Query();
    qbds1 = query.addDataSource(tablenum(CustInvoiceTrans));
    qbds2 = qbds1.addDataSource(tablenum(CustInvoiceJour));
    qbds2.relations(true);

    qbds2.addRange(fieldnum(CustInvoiceJour, SalesType)).value('!' + enum2str(SalesType::ReturnItem));
    rangeItem = qbds1.addRange(fieldnum(CustInvoiceTrans, ItemId));
    qbds1.addRange(fieldnum(CustInvoiceTrans, InvoiceDate)).value(queryRange(@'8/1/2011', @'8/31/2011'));
    qbds2.orderMode(OrderMode::OrderBy);
    qbds2.addOrderByField(fieldnum(CustInvoiceJour, DlvCountryRegionId));
    qbds2.addOrderByField(fieldnum(CustInvoiceJour, DlvState));
    qbds3 = qbds1.addDataSource(tablenum(InventDim));
    qbds3.relations(true);
    qbds3.joinMode(JoinMode::ExistsJoin);
    qbds3.addRange(fieldnum(InventDim, InventLocationId)).value(SysQuery::value('FG'));


    select firstonly inventTable
        where inventTable.ItemId    == '44831';

    info (strfmt("%1", inventTable.ItemId));
    rangeItem.value(inventTable.ItemId);

    qr = new QueryRun(query);
    while (qr.next())
    {
        custInvoiceTrans    = qr.get(tablenum(CustInvoiceTrans));
        custInvoiceJour     = qr.get(tablenum(CustInvoiceJour));

        if (!custInvoiceJour)
        {
            info ("Not found");
            select firstonly custInvoiceJour
                where custInvoiceJour.SalesId               == custInvoiceTrans.SalesId     &&
                      custInvoiceJour.InvoiceId             == custInvoiceTrans.InvoiceId   &&
                      custInvoiceJour.InvoiceDate           == custInvoiceTrans.InvoiceDate &&
                      custInvoiceJour.numberSequenceGroup   == custInvoiceTrans.numberSequenceGroup;
            if (custInvoiceJour)
                info("Found it");
        }
    }
}

调试器将这些显示为查询:

NAME:
    qbds1
VALUE:
    SELECT * FROM CustInvoiceTrans ORDER BY CustInvoiceJour.DlvCountryRegionId ASC, CustInvoiceJour.DlvState ASC WHERE ((ItemId = N'44831')) AND ((InvoiceDate>={ts '2011-08-01 00:00:00.000'} AND InvoiceDate<={ts '2011-08-31 00:00:00.000'})) EXISTS JOIN * FROM InventDim WHERE CustInvoiceTrans.InventDimId = InventDim.inventDimId AND ((InventLocationId = N'FG'))

NAME:
    qbds2
VALUE:
    SELECT * FROM CustInvoiceJour WHERE CustInvoiceTrans.SalesId = CustInvoiceJour.SalesId AND CustInvoiceTrans.InvoiceId = CustInvoiceJour.InvoiceId AND CustInvoiceTrans.InvoiceDate = CustInvoiceJour.InvoiceDate AND CustInvoiceTrans.numberSequenceGroup = CustInvoiceJour.numberSequenceGroup AND ((NOT (SalesType = 4)))


NAME:
    qbds3
VALUE:
    SELECT * FROM InventDim WHERE CustInvoiceTrans.InventDimId = InventDim.inventDimId AND ((InventLocationId = N'FG'))
4

1 回答 1

2

您的 qbds1 值未显示JOIN * FROM CustInvoiceJour WHERE ...(加入 qbds2)。

添加qbds2.fetchMode(QueryFetchMode::One2One);到您的代码中,一切都应该没问题。

PS我建议反过来做:qbds1中的CustInvoiceJour和qbds2中的CustInvoiceTrans(默认fetchMode),那么你根本不会有这个问题。

于 2012-09-08T00:39:31.790 回答