Axapta 检查供应商在过去X天内是否在Dynamics AX中的所有公司之间有任何交易

Axapta 检查供应商在过去X天内是否在Dynamics AX中的所有公司之间有任何交易,axapta,x++,dynamics-ax-2012-r2,Axapta,X++,Dynamics Ax 2012 R2,我正试图写一份乍一看似乎相当直截了当的报告。然而,经过多次尝试,我正在努力找到一种有效的方法。 我们在VendTable中有大约350K条记录,但供应商在26家公司中重复,因此实际上有大约13K个唯一的供应商帐户 我试图写一份报告,返回自某个日期以来没有采购订单、发票和付款购买表、VendInvoiceJour和VendTable的任何供应商 对我来说,最复杂的部分是,所有键都包含dataareaid,但我希望我的查询独立于此运行。我不是说crossCompany,因为对于一个供应商,它最多会返

我正试图写一份乍一看似乎相当直截了当的报告。然而,经过多次尝试,我正在努力找到一种有效的方法。 我们在VendTable中有大约350K条记录,但供应商在26家公司中重复,因此实际上有大约13K个唯一的供应商帐户

我试图写一份报告,返回自某个日期以来没有采购订单、发票和付款购买表、VendInvoiceJour和VendTable的任何供应商

对我来说,最复杂的部分是,所有键都包含dataareaid,但我希望我的查询独立于此运行。我不是说crossCompany,因为对于一个供应商,它最多会返回26条记录,因为它在数据库中存在26次。 要明确的是,如果供应商A在任何公司都有采购订单,我根本不希望在我的结果集中返回供应商A

我已经尝试过使用AccountNum上+下面的查询在AOT上执行此操作,因此生成的sql查询会从子查询中删除dataareaid,但生成的sql嵌套不存在,因此NOT会取消,从而导致意外和不正确的结果

X++代码

while select crossCompany AccountNum, InvoiceAccount, NBDCMMSAllowInvoices, VendGroup, Party
    from vendTable
    group by AccountNum, InvoiceAccount, Party, VendGroup, NBDCMMSAllowInvoices
    where vendTable.Blocked != CustVendorBlocked::All
        notExists join * from purchTable WHERE
                purchTable.OrderAccount == vendTable.AccountNum+''
             && purchTable.createdDateTime > cutoffDate
        notExists join * from vendTrans
        where vendTrans.AccountNum == vendTable.accountNum+''
             && vendTrans.TransDate > cutoffDateTrans
        notExists join * from vendInvoiceJour
        where vendInvoiceJour.InvoiceAccount == vendTable.accountNum+''
             && vendInvoiceJour.InvoiceDate > cutoffDateTrans
结果SQL:

SELECT T1.ACCOUNTNUM,T1.INVOICEACCOUNT,T1.NBDCMMSALLOWINVOICES,T1.VENDGROUP,T1.PARTY,T1.DATAAREAID,T1.RECID 
FROM VENDTABLE T1 WHERE ((T1.PARTITION = PartitionID) AND (T1.BLOCKED <> 2)) 
AND NOT (EXISTS (SELECT 'x' FROM PURCHTABLE T2 WHERE 
                ((T2.PARTITION = PartitionID) AND     ((T2.ORDERACCOUNT=T1.ACCOUNTNUM AND (T2.DATAAREAID = T1.DATAAREAID) AND     (T2.PARTITION = T1.PARTITION)) AND (T2.CREATEDDATETIME>?))) 
                AND NOT (EXISTS (SELECT 'x' FROM VENDTRANS T3 WHERE 
                                ((T3.PARTITION = PartitionID) AND ((T3.ACCOUNTNUM=T1.ACCOUNTNUM AND (T3.DATAAREAID = T1.DATAAREAID) AND (T3.PARTITION = T1.PARTITION)) AND (T3.TRANSDATE>?)))
                                AND NOT (EXISTS (SELECT 'x' FROM VENDINVOICEJOUR T4 WHERE 
                                                ((T4.PARTITION = PartitionID) AND ((T4.INVOICEACCOUNT=T1.ACCOUNTNUM AND (T4.DATAAREAID = T1.DATAAREAID) AND (T4.PARTITION = T1.PARTITION)) AND (T4.INVOICEDATE>?)))
                                                )
                                        )
                                )
                        )
                )
        ) GROUP BY T1.ACCOUNTNUM,T1.INVOICEACCOUNT,T1.NBDCMMSALLOWINVOICES,T1.VENDGROUP,T1.PARTY ORDER BY T1.ACCOUNTNUM,T1.INVOICEACCOUNT,T1.NBDCMMSALLOWINVOICES,T1.VENDGROUP,T1.PARTY

那些嵌套的不存在的连接正在引起我的悲伤。有没有办法解决这个问题,或者可能有一种完全不同的方法?

我想您不能使用查询

Query                   q;
QueryBuildDataSource    qbdsVendTable;
QueryBuildDataSource    qbds;
QueryRun                qr;

q = new Query();
q.allowCrossCompany(true);

qbdsVendTable = q.addDataSource(tableNum(VendTable));
qbdsVendTable.addSelectionField(fieldNum(VendTable, AccountNum));
qbdsVendTable.addSelectionField(fieldNum(VendTable, InvoiceAccount));
qbdsVendTable.addSelectionField(fieldNum(VendTable, NBDCMMSAllowInvoices));
qbdsVendTable.addSelectionField(fieldNum(VendTable, VendGroup));
qbdsVendTable.addSelectionField(fieldNum(VendTable, Party));
qbdsVendTable.addGroupByField(fieldNum(VendTable, AccountNum));
qbdsVendTable.addGroupByField(fieldNum(VendTable, InvoiceAccount));
qbdsVendTable.addGroupByField(fieldNum(VendTable, NBDCMMSAllowInvoices));
qbdsVendTable.addGroupByField(fieldNum(VendTable, VendGroup));
qbdsVendTable.addGroupByField(fieldNum(VendTable, Party));
qbdsVendTable.addRange(fieldNum(vendTable, Blocked)).value(SysQuery::valueNot(CustVendorBlocked::All));

qbds = qbdsVendTable.addDataSource(tableNum(PurchTable));
qbds.joinMode(JoinMode::NoExistsJoin);
qbds.addLink(fieldNum(VendTable, AccountNum), fieldNum(PurchTable, OrderAccount));
qbds.addRange(fieldNum(PurchTable, CreatedDateTime)).value('>'+queryValue(cutoffDate));

qbds = qbdsVendTable.addDataSource(tableNum(VendTrans));
qbds.joinMode(JoinMode::NoExistsJoin);
qbds.addLink(fieldNum(VendTable, AccountNum), fieldNum(VendTrans, AccountNum));
qbds.addRange(fieldNum(VendTrans, TransDate)).value('>'+queryValue(cutoffDateTrans));

qbds = qbdsVendTable.addDataSource(tableNum(VendInvoiceJour));
qbds.joinMode(JoinMode::NoExistsJoin);
qbds.addLink(fieldNum(VendTable, AccountNum), fieldNum(VendInvoiceJour, InvoiceAccount));
qbds.addRange(fieldNum(VendInvoiceJour, InvoiceDate)).value('>'+queryValue(cutoffDateTrans));

qr = new QueryRun(q);

while (qr.next())
{
    vendTable = qr.get(tableNum(vendTable));

    //and so on
}

如果不是,那么只需基于创建一个,并在报告中使用它。您可以将VendTable用作父数据源,即联合中的VendTable join PurchTable、VendTable join VendTrans和VendTable join VendInvoiceJour,或者决定使用不同的联合结构,例如,不使用VendTable,只使用其他3个表中的特定字段。如有必要,您可以使用。然后只需从VendTable notExists中选择记录即可加入您的新视图。

您是否考虑过创建一些临时表来帮助构建所需的数据集?在理想情况下,全球通讯簿中的单个实体将对应于单独公司/法律实体中的26个供应商。如果在您的安装中是这种情况,也许您可以将party id作为group by使用,以便将所有供应商汇总到一个party id中?