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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.03.2014, 13:36   #1  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Расчёт цены номенклатуры
Добрый день. Уже который день бьюсь с производительностью функции «Расчёт цены» -> «Цена номенклатуры»(AX2009). У меня есть номенклатура спецификация которой в свою очередь состоит из 5000 спецификаций. Полный расчёт её проходит за 30часов!!! Облазил весь код. В принципе особо что там и не соптимизируешь. Весь расчёт выполняется в одной транзакции(что уже не есть гуд). В ней строится дерево ну и потом бежит с самого низа веточек рассчитывается и сумма поднимается вверх. Понятно что объём большой, но это же ведь ERP… и уж если на то пошло, я так думаю, в России есть не мало производств где и посложнее номенклатуры обсчитыватся. Кстати посмотрел как этот функционал реализован в 12-шке… один в один без изменений.
Кто нить сталкивался с подобной проблемой?
Старый 04.03.2014, 14:17   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от raniel Посмотреть сообщение
Добрый день. Уже который день бьюсь с производительностью функции «Расчёт цены» -> «Цена номенклатуры»(AX2009). У меня есть номенклатура спецификация которой в свою очередь состоит из 5000 спецификаций. Полный расчёт её проходит за 30часов!!! Облазил весь код. В принципе особо что там и не соптимизируешь. Весь расчёт выполняется в одной транзакции(что уже не есть гуд). В ней строится дерево ну и потом бежит с самого низа веточек рассчитывается и сумма поднимается вверх. Понятно что объём большой, но это же ведь ERP… и уж если на то пошло, я так думаю, в России есть не мало производств где и посложнее номенклатуры обсчитыватся. Кстати посмотрел как этот функционал реализован в 12-шке… один в один без изменений.
Кто нить сталкивался с подобной проблемой?
Сталкивался, в машиностроении. Остается только итеративный расчет, где начинаем с нижних узлов (InventTable.BOMLevel), а на верхних насильственно прерываем расчет на первом уровне спецификации (по типу BOMCalcGroup.StopExplosion). Для этого используется метод расчета SingleLevel.

Последний раз редактировалось EVGL; 04.03.2014 в 14:20.
За это сообщение автора поблагодарили: gl00mie (2), raniel (1).
Старый 04.03.2014, 15:03   #3  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
В поздних сервис-паках к 2009ой приделали параллельный рассчет спецификаций. То есть - если запускаешь на пакетном сервере полный рассчет всех спецификаций в одноуровневом режиме, то у тебя система рожает n-хелперов (где помнится - по 4 хелпера на каждый сервер, обслуживающий пакетную группу). Хелперы внутри каждого уровня вложенности BOM работают в параллель. После того как просчитаны цены уровня n+1, начинается расчет цен уровня n.
Из всего этого можно сделать параллельный пересчет цены для конкретной спецификации. Надо просто сделать свой клон этого класса, который в табличку заданий для рассчета (BOMCalcItemTask/BOMCalcItemInventoryDimensionTask) пишет только те номенклатуры и аналитики, которые входят в данную спецификацию. (Ну то есть - классическое развертывание спецификации).
Кроме того, надо будет дописывать какой-то механизм автоматической активации цены, чтобы цены, рассчитанные на уровне n+1 немедленно активировались, чтобы рассчет на уровне n прочитал уже их, а не предыдущие значения. (Хотя в режиме стандартной себестоимости, автоматическая активация весьма чревата). На моем проекте это было сделано до меня, но дописка там не очень сложная. У нас на контрольных примерах время рассчета сложной спеки упала с 10-12 часов до 20-30 минут... Это конечно сильно зависит от размера ваших спек и режима их обсчета (может у вас там фантомов много, например), но в целом на 2-3 раза увеличения производительности можно надеятся даже в тяжелых случаях.
P.S. Есть альтернативный подход: Вместо автоматической активации свежепосчитанной цены, можно просто подломать сам рассчет, чтобы при включении определенной галочки, он бы сначала искал цену в pending prices (InventItemPriceSim) и только если там ничего нету - искал бы в обычных местах.

Последний раз редактировалось fed; 04.03.2014 в 15:07.
За это сообщение автора поблагодарили: gl00mie (3), raniel (1).
Старый 07.03.2014, 10:56   #4  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от fed Посмотреть сообщение
В поздних сервис-паках к 2009ой приделали параллельный рассчет спецификаций. То есть - если запускаешь на пакетном сервере полный рассчет всех спецификаций в одноуровневом режиме, то у тебя система рожает n-хелперов (где помнится - по 4 хелпера на каждый сервер, обслуживающий пакетную группу). Хелперы внутри каждого уровня вложенности BOM работают в параллель. После того как просчитаны цены уровня n+1, начинается расчет цен уровня n.
Из всего этого можно сделать параллельный пересчет цены для конкретной спецификации. Надо просто сделать свой клон этого класса, который в табличку заданий для рассчета (BOMCalcItemTask/BOMCalcItemInventoryDimensionTask) пишет только те номенклатуры и аналитики, которые входят в данную спецификацию. (Ну то есть - классическое развертывание спецификации).
Кроме того, надо будет дописывать какой-то механизм автоматической активации цены, чтобы цены, рассчитанные на уровне n+1 немедленно активировались, чтобы рассчет на уровне n прочитал уже их, а не предыдущие значения. (Хотя в режиме стандартной себестоимости, автоматическая активация весьма чревата). На моем проекте это было сделано до меня, но дописка там не очень сложная. У нас на контрольных примерах время рассчета сложной спеки упала с 10-12 часов до 20-30 минут... Это конечно сильно зависит от размера ваших спек и режима их обсчета (может у вас там фантомов много, например), но в целом на 2-3 раза увеличения производительности можно надеятся даже в тяжелых случаях.
P.S. Есть альтернативный подход: Вместо автоматической активации свежепосчитанной цены, можно просто подломать сам рассчет, чтобы при включении определенной галочки, он бы сначала искал цену в pending prices (InventItemPriceSim) и только если там ничего нету - искал бы в обычных местах.
Добрый день. Я тут приболел потому не мог подробно расмотреть Ваш ответ. Сейчас вот начинаю разбираться и у меня стали возникать вопросы.
Первое, насчёт хелперов (помощников). Как я могу их увидеть? К примеру в Сводном планирование на форме запуска расчёта есть закладка "Помощники по планированию", задав их там я очень здорово могу ускорить расчёт. Тут же этого нет.
Старый 11.03.2014, 13:55   #5  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от fed Посмотреть сообщение
В поздних сервис-паках к 2009ой приделали параллельный рассчет спецификаций. То есть - если запускаешь на пакетном сервере полный рассчет всех спецификаций в одноуровневом режиме, то у тебя система рожает n-хелперов (где помнится - по 4 хелпера на каждый сервер, обслуживающий пакетную группу). Хелперы внутри каждого уровня вложенности BOM работают в параллель. После того как просчитаны цены уровня n+1, начинается расчет цен уровня n.
Из всего этого можно сделать параллельный пересчет цены для конкретной спецификации. Надо просто сделать свой клон этого класса, который в табличку заданий для рассчета (BOMCalcItemTask/BOMCalcItemInventoryDimensionTask) пишет только те номенклатуры и аналитики, которые входят в данную спецификацию. (Ну то есть - классическое развертывание спецификации).
Кроме того, надо будет дописывать какой-то механизм автоматической активации цены, чтобы цены, рассчитанные на уровне n+1 немедленно активировались, чтобы рассчет на уровне n прочитал уже их, а не предыдущие значения. (Хотя в режиме стандартной себестоимости, автоматическая активация весьма чревата). На моем проекте это было сделано до меня, но дописка там не очень сложная. У нас на контрольных примерах время рассчета сложной спеки упала с 10-12 часов до 20-30 минут... Это конечно сильно зависит от размера ваших спек и режима их обсчета (может у вас там фантомов много, например), но в целом на 2-3 раза увеличения производительности можно надеятся даже в тяжелых случаях.
P.S. Есть альтернативный подход: Вместо автоматической активации свежепосчитанной цены, можно просто подломать сам рассчет, чтобы при включении определенной галочки, он бы сначала искал цену в pending prices (InventItemPriceSim) и только если там ничего нету - искал бы в обычных местах.
Помотрел это механизм внимательнее. Когда мы из формы "Настройка версии калькуляции издержек" запускаем расчёт по новой строке, то в процессе расчёта формируются списки узлов (BOMCalcItemTask/BOMCalcItemInventoryDimensionTask) для расчёта цен спецификации в классе BOMCalcJob_All. И как я понял, каждая спецификация рассчитывается один раз. Это хорошо.
В этом же механизме можно запустить не по всем расчёт, а задать конкретную номенклатуру...это фактический тоже самое, что вы предлагаете сделать. Проверив как работает это механизм, особого прироста в производительности я не заметил.
Старый 11.03.2014, 14:42   #6  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от raniel Посмотреть сообщение
Помотрел это механизм внимательнее. Когда мы из формы "Настройка версии калькуляции издержек" запускаем расчёт по новой строке, то в процессе расчёта формируются списки узлов (BOMCalcItemTask/BOMCalcItemInventoryDimensionTask) для расчёта цен спецификации в классе BOMCalcJob_All. И как я понял, каждая спецификация рассчитывается один раз. Это хорошо.
В этом же механизме можно запустить не по всем расчёт, а задать конкретную номенклатуру...это фактический тоже самое, что вы предлагаете сделать. Проверив как работает это механизм, особого прироста в производительности я не заметил.
Насколько я помню, если указываешь конкретную номенклатуру, то и пересчет идет данной конкретной номенклатуры, а не всех ее подкомпонентов. А поскольку одна номенклатура рассчитывается в одном батче, то никакого выигрыша из за параллелизма - нету
Старый 17.03.2014, 11:17   #7  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Сделал всё как Вы описали. Разницы совершенно ни какой нет. Один плюс у данного метода что за это время он рассчитывает цены всех входящих в нашу номенклатуру спецификаций.
Старый 17.03.2014, 11:40   #8  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от raniel Посмотреть сообщение
Сделал всё как Вы описали. Разницы совершенно ни какой нет. Один плюс у данного метода что за это время он рассчитывает цены всех входящих в нашу номенклатуру спецификаций.
А сколько у тебя хелперов работает на пересчете ? И какое среднее число номенклатур по уровням вложенности ? Ну то есть - если у тебя вложенность 8 и каждый BOM состоит из 2 номенклатур, то на нижнем уровне будет 256 номенклатур для пересчета, на 7 уровне - 128 и тп. При этом реальный выигрыш будет вероятно только для 2-3 последних уровней и всего процентов на 30-40 для каждого. В то же время, если у тебя, скажем, вложенность 8 и среднее число компонент - 5, то на нижнем уровне будет порядка 350000 номенклатур и выигрыш будет уже прямопропорционален числу хелперов...
Старый 17.03.2014, 12:39   #9  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от fed Посмотреть сообщение
А сколько у тебя хелперов работает на пересчете ? И какое среднее число номенклатур по уровням вложенности ? Ну то есть - если у тебя вложенность 8 и каждый BOM состоит из 2 номенклатур, то на нижнем уровне будет 256 номенклатур для пересчета, на 7 уровне - 128 и тп. При этом реальный выигрыш будет вероятно только для 2-3 последних уровней и всего процентов на 30-40 для каждого. В то же время, если у тебя, скажем, вложенность 8 и среднее число компонент - 5, то на нижнем уровне будет порядка 350000 номенклатур и выигрыш будет уже прямопропорционален числу хелперов...
Хм... где я их могу увидеть?
Старый 17.03.2014, 16:41   #10  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от raniel Посмотреть сообщение
Хм... где я их могу увидеть?
Для подсчета колчества хелперов, достаточно посмотреть сколько дополнительных заданий появилось в пакетной задаче после запуска.
Для того чтобы оценить объем пересчитываемой номенклатуры - достаточно посмотреть BomCALCItemTask сгруппированный по уровням (поле Level или BOMLevel) где-нибудь после того как начали работать задания, пересчитывающие нижний уровень вложености
Старый 28.03.2014, 09:48   #11  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от fed Посмотреть сообщение
А сколько у тебя хелперов работает на пересчете ? И какое среднее число номенклатур по уровням вложенности ? Ну то есть - если у тебя вложенность 8 и каждый BOM состоит из 2 номенклатур, то на нижнем уровне будет 256 номенклатур для пересчета, на 7 уровне - 128 и тп. При этом реальный выигрыш будет вероятно только для 2-3 последних уровней и всего процентов на 30-40 для каждого. В то же время, если у тебя, скажем, вложенность 8 и среднее число компонент - 5, то на нижнем уровне будет порядка 350000 номенклатур и выигрыш будет уже прямопропорционален числу хелперов...
Цитата:
Сообщение от fed Посмотреть сообщение
Для подсчета колчества хелперов, достаточно посмотреть сколько дополнительных заданий появилось в пакетной задаче после запуска.
Для того чтобы оценить объем пересчитываемой номенклатуры - достаточно посмотреть BomCALCItemTask сгруппированный по уровням (поле Level или BOMLevel) где-нибудь после того как начали работать задания, пересчитывающие нижний уровень вложенности
Добрый день. Вот я вернулся и вчера продолжил разбираться с этой задачей. Как я понял, чтоб увидеть на сколько процессов(подпакетов) разбивается пакет нужно открыть форму Основное->Пакетное задание там нажать кнопку Просмотр задач. У меня в настройках пакетного сервера стоит возможность разбитья на 20 потоков...По кол-ву процессоров на сервере. В принципе это всё и происходит, Но ускорения расчёта я не замечаю.
Как я реализовал тот механизм который Вы мне посоветовали.
В Классе BomCalcJob_All есть метод prepareTasksForSelectedItems. Там идёт создания списка всех спецификаций которые нужно сформировать. Там я сделал анализ, что если мы накладываем фильтр по спецификации/номенклатуре, то формируем список только того что в неё входит(Кстати Вы были правы, что если указать номенклатуру без доработки то считается только она и не разбивается на составляющее). В принципе всё работает, но скорость таже . Что я пропустил? Ещё раз повторюсь что это всё делаю я на 2009-ке
Теги
цена номенклатуры

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ax2009 RU7 Расчет цены продажи спецификации Dimitori DAX: Функционал 3 20.11.2012 16:38
Расчет себестоимости номенклатуры Deepoint DAX: Программирование 5 20.07.2011 15:43
axforum blogs: О заполнении Наименования и Кода номенклатуры в печатной форме Накладной (Ax2009 ru7) Blog bot DAX Blogs 0 07.06.2011 09:11
Конфигуратор продукции (расчет цены) cherv DAX: Функционал 11 01.10.2007 10:27
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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