[AX2012 R3]关于Alerts

AX2012提供两种类型的Alert,Change-based alert和Due-date-based alert,前者用于在对新建记录、删除记录、记录的某个指定字段被改变的时候发出提醒,后者则是用于监视记录日期类型的某个字段,在超期指定的日期后发出提醒。在记录的编辑form或者list page上右键菜单中我们能找到“Create alert rule”菜单项,通过它打开alert规则创建窗口。规则创建窗口里我们可以选择alert要发给谁,只能是一个特定的用户,不能是一个用户组,如果通知需要发送给多个用户只能创建多个alert规则了。另外在我们可以勾选“Send email”将通知通过邮件的方式发送给用户,要使用这个功能必须设置好Alert邮件模板,首先在Organization administration>Setup>Email-template创建一个Alert的邮件模板(非系统邮件模板),邮件模板中可以添加占位符变量,在生成具体的邮件时指向真实的数据。Alert邮件模板的例子可以在https://technet.microsoft.com/en-us/library/aa834376.aspx找到。创建好邮件模板后,我们还需要到Organization administration>Setup>Alerts>Alert parameter选择这个邮件模板为我们的Alert邮件模板。所有的通知规则我们可以在Organization administration>Setup>Alerts>Alert rules找到,在这里可以管理创建好的通知规则,使能或者删除规则等。通知规则列表有一列叫做Organiztion-wide,这个不是能手工修改的,如果我们对公司无关的表(比如workers、products)添加规则时会自动打勾。

通知规则创建好后不等于在记录改变时你就能收到Alert消息,我们还需要配置两个Batch job,由它们来处理发出通知消息。一个是 System administration>Periodic>Alerts> Change based alerts,由它处理change-based通知。另一个是 System administration>Periodic>Alerts>Due date alerts,由它出来due-date-based通知。

先来看Change-based的批处理任务,它运行的类是EventJobCUD,它只是判断EventCUD表中是否要处理的Alert事件,如果有则交由EventJobCUDTask处理。EventJobCUDTask读取EventCUD需要处理的记录的用户ID,通过runas切换到该用户运行EventJobCUDTask.runCudEventsForUser(),runCudEventsForUser依次读取该用户相关的EventCUD记录,然后交由EventProcessorCUD处理。EventProcessorCUD针对事件的类型(更新、删除、创建、主键更改)做不同的处理,比如更新事件,它从EventCUD的Data字段(Container类型)剥离出被监视记录字段的字段ID、新老值,创建EventTypeCUD对象,保存更新字段的新老值,随后根据通知规则中的通知类型创建相应的EventAction,最后生成相应的事件通知保存在EventInbox表中。如果指定了使用邮件通知,会创建EventActionEmail对象,它负责生成占位符对象数据映射,交由SysEmailTable或者SysEmailSystemTable生成实际的邮件放到SysOutgoingEmailTable等候发送。处理成功后相关记录在EventCUD中被删除。这里只是对处理过程做了简单的陈述,实际的过程要复杂得多,需要处理表继承已经通知规则中指定的记录过滤查询等。

可以看出change-based通知的核心是处理EventCUD的记录,那么这个表中的数据是从哪里来的呢?微软的解释是使用database log来检测记录更改,alert模块在xApplication类的EventInsert、EventUpdate、EventDelete注册自己的回调函数,如果通知规则中涉及到的表发生变化将更改记录到EventCUD表。可以看到的是如果我们添加一个通知规则,在表DatabaseLog中会相应增加一条记录,记录对哪个表做EventXXX类型的log。System administration > Setup > Database > Database log setup看不到这些记录,这个form不显示和EventXXX类型的DatabaseLog。在通知规则监视的表记录修改后,其修改记录在System administration > Inquries > Database > Database log也是看不到的,但是在EventCUD中会增加相关记录。xApplication是系统类,看不到具体是如何实现的。

再来看Due-Date-based的批处理任务,它运行的是EventJobDueDate,它读取EventRule表中Due-date类型的通知规则的用户ID,也是runas切换到该用户执行runDueDateEventsForUser(),在runDueDateEventsForUser中调用EventProcessorDueDate.processRule()来处理当前的EventRule,从EventRule中读取记录过滤Query,读取Query中的记录,调用EventProcessorDueDate.processRecord()处理记录,如果日期字段超期,也是根据通知规则中的通知类型创建相应的EventAction,后面的过程和change-based类似了。如果通知规则已经触发并成功处理,该通知规则会被添加到表EventRuleIgnore中,后续不再触发(在EventTypeDue.canExecute()判断)。

在了解了Alert如何工作的后,我们可以添加自定义的事件类型(EventType)和自定义的事件处理动作(EventAction),可以参见https://msdn.microsoft.com/en-us/library/aa673670.aspx

通知消息是保存在表EventInbox中的,在user options的Notification一节我们可以设置接受通知的时间间隔,客户端按照时间间隔读取通知消息,如果通知设置了需要显示弹窗,AX client会弹出弹窗。可以想见的是直接操作EventInbox来创建用户通知,网上有很多例子,这里截取一个(http://daxldsoft.blogspot.com/2012/10/create-custom-alert-for-ax-with-go-to.html):

 public static void CreateAlert(str message,
               str subject,
               UserId userId = curUserId(),
               NoYes showPopup = NoYes::Yes,
               NoYes sendEmail = NoYes::No,
               Common record = null,
               str dataSourcename = ‘‘,
               MenuFunction menuFunction = null)
 {
   EventInbox inbox;
   DictTable table;
   EventContextInformation eci;
   EventInboxData inboxData;
   Args args = new Args();
   List list;
   EventInboxId inboxId = EventInbox::nextEventId();
   FormRun formRun;
   WorkflowRecordCaptionGenerator recordCaptionGenerator;
   UserInfo userInfo;
   inboxId = EventInbox::nextEventId();
   inbox.initValue();
   inbox.ShowPopup      = showPopup;
   inbox.Subject       = subject;
   inbox.Message       = message;
   inbox.SendEmail      = sendEmail;
   inbox.EmailRecipient    = SysUserInfo::find().Email;
   inbox.UserId        = userId;
   inbox.InboxId       = inboxId;
   inbox.AlertCreatedDateTime = DateTimeUtil::getSystemDateTime();
   if (record)
   {
     table = new DictTable(record.TableId);
     eci = new EventContextInformation();
     if (!menuFunction)
     {
       menuFunction = new MenuFunction(table.formRef(),MenuItemType::Display);
       if (!menuFunction)
         throw error(strFmt("@SYS104114",table.formRef()));
     }
     //Build the data to drill down to from the notification
     args.menuItemName(menuFunction.name());
     args.menuItemType(MenuItemType::Display);
     args.name(menuFunction.object());
     eci.parmPackedArgs(args);
     eci.parmAlertBuffer(record);
     eci.parmAlertFormDsName(dataSourceName);
     //eci.parmDontUseFormRunFromMenuItem(true);
     inboxData.InboxId = inboxId;
     inboxData.DataType = EventInboxDataType::Context;
     inboxData.Data = eci.pack();
     inboxData.insert();
     inbox.AlertTableId = table.id();
     inbox.ParentTableId = table.id();
     recordCaptionGenerator = WorkflowRecordCaptionGenerator::construct(record);
     inbox.AlertedFor = recordCaptionGenerator.caption();
     list = SysDictTable::getUniqueIndexFields(table.id());
     if (list)
     {
       inbox.keyFieldList(list.pack());
       inbox.keyFieldData(SysDictTable::mapFieldIds2Values(list,record).pack());
     }
     inbox.CompanyId = record.company();
   }
   inbox.insert();
 } 

使用上面的函数来创建Alert:

static void Job155(Args _args)
 {
   InventTable inventTable;
   select firstOnly inventTable;
   DEVUtils::CreateAlert("message", "subject", curUserId(), true, false, inventTable, "InventTable", new MenuFunction(menuitemDisplayStr(EcoResProductDetailsExtended), MenuItemType::Display));
 }  

上面的CreateAlert函数有个sendEmail参数,对应EventInbox的字段SendEmail,把这个参数设置为true,我们也不会收到邮件,因为我们只是标记了这个字段,我没有找到系统中有比如batch job来将EventInbox通过邮件发送出去。

时间: 2024-10-13 22:58:28

[AX2012 R3]关于Alerts的相关文章

AX2012 R3升级CU8的一些错误

AX2012 R3安装升级包CU8后进入系统,系统会提示打开软件升级清单“Software update checklist”,清单列出了升级要做的一系列动作. 在进行到编译应用时“Compile application”出现很多错误: Severity Path Line Col Error message Error \Classes\PayrollCalculatePayStatementBenefits\classDeclaration 12 5 Syntax error. Error

[AX2012 R3]在SSRS报表中使用QR二维码

AX2012是自带生成QR二维码的类,可以很方便的用在SSRS报表中,下面演示如何在RDP的报表中使用二维码,首先从定义临时表开始: 字段URL是要用于二维码的字符串,QrCode是container类型,保存最终生成的二维码图形二进制数据. DP类: class TestQrCodeDp extends SRSReportDataProviderBase { TestQrCodeTmp qrCodeTmp; } [ SRSReportDataSetAttribute(tableStr(Test

[AX2012 R3]关于Named user license report

Named user license报表是用来统计各种授权类型用户数的,这里来看看报表数据具体是如何来的.这是一个SSRS的报表,最主要的数据源是来自于类SysUserLicenseCountReport定义的RDP,在SysUserLicenseCountReport的方法processReport中使用SysUserLicenseMiner::fillUserLicenseCountTmpTbl()填充一个临时表,最核心的部分就是这个方法: public static void fillUs

AX2012 R3 CU8升级,安装 VS2013 开发组件

AX2012R3 CU8版本,安装VS2013开发组件的方法,有在安装过程中遇到问题的,或者更加便捷的方法,可以一起沟通下.         步骤如下:         1.在安装CU8补丁的时候(如何安装CU8,不赘述了),不要选VS2013组件(如果选择了,后面也不能用,还要卸载). 2.解压AX2012R3的安装包,原始文件为ISO镜像文件,解压为文件夹模式. 3.先打开解压软件,比如WinRAR,然后拖放CU8的补丁包Package.axupdate文件,到解压软件,(因为这个文件不是标

AX2012 Business Connector Error

6.0: AxCryptoClient - New encryption key created 6.0: Unable to InitializeSession. 6.0: No built-in message corresponding to message id 0. 解决方法: 1.将登录用户设为AX中的Business Connector用户. 2.将AX中的Business Connector用户添加到本地管理员组. AX2012 Business Connector Error,

PowerShape 2011 R3 SP1 Update Only Win32 1CD

TraceParts v2.3-ISO 1CD VisCAM.RP.v5.2.8600 1CD  Beta-CAE ANSA.v13.1.2.Win64 1CD CEI.Ensight.Gold.v9.2.2b.Linux64.Debian 1CD CEI.Ensight.Gold.v9.2.2b.MacOSX 1CD InfinySlice.v1.0.8581 1CD Leica.LISCAD.v9.0.3 1CD  AFT Impulse v4.0 2011.04.21 1CD AgroKa

UnderBalanced Simulator(HUBS) R3.2.1 1CD(钻井及完井工程设计模拟)

Coade CADWorx Pipe 3.1 1CD(三维配管设计软件) Coade Tank v3.10 1CD PLANT-4D v7.7.03-ISO 1CD 化工工作设计手册-管道设计(中文) 化工压力容器设计取证指南(中文) Signa产品: Hydraulic UnderBalanced Simulator(HUBS) R3.2.1 1CD(钻井及完井工程设计模拟) SPT Group产品: Drillbench Suite v5.1 1CD(钻井作业设计及规划软件) Drillbe

单词一百(3) 托福TPO6 R3

1  aloft -adv- 飞向天空 2  resolute -adj- 坚决的 3  slumber -n- 睡眠 4  endeavor -n v- 努力 5  ridicule -v- 嘲笑 愚弄 6  tedious -adj- 无聊的 7  provincial -adj- 地方性的 8  genial -adj- 脾气好的 9  conjecture -n v- 猜测 猜想 10  yoke -n- 牛枷锁 加锁 11  perilous -adj- 危险的 12  sage -a

JSOI2015 R3 退队滚粗了

JSTSC最终落下帷幕,最终还是没能翻盘成功——退队了,遗憾啊,中原得鹿不由人 day0 没啥好说的,我一开始把省常中和常州一中搞混了……,不过常州一中的伙食还是相当良心的,比省常中好 考前感觉状态不错,虽然前面考得不好,但一轮轮发挥得逐渐正常了,感觉自己有着进队的实力 day1 看题 T1 好像只会暴力 T2 这肯定是最小割 T3 ……没什么思路 想了想,感觉T2比较好写,于是码完T2过了样例,感觉样例挺强,查查了范围,随便造了一组数据就没管了 然后是T1,写了个暴力然后就不会了,似乎忘了怎么