AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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()) но всё-таки может есть решения без выпиливания функционала?
Старый 08.08.2019, 15:29   #2  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Что то в запросе явно не хватает условия либо custInvoiceJour.SalesId = _salesTable.SalesId, либо custInvoiceSalesLink.SalesId = _salesTable.salesId.

Метод как я понимаю считает итоги по накладным с несколькими заказами, куда входит наш заказ, а не вообще по всем накладным с несколькими заказами, зачем все то считать ? См. метод calcInvoiced откуда он вызывается.

А в целом, если вы функционал не используете, отключите конф ключ и будет счастье, MS вроде как рекомендует включать только то, что используете)
__________________
Sergey Nefedov
Старый 08.08.2019, 17:25   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от SRF Посмотреть сообщение
Что то в запросе явно не хватает условия либо custInvoiceJour.SalesId = _salesTable.SalesId, либо custInvoiceSalesLink.SalesId = _salesTable.salesId.
Условие добавлять как раз-таки не надо - оно не совсем корректное для случая накладных по нескольким заказам. А вот вопрос что хотим получить - это действительно вопрос. Судя по коду - хотим получить сумму всех накладных, в которых хоть как-то засветился наш заказ.
Тормоза придает условие custInvoiceSalesLink.OrigSalesId != _salesTable.SalesId;
Нужно неравенство пытаться превращать в равенство
__________________
Возможно сделать все. Вопрос времени
Старый 08.08.2019, 18:00   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1296 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Я, может быть, как-то не понял логику работы, но получается, что тут мы суммируем вообще все накладные, разноска которых была запущена не из текущего заказа, ну и далее, тоже делаем с накладными расходами.
Ведь единственное ограничение на выборку это:
X++:
custInvoiceSalesLink.OrigSalesId != _salesTable.SalesId
но таких накладных, я думаю, не так уж и мало.
Старый 08.08.2019, 18:32   #5  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
А чего это условие то не корректное ? Жаль что полностью код, не вставили из метода с комментарием, а выглядит он вот так :
X++:
    // There is at least one summary invoice so need to process each invoice separately.
    // [B]Select all non-summmary invoices[/B].  If no other record exists in CustInvoiceSalesLink
    // with a different origSalesId then there is only one sales order on the invoice and
    // therefore it is a non-summary invoice.
    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;
Т.е. этот запрос должен считать сумму по всем накладным текущего заказа, в которых нет других заказов - т.е. одиночные накладные.
Поэтому как мне кажется надо в три запроса добавить условие custInvoiceJour.SalesId = _salesTable.SalesId, которые содержат notexists join в этом методе.
Насчет равенства это да, но навскидку пока, быстро не придумал, как выбрать такие накладные без not exists join,
Сам метод считает сумму которая в накладных из данного заказа и считает ее так = сумма всех накладных только по этому заказу + доля из накладных где наш заказ включен как один из нескольких.

А вообще если не используете ключ отключите его, проблемы уйдут не только в этом методе.
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: sukhanchik (4).
Старый 09.08.2019, 07:43   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от SRF Посмотреть сообщение
А чего это условие то не корректное ?
Т.е. этот запрос должен считать сумму по всем накладным текущего заказа, в которых нет других заказов - т.е. одиночные накладные.
А... прошу прощения... Ступил. Да, тогда все логично.
__________________
Возможно сделать все. Вопрос времени
Старый 30.08.2019, 16:25   #7  
Brave is offline
Brave
Участник
 
26 / 14 (1) ++
Регистрация: 13.09.2010
Адрес: Санкт-Петербург
Добавили условие custInvoiceJour.SalesId = _salesTable.SalesId, всё залетало! Спасибо за совет и поддержку!
Старый 02.09.2019, 12:13   #8  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1633 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от Brave Посмотреть сообщение
Добавили условие custInvoiceJour.SalesId = _salesTable.SalesId, всё залетало!
А это случайно все не сломает, если у нас одна накладная будет включать несколько заказов? В этом случае условие будет не совсем правильное
Теги
mcrsalesordertotals

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxse: February 2019 Release – Dynamics AX2012 R3 update Blog bot DAX Blogs 1 27.03.2019 13:44
dynamicsaxse: November 2018 Release – Dynamics AX2012 R3 update Blog bot DAX Blogs 0 15.11.2018 09:11
dynamicsaxse: February 2018 Release – Dynamics AX2012 R3 update Blog bot DAX Blogs 0 21.03.2018 21:11
dynamicsaxse: January 2018 Release – Dynamics AX2012 R3 update Blog bot DAX Blogs 0 06.02.2018 23:11
dynamicsaxse: December Release – Dynamics AX2012 R3 update Blog bot DAX Blogs 0 04.01.2018 03:46
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:45.