![](/img/trans.png)
[英]Number sequence interchanging between two companies in dynamics AX 4.0
[英]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.