AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 05.07.2022, 09:09   #1  
axm2017 is offline
axm2017
Участник
 
2,067 / 296 (14) ++++++
Join Date: 15.05.2017
Workflow Алгоритмы одобрения Можно ли изменить/добавить
Возник вопрос по workfow. Хотим доработать алгоритм одобрения для каких то случаев. Может кто-то копал возможно ли это? Куда смотреть?
Old 05.07.2022, 09:39   #2  
sukhanchik is offline
sukhanchik
Administrator
sukhanchik's Avatar
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Join Date: 13.06.2004
Location: Москва
А в чём проблема? Есть элементы WF в АОТе, они ссылаются на классы - там логика. Фантазии можно разные реализовать
__________________
Возможно сделать все. Вопрос времени
Old 05.07.2022, 10:01   #3  
axm2017 is offline
axm2017
Участник
 
2,067 / 296 (14) ++++++
Join Date: 15.05.2017
Quote:
Originally Posted by sukhanchik View Post
А в чём проблема? Есть элементы WF в АОТе, они ссылаются на классы - там логика. Фантазии можно разные реализовать
Ну вот как то сразу не понимаю куда смотреть (пока не сильно погружен в эту тему увы).
Сценарий из разряда
есть WF с параллельными заданиями
например условно ищут потерянные вещи сотрудники А Б (параллельно ищут вещь 1)
и С с D (ищут другую вещь 2))
при одобрении сотрудниками AA или ББ знающими как выглядит вещь 1 факта что сотрудник А нашел нужную вещь отпускаем с чистой совестью и А и Б но С и D продолжает трудиться для них ободрить могут ББ и CC.
Old 05.07.2022, 10:15   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
Назначить один шаг одобрения сразу и одновременно нескольким лицам, причем установить в одном случае условие "Any one approver", а в другом "All approvers".
Old 05.07.2022, 10:33   #5  
axm2017 is offline
axm2017
Участник
 
2,067 / 296 (14) ++++++
Join Date: 15.05.2017
Quote:
Originally Posted by EVGL View Post
Назначить один шаг одобрения сразу и одновременно нескольким лицам, причем установить в одном случае условие "Any one approver", а в другом "All approvers".
Таких процессов и критериев типа вещь 1 вещь 2, АА и ББ, слишком много чтобы настраивать вручную постоянно вручную.
Old 05.07.2022, 10:43   #6  
gudzon is offline
gudzon
программист
 
1,166 / 329 (13) ++++++
Join Date: 06.07.2004
Location: Москва
Quote:
Originally Posted by axm2017 View Post
Таких процессов и критериев типа вещь 1 вещь 2, АА и ББ, слишком много чтобы настраивать вручную постоянно вручную.
Вещь 1 или вещь 2 это по идеи строки должны быть документа. WF чисто про подбор исполнителей и последовательность их назначения. И только.
Т.е. есть документ с кучей вещей, которые надо найти. Вы можете написать свой "провайдер", который подберет для каждой вещи по любому алгоритму кто именно должен искать. Дальше уже собственно WF создается как описал EVGL. Когда любой исполнитель из группы 1 допустим найдет Вещь 1 - в строке меняется статус Найдено.

На заказе на продажу (или покупки, не помню) и на заявках на закупку реализовано построчное согласование документа. Правда сам не пробовал как это работает.

Last edited by gudzon; 05.07.2022 at 10:48.
Old 05.07.2022, 10:51   #7  
axm2017 is offline
axm2017
Участник
 
2,067 / 296 (14) ++++++
Join Date: 15.05.2017
Quote:
Originally Posted by gudzon View Post
Вещь 1 или вещь 2 это по идеи строки должны быть документа. WF чисто про подбор исполнителей и последовательность их назначения. И только.
Т.е. есть документ с кучей вещей, которые надо найти. Вы можете написать свой "провайдер", который подберет для каждой вещи по любому алгоритму кто именно должен искать. Дальше уже собственно WF создается как описал EVGL. Когда любой исполнитель из группы 1 допустим найдет Вещь 1 - в строке меняется статус Найдено.

На заказе на продажу (или покупки, не помню) и на заявках на закупку реализовано построчное согласование документа. Правда сам не пробовал как это работает.
Идет параллельный поиск то есть ищут все вещи (вещь 1 вещь 2 вещь 3..) одновременно. Нахождение одной вещи закрывает сразу часть параллельных заданий а не одно.
А точно провайдер может это?
Old 05.07.2022, 11:00   #8  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
Нет. Провайдер только выдает список лиц. Запрограммировать "дальнодействие" между открытыми заданиями в Workflow сложно до невозможности, они каждый в своем контексте, и не проверяют статусы по таймеру или любому другому событию, а реагируют только на кнопки, чтобы двигаться дальше.
Old 05.07.2022, 11:14   #9  
gudzon is offline
gudzon
программист
 
1,166 / 329 (13) ++++++
Join Date: 06.07.2004
Location: Москва
Quote:
Originally Posted by axm2017 View Post
Идет параллельный поиск то есть ищут все вещи (вещь 1 вещь 2 вещь 3..) одновременно. Нахождение одной вещи закрывает сразу часть параллельных заданий а не одно.
А точно провайдер может это?
EVGL уже ответил.
Основном посыл - не надо бизнес-логику тащить в WF. Он это не понимает. Там нет сложной генерации задач и управления ими из кода. Задания создаются только по настройкам и на одну "запись в таблице". Если у вас какой то сложная генерация заданий, лучше сделать промежуточную таблицу на документ - Задания на поиск, и на нее уже WF натравить. По каждому заданию из этой таблицы можно делать одно задание WF и назначать параллельных исполнителей. Статус менять уже у этой таблицы - а она из кода уже может менять у связанных строк (вещей).
Old 05.07.2022, 15:56   #10  
sukhanchik is offline
sukhanchik
Administrator
sukhanchik's Avatar
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Join Date: 13.06.2004
Location: Москва
Quote:
Originally Posted by axm2017 View Post
например условно ищут потерянные вещи сотрудники А Б (параллельно ищут вещь 1)
и С с D (ищут другую вещь 2))
при одобрении сотрудниками AA или ББ знающими как выглядит вещь 1 факта что сотрудник А нашел нужную вещь отпускаем с чистой совестью и А и Б но С и D продолжает трудиться для них ободрить могут ББ и CC.
Ну тут надо понимать - что WF - это в первую очередь утверждение чего-то применительно к конкретной записи в таблице и фиксация выполненной работы (обработка взятой на себя заявки) опять-таки в привязке к конкретной записи в таблице.
Т.е. WF не задумывался в роли алгоритма поиска потерянных вещей, т.е. ситуация, когда А нашел чего-то, а C и D ещё ищут - неприменима для WF (понятно, что "натянуть" функционал с некоторыми ограничениями можно всегда)
__________________
Возможно сделать все. Вопрос времени
Old 07.07.2022, 11:00   #11  
axm2017 is offline
axm2017
Участник
 
2,067 / 296 (14) ++++++
Join Date: 15.05.2017
Quote:
Originally Posted by sukhanchik View Post
...
Т.е. WF не задумывался в роли алгоритма поиска потерянных вещей, т.е. ситуация, когда А нашел чего-то, а C и D ещё ищут - неприменима для WF (понятно, что "натянуть" функционал с некоторыми ограничениями можно всегда)
Судя по коду как раз что то такое (А нашел закрываем и Б) хотели делать при параллельных заданиях и не только.
Типичное в коде SysWorkflowWorkItem метод completeWorkItems
X++:
while select forupdate
            *
        from workItemTable
        where
            // BP deviation documented
            workItemTable.CorrelationId == _correlationId &&
            workItemTable.StepId == _stepId
        {
            if (workItemTable.Status != WorkflowWorkItemStatus::Completed)
            {
                if (_isClaimed && workItemTable.ActivityId == _claimedActivityId)
                {
                    if (workItemTable.Queue)
                    {
                        SysWorkflowWorkItem::completeNotification(workItemTable.CompanyId, workItemTable.NotificationId);
                        workItemTable.NotificationId = 0;
                        workItemTable.UserId = _user;
                        workItemTable.Subject = _subject;
                        workItemTable.Description = _instructions;
                    }
                    workItemTable.IsClaimed = NoYes::Yes;
                }
                else
                {
                    workItemTable.Status = WorkflowWorkItemStatus::Completed;

                    SysWorkflowWorkItem::completeNotification(workItemTable.CompanyId, workItemTable.NotificationId);
                    workItemTable.NotificationId = 0;
                }
                workItemTable.update();
            }
Де факто закрывают часть заданий скопом
Old 07.07.2022, 11:19   #12  
sukhanchik is offline
sukhanchik
Administrator
sukhanchik's Avatar
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Join Date: 13.06.2004
Location: Москва
Здесь могут быть 2 идеи:
1. Очереди задач. Есть какое-то количество задач (элемент АОТа Task) в пуле (очереди) задач. Кто из пользователей, кто полномочен эти задачи решать - жмет кнопку принять (аналог того, что человек, обслуживающий посетителей жмет кнопку "следующий по электронной очереди"). Ему попадает какая-то задача. Он ее на себя берет, выполняет и по ее завершению - жмет кнопку Выполнить. Также он может эту задачу вернуть обратно в очередь задач.

2. Как глобально работает WF: Когда пользователь нажал кнопку, то система не кинулась прямо сразу выполнять действия, которые заложены в WF. Крутится независимый пакетник, который (условно раз в минуту) проверяет все элементы WF (и Task и Approval) на предмет изменения их статуса. Ну и скопом их обрабатывает.

Поэтому Ваш пример может быть просто примером "оптовой" обработки элементов WF (потому что это просто пакетник). Но Вы могли также видеть и функционал работы с очередями
__________________
Возможно сделать все. Вопрос времени
Old 07.07.2022, 13:20   #13  
axm2017 is offline
axm2017
Участник
 
2,067 / 296 (14) ++++++
Join Date: 15.05.2017
там идея именно в том что выполнение одной задачи закрывает и другие.
Сделано своеобразно но работает именно так
завершил свою задачу закрылись параллельные по той же теме
Old 08.07.2022, 14:13   #14  
DesparioN is offline
DesparioN
Участник
 
86 / 15 (1) ++
Join Date: 21.10.2014
Правильно ли я понял, что есть некий документ, по которому запущен WF. В рамках этого документа может быть осуществлен поиск рандомного количества предметов разными группами лиц. При этом по каждой вещи должно быть хотя бы одно выполнение для завершения этапа?
Old 08.07.2022, 14:27   #15  
axm2017 is offline
axm2017
Участник
 
2,067 / 296 (14) ++++++
Join Date: 15.05.2017
Quote:
Originally Posted by DesparioN View Post
Правильно ли я понял, что есть некий документ, по которому запущен WF. В рамках этого документа может быть осуществлен поиск рандомного количества предметов разными группами лиц. При этом по каждой вещи должно быть хотя бы одно выполнение для завершения этапа?
Не вдаваясь в конкретные детали описал ранее эквивалент
"Идет параллельный поиск то есть ищут все вещи (вещь 1 вещь 2 вещь 3..) одновременно. Нахождение одной вещи закрывает сразу часть параллельных заданий тех кто ищет вещь"
Распараллеливание и ко решается силами WF вопрос был о том как менять механизм для подобного согласования. Было интересно узнать чужой опыт. Кусок как меняют нашел в коде в итоге (см. выше)
Old 08.07.2022, 14:43   #16  
DesparioN is offline
DesparioN
Участник
 
86 / 15 (1) ++
Join Date: 21.10.2014
Главное не забыть из этого метода delete_from messageTable, иначе может получиться многократное обновление
This post has been rated by: axm2017 (1).
 

Similar Threads
Thread Thread Starter Forum Replies Last Post
DAX2009: как можно добавить текст перед Microsoft Dynamics AX oleggy DAX: Программирование 2 10.07.2020 13:08
atinkerersnotebook: Developing a Product Approval Workflow in Dynamics AX 2012 Blog bot DAX Blogs 0 09.11.2013 17:12
Как можно изменить цвет шрифта в Excel? Hidden DAX: Программирование 4 15.04.2005 12:33
Можно ли изменить дату введения в экслуатацию velk DAX: Функционал 2 20.08.2004 17:18
Можно ли изменить Enum типа NoYes или PrintMedium? funnut DAX: Программирование 1 08.07.2004 14:21

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 22:38.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.