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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.03.2011, 16:49   #1  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Оповещение пользователю
Доброго времени года.
Не подскажите каким образом можно программно отправить уведомление пользователю, какой класс за это отвечает? Существует ли возможность в это уведомление вставить ссылку на MenuItem. Если нет, то реализуемо ли это с помощью почтового сообщения?
Старый 31.03.2011, 17:12   #2  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
с помощью классов EventNotification* можно создавать оповещения

Последний раз редактировалось ice; 31.03.2011 в 17:15.
Старый 31.03.2011, 17:15   #3  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Ребята, вы не забывайте версии указывать. Не всегда классы 2009 есть в 3.0
__________________
С уважением,
Вячеслав
Старый 31.03.2011, 17:16   #4  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
EventNotification* в 4.0 также нет.
Старый 31.03.2011, 17:38   #5  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
2009 Ax, спасибо за ответы, попробую разобраться с классом EventNotification, а по поводу возможности вставки ссылки на MenuItem в данном классе она присутсвует?
Старый 31.03.2011, 17:50   #6  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Для 4.0 я выкладывал свой пример.

Для Ax 2009 можно написать наследника EventNotification. У него есть параметры:
X++:
notification.parmMenuFunction(_menuFunction);
    notification.parmRecord(_record);
Создать _menuFunction можно так:
X++:
new MenuFunction("LedgerTable", MenuItemType::Display),
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: someOne (5).
Старый 04.04.2011, 10:51   #7  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Я использую следующий код для отправки уведомлений, уведомления приходят но вот ссылка не меню в нем нет, причем записи в таблице EventInboxData создаются, что я делаю не так?
X++:
        inbox.initValue();
        inbox.UserId            = 'ed13';
        inbox.Subject           = subject;
        inbox.Message           = 'Текст';
        inbox.EmailRecipient    = sysUserInfo::find(inbox.UserId).Email;
        inbox.SendEmail         = true;
        inbox.ShowPopup         = NoYes::Yes;
        inbox.TypeId            = classnum(EventType);
        inbox.CompanyId         = CurExt();
        inboxId                 = EventInbox::nextEventId();
        inbox.InboxId           = inboxId;
        inbox.AlertCreatedDateTime       = DateTimeUtil::getSystemDateTime();
        //Give any table and field values
        inbox.AlertedFor        = "no links";
        inbox.AlertTableId      = TableNum(CustTable);
        inbox.AlertFieldId      = FieldNum(CustTable, Name);
        inbox.TypeTrigger       = EventTypeTrigger::FieldChanged;
        eci = new EventContextInformation();
        if (!menuFunction)
        {
            menuFunction = new  MenuFunction(menuitemdisplaystr(S_CustVendMainForm),MenuItemType::Display);
        }
        
        args.menuItemName(menuFunction.name());
        args.menuItemType(MenuItemType::Display);

        eci.parmPackedArgs(args);
        inboxData.InboxId = inboxId;
        inboxData.DataType = EventInboxDataType::Context;
        inboxData.Data = eci.pack();
        inboxData.insert();
        inbox.insert();
Старый 04.04.2011, 11:18   #8  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
А вы мой проект смотрели? В 4.0 по крайней мере нужно было явно создать контекст и ссылку на запись (по ключевым полям):

X++:
// IF EventExtension 08.09.2009
static void tutorialCreateAlert(Args _args)
{
    LedgerTable             lt;
    Args                    args;
    Query                   q = new Query();
    QueryBuildDataSource    qbds;
    Common                  record;
    str                     name;
    EventInbox              ei;
    EventInboxData          eid;
    EventType               eventType;
    EventContextInfo        contextInfo;
    EventTypeValue          typeValue;
    container               cont;
    List                    list;
    ;

    ttsbegin;

    ei.clear();
    ei.initValue();
    ei.InboxId              = EventInbox::nextEventId();
    ei.UserId               = "Admin";  // пользователь
    ei.Subject              = "Тема!!!"; // тема
    ei.Message              = "Сообщение"; // сообщение
    ei.AlertedFor           = "В связи с событием"; // в связи с чем оповещение
    ei.AlertCreatedDate     = systemdateget();
    ei.AlertCreateTime      = timenow();
    ei.TypeId               = classnum(EventTypeCUD);
    ei.AlertTableId         = tableNum(LedgerTable);  // таблица записи
    ei.AlertFieldId         = fieldNum(LedgerTable, AccountName); // поле которое изменилось
    ei.AlertFieldLabel      = "Наименование";
    ei.ParentTableId        = ei.AlertTableId;
    ei.TypeTrigger          = EventTypeTrigger::FieldChanged;
    ei.ShowPopup            = NoYes::Yes; // показывать оповещение
    ei.SendEmail            = NoYes::No; // отсылать почту. Не реализовано в этом джобе.
    ei.EmailRecipient       = ""; //Почтовый адрес. Не реализовано в этом джобе.

    select firstonly lt where lt.AccountNum == '01.000'; // запись которую будем потом показывать

    list                = SysDictTable::getUniqueIndexFields(lt.TableId);
    if (list)
    {
        ei.KeyFieldList   = list.pack();
        ei.KeyFieldData   = SysDictTable::mapFieldIds2Values(list, lt).pack();
    }

    ei.insert();

    eid.clear();
    eid.InboxId          = ei.InboxId;
    eid.DataType         = EventInboxDataType::Context;

    qbds = q.addDataSource(ei.AlertTableId);

    cont = q.pack();

    contextInfo = [1,  //version, DAX 4.0 - 1
                   formstr(LedgerTable), //formname
                   "", //designname
                   0, //dataset
                   0, //parmenumType
                   0, //parmItemName
                   "", //например, "FavQuery:Статус" - favourite query
                   MenuItemType::Display, //menuitemtype
                   menuitemdisplaystr(LedgerTable), //menuitemname
                   ei.TypeId, //typeid
                   EventTypeTrigger::FieldChanged, //typetrigger
                   ei.AlertTableId, //alerttableid
                   1, //alertformDSNo номер датасорса по которому потом искать будем.
                   true, //alertFdsIsTop
                   1, //alertQbdsNo
                   "", //control name
                   cont //filterQueryCon
                   ];

    eid.Data             = contextInfo;
    eid.insert();

    eid.clear();
    eid.InboxId          = ei.InboxId;
    eid.DataType         = EventInboxDataType::TypeData;
    eventType = EventType::construct(ei.TypeId, ei.TypeTrigger);
    eventType.parmOriginalValue("");
    eventType.parmCurrentValue("");
    eid.Data             = eventType.pack();
    eid.insert();

    ttscommit;

}
В 2009 немного параметры поменялись, но суть такая же. См. EventNotification.create() - кроме проверки прав доступа там все важно повторить.
__________________
Ivanhoe as is..

Последний раз редактировалось Ivanhoe; 04.04.2011 в 11:20.
Старый 04.04.2011, 11:27   #9  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
Я использую следующий код для отправки уведомлений, уведомления приходят но вот ссылка не меню в нем нет, причем записи в таблице EventInboxData создаются, что я делаю не так?
а для чего пререпивываете код отправки уведомлений? почему не пользуетесь готовыми классами?
Старый 04.04.2011, 13:35   #10  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
А вы мой проект смотрели? В 4.0 по крайней мере нужно было явно создать контекст и ссылку на запись (по ключевым полям):


В 2009 немного параметры поменялись, но суть такая же. См. EventNotification.create() - кроме проверки прав доступа там все важно повторить.
Как я понимаю работу оповещений: Существует Таблица куда записываются оповещения(EventInbox), существует какой то класс который постоянно эти оповещения из этой таблицы считывает и доставляет пользователям. Оповещения туда помещаются при срабатывании какого то события на таблице, НО если в эту таблицу сделать программный insert() указав:
X++:
        inbox.AlertTableId      = TableNum(CustTable);
        inbox.AlertFieldId      = FieldNum(CustTable, Name);
        inbox.TypeTrigger       = EventTypeTrigger::FieldChanged;
то мы как бы говорим произошло событие на таблице CustTable, нужно пользователей оповестить, однако в действительности событие не происходило. В связи с этим вопрос: при заполнении EventInboxData след образом:
X++:
        args.menuItemName(menuFunction.name());
        args.menuItemType(MenuItemType::Display);     
        eci.parmAlertBuffer(record);
        eci.parmAlertFormDsName('S_CustVendCommon');
        eci.parmPackedArgs(args);
        inboxData.InboxId = inboxId;
        inboxData.DataType = EventInboxDataType::Context;
        inboxData.Data = eci.pack();
        inboxData.insert();
и указании
X++:
        eci.parmAlertBuffer(record);
        eci.parmAlertFormDsName('S_CustVendCommon');
на другую таблицу(отличную от той на которую мы якобы генерировали событие), будет ли это работать, если да то в чем может быть загвоздка? оповещение приходит но без ссылки на меню и судя по классу EventNotification никаких дополнительных параметров при Inserte заполнять не нужно.
Старый 04.04.2011, 14:08   #11  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Цитата:
Сообщение от ice Посмотреть сообщение
а для чего пререпивываете код отправки уведомлений? почему не пользуетесь готовыми классами?
А какой класс является готовым? EventNotification является абстрактным.
Старый 04.04.2011, 14:15   #12  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
А какой класс является готовым? EventNotification является абстрактным.
его наследники
Старый 04.04.2011, 15:26   #13  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Цитата:
Сообщение от ice Посмотреть сообщение
его наследники
У него 3 наследника и ни 1 из них не является готовым, насколько я могу судить конечно, как начинающий.
Старый 04.04.2011, 15:54   #14  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
Как я понимаю работу оповещений: Существует Таблица куда записываются оповещения(EventInbox), существует какой то класс который постоянно эти оповещения из этой таблицы считывает и доставляет пользователям. Оповещения туда помещаются при срабатывании какого то события на таблице,
Неправильно понимаете. EventInbox - это и есть уже "доставленное" оповещение.

Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
судя по классу EventNotification никаких дополнительных параметров при Inserte заполнять не нужно.
Как же так? Какая версия AX 2009? Точно смотрите метод create()??

Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
А какой класс является готовым? EventNotification является абстрактным.
Ну так сделайте наследника. В стандарте три примера для подражания.

В вашем примере еще не хватает вот этого:
X++:
        list      = SysDictTable::getUniqueIndexFields(table.id());

        if (list)
        {
            inbox.KeyFieldList   = list.pack();
            inbox.KeyFieldData   = SysDictTable::mapFieldIds2Values(list,record).pack();
        }
__________________
Ivanhoe as is..
Старый 04.04.2011, 16:29   #15  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
В вашем примере еще не хватает вот этого:
X++:
        list      = SysDictTable::getUniqueIndexFields(table.id());

        if (list)
        {
            inbox.KeyFieldList   = list.pack();
            inbox.KeyFieldData   = SysDictTable::mapFieldIds2Values(list,record).pack();
        }
Да действительно там есть такой код в Create(), но он используется уже после inboxData.insert(); и как я понимаю ссылка на меню заносится именно в inboxData или же все таки они связаны?
ПыСы: Если четно кроме этого форума не существует по моему никакой вменяемой документации

Последний раз редактировалось AngelDominantes; 04.04.2011 в 16:35.
Старый 04.04.2011, 16:43   #16  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
inboxData и inbox - разные таблицы так что ваше "но" мне не понятно

Документация в данном случае - стандартный код. Когда я с этим разбирался, рассуждал по-другому - сначала всё повторил как в стандарте (и убедился, что работает), а уже потом пытался оптимизировать и "выкидывать лишнее"
__________________
Ivanhoe as is..
Старый 04.04.2011, 16:59   #17  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Неправильно понимаете. EventInbox - это и есть уже "доставленное" оповещение.


Как же так? Какая версия AX 2009? Точно смотрите метод create()??


Ну так сделайте наследника. В стандарте три примера для подражания.

В вашем примере еще не хватает вот этого:
X++:
        list      = SysDictTable::getUniqueIndexFields(table.id());

        if (list)
        {
            inbox.KeyFieldList   = list.pack();
            inbox.KeyFieldData   = SysDictTable::mapFieldIds2Values(list,record).pack();
        }
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
inboxData и inbox - разные таблицы так что ваше "но" мне не понятно

Документация в данном случае - стандартный код. Когда я с этим разбирался, рассуждал по-другому - сначала всё повторил как в стандарте (и убедился, что работает), а уже потом пытался оптимизировать и "выкидывать лишнее"
В том то и дело что разные, поэтому я подумал что повторить 1 в 1 заполнение для записи в inboxData будет достаточно, что собственно и сделал, сейчас пытаюсь понять в каком случае конпка "Перейти к источнику" на форме оповещений активна.
Старый 04.04.2011, 17:28   #18  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Извините, но я вашу логику не понимаю. Я пас
Удачи в разбирательствах.
__________________
Ivanhoe as is..
Старый 04.04.2011, 17:31   #19  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Логика по моему железная, раз кнопка не активна значит что то ее дезактивирует, значит надо найти это что-то и посмотреть какие критерии. Собственно вот в чем была загвоздка
X++:
...
    if (eventInbox.ParentTableId)
        goToContext.enabled(true);
    else
        goToContext.enabled(false);
...
Такая проверка стояла на форме EventAlertInbox(Форма отображающая оповещения), то есть если не был указан родитель формы на которую вы вешаете оповещение, даже если его нет, то кнопка "Перейти к источнику" будет просто не активна. Всем спасибо за ответы. Тему можно клоз!

Последний раз редактировалось AngelDominantes; 04.04.2011 в 17:33.
Старый 04.10.2011, 09:56   #20  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Подниму старую тему... Поясните пожалуйста, есть ли связь между созданием самого оповещения и выводом всплывающего окна для пользователя о новом оповещении ?
Что то я не смог с этим разобраться.

Итак, как создать оповещение пользователю - понятно.
Есть пример от Ivanhoe, джоб в котором добаляются записи в таблицу EventInbox.

Так же ясно как вывести всплывающее окно пользователю об оповещении - делается с использованием класса
EventAttentionGrabberParms.

Но как создать оповещение пользователю, чтобы каждое новое оповещение "всплыло" для данного пользователя в данный момент (если у него запущена Аксапта, либо при следующем ее запуске) ???

Ведь создание оповещений через создание записи в таблице EventInbox никаких всплывающих окон не вызывает. (Или я не прав ?)
(Происходит лишь изменение отображаемых не прочитанных оповещений в нижней части экрана Аксапта)

Как все же сделать отображение всплывающих окон для пользователя о новых оповещениях ?
Примеров на форуме для этого не нашел...
Писать собственную обработку (вызов EventAttentionGrabberParms) с использованием какого то таймера ? Или есть "стандартный" споcоб ?
Может что то в личных настройках пользователя не так ?
Теги
ax2009, уведомление

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как отправить уведомление пользователю? Yulie DAX: Программирование 11 27.03.2008 10:06
Оповещение в сводном планировании Penguin DAX: Функционал 19 05.10.2005 11:59
Оповещение в CRM sam DAX: Функционал 2 28.05.2004 06:10
Вопрос к пользователю при сохранении данных в таблице Anais DAX: Программирование 1 23.03.2004 19:46
Вопрос к пользователю при сохранении данных в таблице Anais DAX: Программирование 1 19.03.2004 10:28

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

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

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