Показать сообщение отдельно
Старый 08.08.2019, 14:57   #1  
Brave is offline
Brave
Участник
 
26 / 14 (1) ++
Регистрация: 13.09.2010
Адрес: Санкт-Петербург
AX2012 R3 Тормозит формирование РН
Добрый день! AX2012 R3
Формирование расходных накладных происходит медленно, при трассировке и выявлении проблемы, выяснился неприятный момент, а именнно:
В методе setEstimate:
X++:
/**
    Returns true if the estimated amount is calculated and has changed
**/
server boolean setEstimate(SalesTotals _salesTotals = null)
{
    SalesTotals             salesTotals;
    SalesUpdate             qtySpec;
    CustParameters          custParameters          = CustParameters::find();
    TypeOfCreditmaxCheck    typeOfCreditmaxCheck    = custParameters.CreditMaxCheck;
    boolean                 hasEstimatedChanged;
    AmountMST               estimatedOld;
    MCRSalesOrderTotals      mcrSalesOrderTotals;

    hasEstimatedChanged = false;
    //Total estimate for the order would be calculated on order save, if credit limit check is enabled for the company.
    if (this.custTable_CustAccount().shouldEstimateBeCalculated())
    {
        qtySpec = (typeOfCreditmaxCheck == TypeOfCreditmaxCheck::BalanceDelivered ? SalesUpdate::PackingSlip :
                   typeOfCreditmaxCheck == TypeOfCreditmaxCheck::BalanceAll       ? SalesUpdate::All         : 0);

        if (qtySpec && this.isCreditCheckEligible())
        {
            estimatedOld        = this.Estimate;

            if (this.mcrIsCallCenter())
            {
                if (qtySpec == SalesUpdate::All)
                {
                    mcrSalesOrderTotals = new MCRSalesOrderTotals(this);
                    this.Estimate = Currency::amountCur2MST(mcrSalesOrderTotals.getRemainingOrder(), this.CurrencyCode);
                }
                else
                {
                    salesTotals         = SalesTotals::construct(this, qtySpec);
                    this.Estimate       = Currency::amountCur2MST(salesTotals.totalAmount(), this.CurrencyCode);
                }
            }
            else
            {
                salesTotals         = (_salesTotals == null) ? SalesTotals::construct(this, qtySpec) : _salesTotals;
                this.Estimate       = Currency::amountCur2MST(salesTotals.totalAmount(), this.CurrencyCode, this.fixedExchRate());
            }

            hasEstimatedChanged = (this.Estimate != estimatedOld);
        }
    }

    this.Touched = NoYes::No;

    return hasEstimatedChanged;
}
Таблицы SalesTable, согласно настройкам используется класс:
MCRSalesOrderTotals
Внутри класса MCRSalesOrderTotals вызывается метод calcInvoicedExistMultiple
с жутким запросом приводящем к тормозам в базе (время выполнения 10-15 секунд, используется tempdb для операции HashMatch в плане):
X++:
select sum(EndDisc), sum(InvoiceAmount), sum(SalesBalance), sum(SumMarkup), sum(SumTax) from custInvoiceJour
        where custInvoiceJour.RefNum == RefNum::SalesOrder
        notexists join custInvoiceSalesLink
            where custInvoiceJour.SalesId          == custInvoiceSalesLink.SalesId
               && custInvoiceJour.InvoiceDate      == custInvoiceSalesLink.InvoiceDate
               && custInvoiceJour.InvoiceId        == custInvoiceSalesLink.InvoiceId
               && custInvoiceSalesLink.OrigSalesId != _salesTable.SalesId;
Сталкивался ли кто нибудь с подобными проблемами?
Обойти сей неприятный момент возможно, отключив "центр обработки вызовов"(метод mcrIsCallCenter()) но всё-таки может есть решения без выпиливания функционала?