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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.06.2022, 14:04   #1  
axm2017 is offline
axm2017
Участник
 
1,938 / 317 (14) ++++++
Регистрация: 15.05.2017
PurchTableWorkflow и немножко архитектуры + неочевидного
Смотрю метод submit
X++:
public void  submit()
    {
        WorkflowSubmitDialog            workflowSubmitDialog;

        if (purchTable != null)
        {
            // Tax is needed to be calculated first or else the Accounting Distribution allocation factor will not be calculated correctly.
            if (Ledger::isLedgerBudgetControlEnabled())
            {
                PurchTotals::newPurchTable(purchTable).calc();
            }
                
            if (this.canSubmit(purchTable))
            {
                workflowSubmitDialog = WorkflowSubmitDialog::construct(args.caller().getActiveWorkflowConfiguration());

                if (this.submitDialog(workflowSubmitDialog))
                {
                    purchTable.submitToWorkflow(workFlowTypeStr(PurchTableTemplate), workflowSubmitDialog.parmWorkflowComment(), false);
                }
            }
        }
    }
Заинтересовал кусочек
X++:
 // Tax is needed to be calculated first or else the Accounting Distribution allocation factor will not be calculated correctly.
if (Ledger::isLedgerBudgetControlEnabled())
            {
                PurchTotals::newPurchTable(purchTable).calc();
            }
Получается предварительный расчет по заказу как то меняет данные да так что от этого зависит остальное?

Можно ли как то этого избежать или вынести куда то если цель сократить время до появления диалога
X++:
this.submitDialog
Вдруг кто глубоко рылся в данном коде или умеет в спеца по perfomance?

Последний раз редактировалось axm2017; 15.06.2022 в 14:07.
Старый 15.06.2022, 14:56   #2  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Мне кажется, что если в каких-нибудь проверках того "можно ли отправить в воркфлоу" и т.д. не используются итоги - то этот пересчет вполне можно перенести на после вызова диалога, куда-то в начало воркфлоу.
За это сообщение автора поблагодарили: axm2017 (5).
Старый 15.06.2022, 15:00   #3  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Для контроля бюджета в закупках перед отправкой в workflow со времен AX2012 идет расстановка счетов ГК и расчет Accounting distribution. Самое позднее, когда это случается - это формирование Confirmation.

Чтобы ускорить, надо сделать так, чтобы Ledger::isLedgerBudgetControlEnabled() возвращал false?
За это сообщение автора поблагодарили: axm2017 (5).
Старый 16.06.2022, 08:36   #4  
axm2017 is offline
axm2017
Участник
 
1,938 / 317 (14) ++++++
Регистрация: 15.05.2017
Заметил что повторные запуски
PurchTotals::newPurchTable(purchTable).calc(); существенно ускоряются так как видимо в работе класса предположительно используется кэширование.
Первый запуск традиционно идет небыстро.

Можно ли как то запустить класс в стороне и потом как то расшарить кэш и на пользователя?
Старый 16.06.2022, 09:39   #5  
DarkSpirit22 is offline
DarkSpirit22
Участник
Аватар для DarkSpirit22
 
13 / 94 (4) ++++
Регистрация: 07.11.2013
Адрес: СПб
Там не совсем кэш. В 2012 в модуле поставщиков реализовали кэширование в постоянной таблице TaxUncommitted. Если для связи HeaderTableId + HeaderRecId( напр. для PurchTable или VendInvoiceInfoTable) есть уже посчитанные налоги, то Tax (TaxPurch) возьмет от туда, иначе пойдет считать. Подробнее можете почитать здесь.
За это сообщение автора поблагодарили: axm2017 (5).
Старый 17.06.2022, 16:43   #6  
axm2017 is offline
axm2017
Участник
 
1,938 / 317 (14) ++++++
Регистрация: 15.05.2017
решил в общем попытаться уже традиционно для себя через runAsync
runAsync и его использование

Пример для любознательных чтобы не копаться как передать параметры из таска обратно в основной поток
X++:
validationTask.Wait();
AsyncTaskResult asyncTaskResult = AsyncTaskResult::getAsyncTaskResult(validationTask);

boolean valid;
container messageContainer;

[valid, messageContainer] = asyncTaskResult.getResult();
infolog.import(messageContainer);

Последний раз редактировалось axm2017; 17.06.2022 в 16:47.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
О рукожо..ах (?). И немножко ER axm2017 DAX: Программирование 9 07.05.2021 11:53
ну или вот еще пример "правильной" архитектуры. т.е. сейчас чтобы создать диалог с кнопкой выбрать файл надо написать 60 строк кода trud DAX: Программирование 18 15.06.2017 08:47
Прояснение понятий архитектуры Аксапты Narayana DAX: Администрирование 43 02.09.2012 18:05
Месяц жизни с Oracle. Впечатления и вопрос. egorych DAX: Администрирование 13 02.02.2009 10:38
Временные таблицы в отчете Прокопьева DAX: Программирование 25 02.10.2006 14:54

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

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

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