Добрый день! 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()) но всё-таки может есть решения без выпиливания функционала?