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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.01.2010, 11:20   #1  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
! Проект расширения стандартных оповещений AX 4.0
Выкладываю проект с расширениями стандартных оповещений AX 4.0 SP2 EE.

Новые возможности:
1. Создание правил оповещений:
1.1. Указание группы пользователей - оповещение получат все пользователи группы. Обязательность поля "Код пользователя" сохранена, проверка на права доступа также оставлена стандартная - по стандартному пользователю.
1.2. Указание поля или метода исходной таблицы, содержащей код пользователя - оповещение получит соответствующий пользователь. Поле указывается в виде %createdBy%, метод - виде %method()%. Проверки на валидность поля или метода нет.
1.3. Использование мета-тегов в Теме и Сообщении. Можно указать поле или метод записи для подстановки в Тему или Сообщение оповещения. Пример: %itemId% или %getPrice()%.
2. Расширение формы просмотра оповещений:
2.1. Добавлена группа с фильтрами - группа видна только пользователям с правами на ключ AdminSetup. Удобно просматривать "чужие" или "удаленные" оповещения.
2.2. Добавлены поля "Тип" (показывает как был выбран адресат - по пользователю, по группе или из исходной записи) и "Код группового оповещения" - если оповещение для группы пользователей - ссылка на базовое оповещение.
3. Исправление стандарта:
3.1. Исправлен переход к источнику оповещения для таблиц с несколькими составными индексами.
4. Создание оповещений из кода:
4.1. Класс EventInboxCreate - создание оповещений (включая почтовые) из кода. Пример использования - см. джоб tutorialCreateInbox.
4.2. Джоб tutorialCreateAlert - программное создание оповещения (без почты) работой напрямую с таблицами оповещений.

Проект выкладывается для ознакомления и использования для собственных нужд
Все функции протестированы, но 100% гарантии не даю =)
Если есть замечания или пожелания - пишите.
Вложения
Тип файла: rar SharedProject_EventExtension.rar (35.5 Кб, 355 просмотров)
__________________
Ivanhoe as is..

Последний раз редактировалось Ivanhoe; 13.01.2010 в 11:23.
За это сообщение автора поблагодарили: mazzy (2), AlGol (1), GLU (1), Maksim (1), EAlex (1), sukhanchik (2), Logger (5), jasper (1), Poleax (2), konopello (2), gl00mie (3), Atar (1), wojzeh (1), alica_17 (1), player (1), sgt.Pepper (1), HorrR (1), sparco (0), Emka (1).
Старый 12.02.2010, 22:46   #2  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
спасибо большое за этот проект!

рекомендую всё же инициировать значение переменной в методе Execute классов EventActionAlert и EventActionEmail:

X++:
    UserId                  userId = eventRule.UserId;
иначе это приводит к исключительной ситуации здесь

X++:
 if (SysUserInfo::find(userId, false) && !confind(users, userId))
когда система пытается продублировать запись существующего текущего пользователя.
__________________
Felix nihil admirari

Последний раз редактировалось wojzeh; 12.02.2010 в 23:49. Причина: пропустил название метода и классов
За это сообщение автора поблагодарили: Ivanhoe (1).
Старый 15.02.2010, 14:01   #3  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от wojzeh Посмотреть сообщение
...
иначе это приводит к исключительной ситуации здесь

X++:
 if (SysUserInfo::find(userId, false) && !confind(users, userId))
когда система пытается продублировать запись существующего текущего пользователя.
Спасибо за отзыв!!!
Я думаю, лучше сделать так:
X++:
if (userId && SysUserInfo::find(userId) && !confind(users, userId))
, т.е. если пользователь из исходной записии не настроен, то и не проверять ничего.
__________________
Ivanhoe as is..
Старый 15.02.2010, 16:46   #4  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
вся красота кроётся внутри метода SysUserInfo::find()
__________________
Felix nihil admirari
Старый 15.02.2010, 17:17   #5  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Ну так если первое условие false, Аксапта дальше уже ничего не делает.
__________________
Ivanhoe as is..
Старый 15.02.2010, 17:19   #6  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
к тебе вопросов нет - ты чист!

думаю вот, как сделать, чтобы письма усылались не только на пользователей аксапты, но и по полям типа Employee или вообще, по любым электропочтам.
__________________
Felix nihil admirari
Старый 15.02.2010, 17:36   #7  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
1.2. Указание поля или метода исходной таблицы, содержащей код пользователя - оповещение получит соответствующий пользователь. Поле указывается в виде createdBy, метод - виде method() (знак % не нужен!)
__________________
Felix nihil admirari
Старый 15.02.2010, 17:51   #8  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Насчет других типов полей - либо расширять функциональность и проверять тип переданного поля (например на UserID, EmplId - соответственно обрабатывать, все остальное - ругаться, что некорректное поле), либо использовать метод на таблице - который вернет именно UserId.

По поводу произвольной почты - сейчас сделано по аналогии со стандартом, чтобы можно было перейти из почтового сообщения к оповещению или прямо в нужную форму аксапты, а для этого нужен EventInbox.
Наверное, можно сделать один EventInbox "общим" и на него ссылаться для всех остальных email, не привязанных к пользователю аксапты. Если же нужно только оповестить, без перехода в AX, то доработка не сложная, делали на проектах.
__________________
Ivanhoe as is..
Старый 22.02.2010, 02:56   #9  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
можешь подробней растолковать, зачем нужно поле "Код группового оповещения"?
__________________
Felix nihil admirari
Старый 22.02.2010, 09:24   #10  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от wojzeh Посмотреть сообщение
можешь подробней растолковать, зачем нужно поле "Код группового оповещения"?
Ну например, сидят манагеры по продажам - вдруг им всем приходит оповещение о приходе конкретного товара на склад. Они начинают по нему работать (резервировать и т.д.)
__________________
Возможно сделать все. Вопрос времени
Старый 22.02.2010, 16:35   #11  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
как работает группа пользователей (EventRule.UserGroupId), я понимаю - мой вопрос о поле EventInbox.GroupEventInboxId - оно зачем?
__________________
Felix nihil admirari
Старый 24.02.2010, 10:21   #12  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Сейчас это поле нужно для создания нескольких почтовых сообщений для пользователей группы на основании первого (стандартного) - каждому должно прийти письмо со ссылкой именно на его оповещение. Ну и плюс - можно смотреть потом какие оповещения были сделаны для группы, т.е. для разбора типа "я не получал", "мне не приходило" и т.п.

На развитие думал про такую возможность:
В AX2009 в рамках документооборота есть понятие согласование и задача. При этом назначение задачи могут получить несколько пользователей, но выполнять ее нужно только один раз (одному сотруднику) - для этого пользователь нажимает кнопку "Принять" - т.е. уведомляет остальных, что он взял задачу на себя и остальным ее выполнять не надо (наскока я помню, в системе остальные оповещения просто будут удалены). В 4.0, предлагаю, сделать также - добавить признак правила оповещения "Задача" и по этому признаку давать возможность нажать кнопку "Принять", после чего все остальные оповещения этой группы надо либо удалить, либо пометить как-нибудь.
__________________
Ivanhoe as is..
Старый 24.02.2010, 17:19   #13  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
спасибо за ответ. честно говоря, я всё равно не понял назначение этого поля, ибо и без него каждый пользователь из группы получает своё оповещение.

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

нарисовал пока вот так, "жёстко". (фрагмент метода класса)

X++:
static str getFieldValueFromCode(str _fieldByCode, common _buffer)
...
 // if the table exists
    if (bufferTable)
    {
        parentBuffer = _buffer;
        // the table here is the "parent" table to _buffer
        // it comes to a parent table: we need to locate one
        if (tId != _buffer.TableId)
        {
            // Realised for Sales and Purchase orders only
            // Sales orders
            if ((tId == tableNum(SalesTable)) && (_buffer.TableId == tableNum(SalesLine)))
            {
                parentBuffer = SalesTable::find(SalesLine::findRecId(_buffer.RecId).SalesId);
            }
            // Purchase orders
            if ((tId == tableNum(PurchTable)) && (_buffer.TableId == tableNum(PurchLine)))
            {
                parentBuffer = PurchTable::find(PurchLine::findRecId(_buffer.RecId).PurchId);
            }
        }
...
провернуть такой же трюк на таблице ProdJournalBOM, которая связана с ProdJournalTable не получается...
__________________
Felix nihil admirari
Старый 24.02.2010, 17:42   #14  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от wojzeh Посмотреть сообщение
спасибо за ответ. честно говоря, я всё равно не понял назначение этого поля, ибо и без него каждый пользователь из группы получает своё оповещение.
...
Хм, сам когда написал, понял что не понятно. Попробую еще раз
Как работает стандарт:
0. Общий фреймворк обработки записанных событий:
1. запускает создание оповещение в EventInbox.
2. по записи из п.1 запускает создание почтового сообщения.

Т.е. п.1 про п.2 ничего не знает.

После того, как мы вклинились в п.1 и наделали кучку дополнительных оповещений, система переходит к п.2 и передает параметром только основное оповещение, т.к. ничего не знает про наши дополнительные оповещения.

Соответственно, чтобы создать почту по всем дополнительным оповещениям нам нужен был признак для их поиска - все оповещения, которые связаны с основным оповещением.

По поводу вашей задачи - не совсем понятно, чего вы хотите добится - можете с точки зрения пользователя объяснить?
__________________
Ivanhoe as is..
Старый 24.02.2010, 19:16   #15  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
теперь понял. спасибо!

моя задача в том, чтобы, например, при изменении поля в SalesLine уведомлять сотрудника (SalesResponsible), указанного в SalesTable (в родительской таблице).

то есть, изменения происходят в дочерней таблице, а поле для уведомлений ищется в родительской.
__________________
Felix nihil admirari
Старый 24.02.2010, 19:50   #16  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Для данной задачи я предполагал использовать методы на таблице-источнике. Создайте метод на таблице строк, который вернет нужного пользователя. В общем случае это более универсальное решение - мало ли надо проверить, что ответственный сейчас в отпуске и вместо него нужно отправить оповещение его заместителю?
__________________
Ivanhoe as is..
Старый 24.02.2010, 20:04   #17  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
я беру проблему более общо: например, если мы хотим использовать поля из родительской таблицы в тэгах сообщения.

%SalesTable.DeliveryAddress% по изменению чего-нибудь в SalesLine
__________________
Felix nihil admirari
Старый 24.02.2010, 22:08   #18  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Так для этого и сделана поддержка методов таблицы. Используйте SalesLine.DeliveryAddress() - так проще, чем писать явные связи между определенными таблицами.
__________________
Ivanhoe as is..
Старый 24.02.2010, 23:08   #19  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
нет, это концептуальный момент для меня в плане универсальности.

явные связи между определёнными таблицами уже существуют, а моя задача их находить в момент создания правила - в этом загвоздка пока.

кстати, в момент создания правила на форме с несколькими таблицами эти связи "находятся" - их видно в верхней части, в запросе.
__________________
Felix nihil admirari
Старый 25.02.2010, 08:50   #20  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Не всегда они находятся зависит от формы. Если на форме сложные диналинки, очень сложные индексы или еще что, то система спасует и при попытке перейти к источнику оповещения честно напишет - переход не возможен.

Допустим, нужно отследить тот же SalesLine, но информацию нужно взять из группы договора - т.е. SalesLine - SalesTable - RContractTable - RContractCode - вы хотите написать универсальный алгоритм раскрутки такой цепочки?
__________________
Ivanhoe as is..
Теги
alert, ax2009, ax4.0, законченный пример, оповещения, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: List of fixes that improve performance of certain features in Dynamics AX 2009 Blog bot DAX Blogs 0 13.10.2009 19:06
gatesasbait: Dynamics AX 2009 SSRS and SSAS Integration Tips Blog bot DAX Blogs 3 09.07.2009 13:07
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
Arijit Basu: AX 2009 - Quick Overview Blog bot DAX Blogs 4 19.05.2008 14:47
ALEG: Проект "Фишка недели" и первый пост - Microsoft Dynamics™ AX .NET Business Connector Blog bot DAX Blogs 1 22.11.2006 09:43

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

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

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