| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Оповещение пользователю
			 
			
			Доброго времени года. 
		
		
		
		
		
		
		
	Не подскажите каким образом можно программно отправить уведомление пользователю, какой класс за это отвечает? Существует ли возможность в это уведомление вставить ссылку на MenuItem. Если нет, то реализуемо ли это с помощью почтового сообщения?  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			с помощью классов EventNotification* можно создавать оповещения
		 
		
		
		
		
		
		
		
		
			Последний раз редактировалось ice; 31.03.2011 в 17:15.  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 северный Будда 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ребята, вы не забывайте версии указывать. Не всегда классы 2009 есть в 3.0  
		
		
		
		
		
		
			 
		
				__________________ 
		
		
		
		
	С уважением, Вячеслав  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			EventNotification* в 4.0 также нет.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			2009 Ax, спасибо за ответы, попробую разобраться с классом EventNotification, а по поводу возможности вставки ссылки на MenuItem в данном классе она присутсвует?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Для 4.0 я выкладывал свой пример. 
		
		
		
		
		
		
			Для Ax 2009 можно написать наследника EventNotification. У него есть параметры: X++: notification.parmMenuFunction(_menuFunction);
    notification.parmRecord(_record);X++: new MenuFunction("LedgerTable", MenuItemType::Display), 
				__________________ 
		
		
		
		
	Ivanhoe as is..  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: someOne (5). | |
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Я использую следующий код для отправки уведомлений, уведомления приходят но вот ссылка не меню в нем нет, причем записи в таблице 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(); | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А вы мой проект смотрели? В 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; } 
				__________________ 
		
		
		
		
		
			Ivanhoe as is.. Последний раз редактировалось Ivanhoe; 04.04.2011 в 11:20.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			а для чего пререпивываете код отправки уведомлений? почему не пользуетесь готовыми классами?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
X++: inbox.AlertTableId = TableNum(CustTable); inbox.AlertFieldId = FieldNum(CustTable, Name); inbox.TypeTrigger = EventTypeTrigger::FieldChanged; 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'); | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от AngelDominantes
			 
 
			Как я понимаю работу оповещений: Существует Таблица куда записываются оповещения(EventInbox), существует какой то класс который постоянно эти оповещения из этой таблицы считывает и доставляет пользователям. Оповещения туда помещаются при срабатывании какого то события на таблице, 
		
	Цитата: 
	
Цитата: 
	
В вашем примере еще не хватает вот этого: X++:         list      = SysDictTable::getUniqueIndexFields(table.id());
        if (list)
        {
            inbox.KeyFieldList   = list.pack();
            inbox.KeyFieldData   = SysDictTable::mapFieldIds2Values(list,record).pack();
        }
				__________________ 
		
		
		
		
	Ivanhoe as is..  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В вашем примере еще не хватает вот этого: 
		
		
		
		
		
		
		
		
			X++:         list      = SysDictTable::getUniqueIndexFields(table.id());
        if (list)
        {
            inbox.KeyFieldList   = list.pack();
            inbox.KeyFieldData   = SysDictTable::mapFieldIds2Values(list,record).pack();
        }ПыСы: Если четно кроме этого форума не существует по моему никакой вменяемой документации  
		Последний раз редактировалось AngelDominantes; 04.04.2011 в 16:35.  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			inboxData и inbox - разные таблицы так что ваше "но" мне не понятно  
		
		
		
		
		
		
			![]() Документация в данном случае - стандартный код. Когда я с этим разбирался, рассуждал по-другому - сначала всё повторил как в стандарте (и убедился, что работает), а уже потом пытался оптимизировать и "выкидывать лишнее"  
		
				__________________ 
		
		
		
		
	Ivanhoe as is..  | 
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от 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 - разные таблицы так что ваше "но" мне не понятно  
		
	![]() Документация в данном случае - стандартный код. Когда я с этим разбирался, рассуждал по-другому - сначала всё повторил как в стандарте (и убедился, что работает), а уже потом пытался оптимизировать и "выкидывать лишнее" ![]()  | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Извините, но я вашу логику не понимаю. Я пас  
		
		
		
		
		
		
			![]() Удачи в разбирательствах. 
				__________________ 
		
		
		
		
	Ivanhoe as is..  | 
| 
	
 | 
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Логика по моему железная, раз кнопка не активна значит что то ее дезактивирует, значит надо найти это что-то и посмотреть какие критерии. Собственно вот в чем была загвоздка 
		
		
		
		
		
		
		
		
			X++: ...
    if (eventInbox.ParentTableId)
        goToContext.enabled(true);
    else
        goToContext.enabled(false);
...Последний раз редактировалось AngelDominantes; 04.04.2011 в 17:33.  | 
| 
	
 | 
| 
			
			 | 
		#20 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Подниму старую тему... Поясните пожалуйста, есть ли связь между созданием самого оповещения и выводом всплывающего окна для пользователя о новом оповещении ? 
		
		
		
		
		
		
		
	Что то я не смог с этим разобраться. Итак, как создать оповещение пользователю - понятно. Есть пример от Ivanhoe, джоб в котором добаляются записи в таблицу EventInbox. Так же ясно как вывести всплывающее окно пользователю об оповещении - делается с использованием класса EventAttentionGrabberParms. Но как создать оповещение пользователю, чтобы каждое новое оповещение "всплыло" для данного пользователя в данный момент (если у него запущена Аксапта, либо при следующем ее запуске) ??? Ведь создание оповещений через создание записи в таблице EventInbox никаких всплывающих окон не вызывает. (Или я не прав ?) (Происходит лишь изменение отображаемых не прочитанных оповещений в нижней части экрана Аксапта) Как все же сделать отображение всплывающих окон для пользователя о новых оповещениях ? Примеров на форуме для этого не нашел... Писать собственную обработку (вызов EventAttentionGrabberParms) с использованием какого то таймера ? Или есть "стандартный" споcоб ? Может что то в личных настройках пользователя не так ?  | 
| 
	
 |