用JOIN替换EXISTS JOIN

时间:2016-10-26 12:05:07

标签: axapta x++

我在使用AX2012类时遇到问题(默认AX2012类和代码,未对其进行任何修改):方法CustVendTransDetails中的calcCashDiscounts

以下查询给出了错误The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

if (TaxParameters::canApplyCashDiscOnInvoice_ES())
{
    insert_recordset tmpValue
        (CustVendTransRefRecId, AmountMST)
        select CustVendTransRefRecId
        from _custVendAccountStatementIntTmpProcessing

        exists join custVendTransLoc
        where
            custVendTransLoc.RecId == _custVendAccountStatementIntTmpProcessing.CustVendTransRefRecId

        exists join firstOnly subledgerVoucherGeneralJournalEntry
        where
            subledgerVoucherGeneralJournalEntry.Voucher == custVendTransLoc.Voucher &&
            subledgerVoucherGeneralJournalEntry.AccountingDate == custVendTransLoc.TransDate

        exists join generalJournalEntry
        where
            generalJournalEntry.RecId == subledgerVoucherGeneralJournalEntry.GeneralJournalEntry &&
            generalJournalEntry.Ledger == Ledger::current()

        join AccountingCurrencyAmount from generalJournalAccountEntry
        where
            generalJournalAccountEntry.GeneralJournalEntry == generalJournalEntry.RecId &&
            (generalJournalAccountEntry.PostingType == LedgerPostingType::CustCashDisc ||
            generalJournalAccountEntry.PostingType == LedgerPostingType::VendCashDisc);

    update_recordSet _custVendAccountStatementIntTmpProcessing setting
        UtilizedCashDisc = tmpValue.AmountMST,
        PossibleCashDisc = tmpValue.AmountMST
        join tmpValue
        where
            tmpValue.CustVendTransRefRecId == _custVendAccountStatementIntTmpProcessing.CustVendTransRefRecId;
}

我理解为什么,但我不知道如何解决这个问题。将exist join替换为普通join

会有问题吗?

exist join替换join确实解决了我的问题,但我不确定它会对数据产生什么影响?因为它只是选择1个字段?

2 个答案:

答案 0 :(得分:2)

您可以尝试切换联接顺序:

insert_recordset tmpValue (CustVendTransRefRecId, AmountMST)
    select CustVendTransRefRecId
    from _custVendAccountStatementIntTmpProcessing

    join AccountingCurrencyAmount from generalJournalAccountEntry // Moved up
    where generalJournalAccountEntry.PostingType == LedgerPostingType::CustCashDisc ||
          generalJournalAccountEntry.PostingType == LedgerPostingType::VendCashDisc

    exists join custVendTransLoc
    where
        custVendTransLoc.RecId == _custVendAccountStatementIntTmpProcessing.CustVendTransRefRecId

    exists join firstOnly subledgerVoucherGeneralJournalEntry
    where
        subledgerVoucherGeneralJournalEntry.Voucher == custVendTransLoc.Voucher &&
        subledgerVoucherGeneralJournalEntry.AccountingDate == custVendTransLoc.TransDate

    exists join generalJournalEntry
    where
        generalJournalEntry.RecId == subledgerVoucherGeneralJournalEntry.GeneralJournalEntry && &&
        generalJournalEntry.RecId == generalJournalAccountEntry.GeneralJournalEntry && // Moved from join
        generalJournalEntry.Ledger == Ledger::current();   

答案 1 :(得分:1)

使用加入替换现有联接不会解决您的问题。 Exist是一种基本连接到表的内部连接而不返回任何字段的方法。

查询应该从generalJournalAccountEntry返回来自_custVendAccountStatementIntTmpProcessing和AccountingCurrencyAmount的CustVendTransRefRecId,这正是插入所期望的。

我希望查询实际上没有返回任何内容。检查它使用的标准并检查数据。