簡體   English   中英

檢查供應商在過去X天內在Dynamics AX中是否在所有公司中進行任何交易

[英]Check if a vendor has any transactions across ALL companies in the past X days in Dynamics AX

我試圖寫一份乍一看似乎很簡單的報告。 但是,經過無數次嘗試,我一直在努力尋找一種可行的方法。 VendTable中有大約35萬條記錄,但供應商在26家公司中重復存在,因此實際上有約1.3萬個唯一的供應商帳戶。

我正在嘗試編寫一份報告,以返回自某個日期以來沒有PO,發票和付款(分別為PurchTable,VendInvoiceJour和VendTable)的任何供應商。

(對我而言)最復雜的部分是,所有鍵都包含dataareaid,但我希望查詢獨立於此運行。 我不是說crossCompany,因為這將為單個供應商返回(最多)26條記錄(因為它在數據庫中存在26次)。 需要明確的是,如果供應商A在任何一​​家公司中都有一個采購訂單,那么我不希望供應商A完全返回我的結果集中。

我嘗試使用下面的查詢來執行此操作(AccountNum上的+號欺騙了AOT,因此生成的sql查詢從子查詢中刪除了dataareaid),但是生成的SQL被嵌套為“ NOT(EXIST)”,因此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

那些嵌套的NOT EXIST連接使我感到悲傷。 有沒有解決的辦法,或者是完全不同的辦法?

我想您不能使用查詢?

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聯接PurchTable,VendTable聯接VendTrans和VendTable聯接VendInvoiceJour,或決定使用其他聯合結構,例如不使用VendTable,僅使用其他3個表中的特定字段。 您可以根據需要使用計算列 然后只需從VendTable中選擇記錄notExists加入您的新視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM