2012-09-07 36 views
1

此代码应该能够在任何AX系统上运行(更改项目&仓库)。问题是CustInvoiceJour有时没有被返回。奇怪的是,如果我只是做一个“选择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')) 

回答

2

你qbds1值不显示JOIN * FROM CustInvoiceJour WHERE ...(加入qbds2)。

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

P.S.我会建议以相反的方式来完成:qinlice中的CustInvoiceJour和qbds2中的CustInvoiceTrans(使用默认的fetchMode),那么你根本就没有这个问题。

+0

我实际上正在修复/调试一些预先存在的代码。我认为逻辑是,因为我们正在线上搜索项目,所以从行开始。奇怪的是CustInvoiceJour在一半时间内被退回。感谢你! –