查询对象无法按预期工作?

时间:2012-09-07 17:46:07

标签: axapta dynamics-ax-2009 x++

此代码应该能够在任何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'))

1 个答案:

答案 0 :(得分:2)

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

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

P.S。我建议反过来做:在qbds1中使用CustInvoiceJour,在qbds2中使用CustInvoiceTrans(使用默认的fetchMode),然后你根本不会遇到这个问题。