08.08.2019, 14:57 | #1 |
Участник
|
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; } 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()) но всё-таки может есть решения без выпиливания функционала? |
|
Теги |
mcrsalesordertotals |
|
|