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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.09.2008, 16:39   #1  
evv is offline
evv
Участник
 
18 / 10 (1) +
Регистрация: 01.08.2003
Адрес: Санкт-Петербург
! Падение производительности при разноске производственного журнала
Dynamics Ax 4.0 kernel 4.0.2501.116 Application version 4.0.2200.0
Уважаемые коллеги. Ситуация следующая. У клиента установлен модуль "Производство" и персонал осуществляет сборку спецификаций через журналы приемки и отборочные накладные. Пример: создан производственный заказ на 10000 единиц номенклатуры. В сборочном цехе для каждой единицы продукции создается отдельный журнал приемки с количеством = 1, для которого средствами Аксапты генерится отборочная накладная, содержащая спецификацию. В эту отборочную накладную вносится информация о серийных номерах данной сборки, после чего накладная разносится, а потом разносится и журнал приемки. Цикл повторяется пока все 10000 изделий не будут собраны. Проблема в следующем: пока количество привязанных к данному производственному заказу журналов не превышает нескольких десятков, разноска каждого следующего журнала занимает не очень много времени. Но с ростом числа таких журналов время, занимаемое разноской журнала, растет по экспоненте и после разноски нескольких сотен журналов приемки для данного производственного заказа превышает все допустимые пределы для производственного процесса. В чем может быть причина такого замедления процесса разноски?
Заранее благодарен за любые идеи и хинты.
Старый 10.09.2008, 16:52   #2  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Перенес из Программирования в Администрирование. Коллеги, давайте внимательнее выбирать раздел для темы.
__________________
Андрей.
Старый 10.09.2008, 16:56   #3  
evv is offline
evv
Участник
 
18 / 10 (1) +
Регистрация: 01.08.2003
Адрес: Санкт-Петербург
На самом деле я считаю что вопрос скорее к разработчикам нежели к администраторам. Вряд ли администраторы представляют себе, как работает алгоритм разноски журналов, и в каком месте число прикрепленных к производственному заказу журналов может влиять на скорость разноски. Поправьте меня если я ошибаюсь.
Старый 10.09.2008, 17:14   #4  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
По мне - данная тема, если разобраться, вообще претендент сразу для 3х разделов: Администрирование, Функционал, Программирование. Посмотрим, что посоветуют специалисты для решения проблемы, и тогда уже тему при необходимости перенесу.
__________________
Андрей.
За это сообщение автора поблагодарили: evv (1).
Старый 10.09.2008, 17:40   #5  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Если есть время поэкспериментировать, то отключите (на копии базы и приложения) корреспонденцию счетов (параметры Главной книги) и попробуйте разнести без нее, если конечно в вашем случае они вообще создаются.

Тут проскакивали темы про долгую разноску складских журналов (правда в основном в тройке), может еще эта грабля осталась.
Старый 10.09.2008, 17:44   #6  
evv is offline
evv
Участник
 
18 / 10 (1) +
Регистрация: 01.08.2003
Адрес: Санкт-Петербург
Спасибо за участие в дискуссии. Нет, клиент западный и корреспонденцией счетов в принципе не занимается. Локализация западно-европейская, то есть без российской функциональности вообще.
Старый 10.09.2008, 17:46   #7  
evv is offline
evv
Участник
 
18 / 10 (1) +
Регистрация: 01.08.2003
Адрес: Санкт-Петербург
Цитата:
Сообщение от petr Посмотреть сообщение
Тут проскакивали темы про долгую разноску складских журналов (правда в основном в тройке), может еще эта грабля осталась.
Если несложно, подскажите где можно посмотреть на обсуждение этих старых граблей?
Старый 10.09.2008, 18:03   #8  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
вот например Разноска складского журнала в 10000 строк.

а конкретно про проблеме долгой разноски из-за ГК писал fed в статье про ГК. Ссыкла тут Немного об архитектуре разноски в ГК и проблеме корреспонденции счетов, там где-то в начале, по-моему. Но это только про тормоза из-за корреспонденции счетов
Старый 10.09.2008, 18:46   #9  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Обычно так себя проявляет использование какого-то большого временного хранилища (временная таблица и т.п.) общего для всего процесса, по которому делается поиск ранее проведенных операций.
Характерной особенностью является активная работа диском на клиенте или АОСе.
Можно запустить FileMon какой-нибудь и увидеть какой файл Аксапта много читает и чуть-чуть пишит...
но как понять где это в коде не придумал еще.
За это сообщение автора поблагодарили: evv (1).
Старый 11.09.2008, 09:30   #10  
evv is offline
evv
Участник
 
18 / 10 (1) +
Регистрация: 01.08.2003
Адрес: Санкт-Петербург
Уважаемые коллеги! Большое спасибо всем, кто принял участие в обсуждении. Проблему удалось решить несколько другим путем. Как выяснилось, при разноске производственного журнала Аксапта пересчитывает мгновенную себестоимость изделия, и этот расчет ведется по всем записям в InventTrans, связанных с конкретным производственным заказом. Просто закомментировав вызов данного расчета, мы добились того, что разноска производственного журнала занимает одно и то же время (несколько секунд) вне зависимости от того, сколько производственных журналов для данного заказа уже разнесено. Вызов находится в методе postTransLedger класса ProdJournalCheckPostBom,
в самом конце метода есть такие строчки:
X++:
// Update ProdCalcTrans
if(!ProdTableJour::isHistoricalCost(prodTable.ProdId))
ProdCalcTrans::updateRealCalcBOM(prodTable, prodBOM);
Старый 11.09.2008, 09:33   #11  
evv is offline
evv
Участник
 
18 / 10 (1) +
Регистрация: 01.08.2003
Адрес: Санкт-Петербург
Цитата:
Сообщение от Dron AKA andy Посмотреть сообщение
По мне - данная тема, если разобраться, вообще претендент сразу для 3х разделов: Администрирование, Функционал, Программирование. Посмотрим, что посоветуют специалисты для решения проблемы, и тогда уже тему при необходимости перенесу.
Все-таки предлагаю перенести эту тему назад в раздел Разработка, если не возражаете
Старый 11.09.2008, 10:02   #12  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Я-то перенесу, но вот такое "простое" решение что-то у меня вызывает сомнения...
В производственном модуле не специалист, поэтому правильность прокомментировать не могу. Хотя охотно Вам верю, что ускорения вы добились
__________________
Андрей.
Старый 11.09.2008, 11:17   #13  
evv is offline
evv
Участник
 
18 / 10 (1) +
Регистрация: 01.08.2003
Адрес: Санкт-Петербург
Цитата:
Сообщение от Dron AKA andy Посмотреть сообщение
Я-то перенесу, но вот такое "простое" решение что-то у меня вызывает сомнения...
В производственном модуле не специалист, поэтому правильность прокомментировать не могу. Хотя охотно Вам верю, что ускорения вы добились
Жизнь покажет, где мы ошибались Просто насколько мне известно, себестоимость считается для всего заказа приего закрытии в любом случае, так что вроде мгновенные расчеты не нужны. Зато клиент может работать и радоваться. Во всяком случае пока Кроме того, вопрос о необходимости таких расчетов уже обсуждается с ключевыми пользователями клиента, так что проблема, если она есть, будет известна не слишком поздно.
Старый 11.09.2008, 12:33   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Dron AKA andy Посмотреть сообщение
Я-то перенесу, но вот такое "простое" решение что-то у меня вызывает сомнения...
У меня тоже.
Думаю, что надо дальше искать и анализировать тяжелые запросы.

Внутри есть
ProdCalcTrans::updateRealCalcCostBreakdown(prodCalcTrans, _prodBOM, inventItemPrice);

там достаточно тяжелые запросы, которые зависят от количества строк...
думаю, что надо рыть дальше в чисто административном плане.

Отключать функционал не есть гуд. Тем более комментированием.
__________________
полезное на axForum, github, vk, coub.
Старый 11.09.2008, 12:47   #15  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от mazzy Посмотреть сообщение
Думаю, что надо дальше искать и анализировать тяжелые запросы
Уверен?

\Data Dictionary\Tables\ProdBOM\Methods\calcCostAmount

X++:
container calcRealCostAmount()
{
    InventTrans             inventTrans;
    InventDimParm           inventDimParmFinancial;
    InventDimParm           inventDimParmActive;
    InventDimGroupId        dimGroupId;
    InventQty               qty = 0;
    CostAmount              value = 0;
    boolean                 first = true;
    ;

    while select inventTrans                   // !!!
        index hint TransIdIdx
        where inventTrans.InventTransId       == this.InventTransId &&
              inventTrans.ItemId              == this.ItemId        &&
              inventTrans.StatusIssue         == StatusIssue::Deducted  &&
              inventTrans.ValueOpen           == InventTransOpen::Yes   &&
              inventTrans.PackingSlipReturned == NoYes::No
        {

            if (first)
            {
                dimGroupId  = InventTable::find(inventTrans.ItemId).DimGroupId;
                inventDimParmFinancial.initFinancialInvent(dimGroupId);
                inventDimParmActive.initDimActive(dimGroupId);
                first = false;
            }

            qty   += inventTrans.Qty;
            value += inventTrans.estimatedCostValue(inventDimParmFinancial,inventDimParmActive);   /// !!!
        }

    qty = abs(qty);
    value = abs(value);

    return [qty,value];
}
и как этому не тормозить при тысячах отборочных накладных по производственному заказу?
__________________
-ТСЯ или -ТЬСЯ ?
Старый 11.09.2008, 12:59   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Vadik Посмотреть сообщение
Уверен?
Уверен, что не комментировать вызов целого метода, а работать с конкретными запросами. Например, с тем, что ты привел.

самое тяжелое в указанном тобой методе - получить сумму ожидаемых себестоимостей. для каждого вызова в свою очередь вызывается
X++:
[qty,value] = InventTrans::calcMarkedCostValue(this.InventRefTransId,this.ItemId,this.InventDimId,this.inventTable().inventModelGroup().InclPhysicalValueInCost,this.InventTransId);
там такие же нелегкие запросы.
В результате имеем кучу вложенных достаточно тяжелых запросов.

Вот с этим и надо разбираться, а не "Просто закомментировав вызов данного расчета"
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: evv (1).
Старый 12.09.2008, 11:35   #17  
evv is offline
evv
Участник
 
18 / 10 (1) +
Регистрация: 01.08.2003
Адрес: Санкт-Петербург
Цитата:
Сообщение от mazzy Посмотреть сообщение
Уверен, что не комментировать вызов целого метода, а работать с конкретными запросами. Например, с тем, что ты привел.

самое тяжелое в указанном тобой методе - получить сумму ожидаемых себестоимостей. для каждого вызова в свою очередь вызывается
X++:
[qty,value] = InventTrans::calcMarkedCostValue(this.InventRefTransId,this.ItemId,this.InventDimId,this.inventTable().inventModelGroup().InclPhysicalValueInCost,this.InventTransId);
там такие же нелегкие запросы.
В результате имеем кучу вложенных достаточно тяжелых запросов.

Вот с этим и надо разбираться, а не "Просто закомментировав вызов данного расчета"
Да, я тоже считаю что надо дойти до конца и вмешательство должно быть хирургически точным. Просто сейчас есть возможность это сделать в спокойном режиме, когда заказчик работает как обычно и доволен всем. Просто когда у него шел простой производства и реальные финансовые убытки, решение было необходимо как можно быстрее.
Старый 12.09.2008, 22:00   #18  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Мне кажется проблема все таки в том что вызов происходит на каждую разноску журнала, разноска идет на каждую единицу номенлкатуры. В итоге получаем квадратичную зависимость от числа единиц принимаемой номенклатуры.

Оптимизация запросов скорее всего не поможет.
Я бы лучше все таки код внимательно проанализировал. Есть ощущение что можно оставить это место закомментированным, но перенести вызов позже, после разноски всех журналов. Тогда ничего не должно отвалиться, но уйдут ненужные вызовы.
Теги
ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка при разноске журнала клиентских платежей Hornet DAX: Функционал 5 23.06.2005 16:13
Ошибка при разноске журнала инвентаризации ATimTim DAX: Функционал 3 22.11.2004 17:27
Ошибка при разноске журнала переноса ATimTim DAX: Функционал 5 01.09.2004 15:24
Ошибка при проверке и разноске строк журнала ОС (версия 3.0, сервиспак 2) waitingforsharan DAX: Функционал 3 26.02.2004 01:15
Падение производительности функции renat DAX: Программирование 6 14.04.2003 14:52

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

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

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