Проверьте, есть ли у поставщика какие-либо транзакции по ВСЕМ компаниям за последние X дней в Dynamics AX - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь написать отчет, который на первый взгляд кажется довольно простым.Однако после многочисленных попыток я изо всех сил пытаюсь найти подход, который работает.У нас есть около 350 тыс. Записей в VendTable, но поставщики дублируются в 26 компаниях, поэтому на самом деле существует около 13 тыс. УНИКАЛЬНЫХ учетных записей поставщиков.

Я пытаюсь написать отчет, который возвращает любого поставщика, у которого не было заказа на поставку, счет-фактураи Оплата (BuyTable, VendInvoiceJour и VendTable соответственно) с определенной даты.

Сложная часть (для меня) состоит в том, что все ключи содержат dataareaid, но я хочу, чтобы мой запрос выполнялся независимо от этого.Я не имею в виду crossCompany, потому что это возвратило бы (до) 26 записей для одного Продавца (так как оно существует 26 раз в базе данных).Для ясности, если у поставщика А есть ПО в ЛЮБОЙ компании, я не хочу, чтобы поставщик А возвращал в моем наборе результатов ВСЕ.

Я попытался сделать это, используя запрос ниже (+ '' наAccountNum обманывает AOT, поэтому результирующий SQL-запрос удаляет dataareaid из подзапроса), но результирующий SQL-запрос был «НЕ (EXIST»), поэтому NOTs отменяют, вызывая непредвиденные и неправильные результаты.

X ++ Code

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

Эти вложенные объединения НЕ СУЩЕСТВУЮТ вызывают у меня горе. Есть ли способ обойти это, или, может быть, совершенно другой подход?

1 Ответ

0 голосов
/ 16 мая 2018

Я полагаю, вы не можете использовать запрос?

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 BuyTable, VendTable join VendTrans и VendTable join VendInvoiceJour в объединении, или решите использовать другую структуру объединения, например, нет VendTable и только конкретные поля из других 3 таблиц. При необходимости вы можете использовать вычисляемые столбцы . Затем просто выберите записи из VendTable notExists и присоединитесь к вашему новому представлению.

...