Benjagroup

søndag den 27. april 2008

Dynamics AX Alerts in X++

Dynamics AX Alerts are handled by 2 tables: EventRule and EventData

To create an alert rule you basically create and entry in the EventRule table and inserts corresponding data in the EventData table.
The EventRule table is fairly simple, but creating the needed data for alert processing can be a bit tricky.
The EventData table consist of 4 entries pr alert rule:
  • Filter data
    Filter data contains a query to select entries in the Table for which the Alert rule is triggered.
    eg. I only want an alert if I am the reponsible for the journal that is due

  • Context data
    Value data contains information as Type of alert and parameters,
    eg. DueDate alert, and the Alert should be triggered 1 day before the due date

  • Value data
    Context data contains information about the form and field that the Alert is bound to.
    This will indicate what form to open, when the users respons to the alert

  • AlertField data
    AlertField data contains information on how to instanciate the form and what form data source to lookup in.. I think ;)


The following method creates an Alert Rule for the given employee.
The alert rule is triggered, when a journal (in table PRM_Journal) for which the employee is responsible (Field: PRM_MeasurementResponsible) is due in 1 day (Field: DueDate).

/*Create an alert rule for the given employee
* This will notify the employee 1 day before a journal is due. */
public static void CreateAlertRule(EmplId _emplId)

{


PRM_Journals journal;
QueryBuildDataSource journal_ds;
EventRule eventRule;

/* Actions (Alert,Email) */
List actions = new List(Types::Integer);

/* Filter */
boolean saveQuery = true;
Query filterQuery;
QueryBuildRange respRange;
QueryBuildRange stateRange;
QueryBuildRange SendEmailRange;

/* Type Value */
EventTypeDueIn eventType = new EventTypeDueIn();

/* Context */
Args args;
FormRun PRM_Journal_Form;
EventContextInformation eci = new EventContextInformation();

/* tmpEventAlertField */
Map fds2EventBuildValidAlertFields;
// Map holding valid alert field instances per formDataSource
tmpEventAlertField tmpEventAlertField;

int tableId;
int FieldId;
str FormName;
int eventTypeId;
;

tableId = journal.TableId;
FieldId = 105539; // DueDate
FormName = formstr(PRM_Journal);
eventTypeId = classnum(EventTypeDueIn);

ttsbegin;

/* ----- Create the Alert Rule ------ */
/* Setup Event Rule */
actions.addEnd(classNum(EventActionAlert));
actions.addEnd(classnum(EventActionEmail));
eventRule.RuleId = NumberSeq::newGetNum(CompanyInfo::numRefParmId()).num();
eventRule.UserId = _emplId;
eventRule.TypeId = eventTypeId;
eventRule.AlertTableId = tableId;
eventRule.AlertFieldId = FieldId;
eventRule.PrimTableId = tableId;
eventRule.Until = EventUntil::Always;
eventRule.Enabled = NoYes::Yes;
eventRule.AlertQbdsNo = 1;
eventRule.FormName = FormName;
eventRule.TypeTrigger = EventTypeTrigger::DueType;
eventRule.RuleCondition = EventRuleCondition::Custom;
eventRule.AlertFieldLabel = "@SYS14588"; // Due date
eventRule.DeleteRefRecId = 0;
eventRule.ShowPopup = NoYes::No;
eventRule.SendEmail = NoYes::Yes;
eventRule.Subject = "@PRM697";
eventRule.Message = "@PRM698";
eventRule.ActionIds = actions.pack();
eventRule.insert();
/* Setup Event Rule end */


/* Filter data */
filterQuery = new Query();
journal_ds = filterQuery.addDataSource(journal.TableId);
respRange = journal_ds.addRange(fieldnum(PRM_Journals, PRM_MeasurementResponsible));
respRange.value(_emplId);
stateRange = journal_ds.addRange(fieldnum(PRM_Journals, JournalPosted));
stateRange.value(QueryValue(NoYes::No));
SendEmailRange = journal_ds.addRange(fieldnum(PRM_Journals, PRM_SendEmail));
SendEmailRange.value(QueryValue(NoYes::Yes));
eventRule.filterQuery(filterQuery);
/* Filter data end */


/* Value data */
eventType.setRule(eventRule);
eventType.parmTypeTrigger(EventTypeTrigger::DueType);
eventType.parmXValue(1); // antal dage til due date ... (Due in 1 calender day)
eventRule.typeValue(eventType.pack());
/* Value data end */


/* Context data */
args = new args();
args.name(formstr(PRM_Journal));
PRM_Journal_Form = classFactory.formRunClass(args);
PRM_Journal_Form.init();
args.menuItemType(MenuItemType::Display);
args.menuItemName(FormName);
eci.setPackedArgs(args);
eci.setEventRuleId(eventRule.RuleId);
eci.setFormControlName('PRM_Journals_PRM_DueDate');
eci.setFormRun(PRM_Journal_Form);
eci.setAlertFormDsNo(1);
eventRule.contextInfo(eci.pack());
/* Context data end */


/* Alert Field data */
if (!fds2EventBuildValidAlertFields)
fds2EventBuildValidAlertFields = new Map(Types::Integer,Types::Class);

if (!fds2EventBuildValidAlertFields.exists(PRM_Journal_Form.dataSource(1).id()))
fds2EventBuildValidAlertFields.insert(
PRM_Journal_Form.dataSource(1).id(),
EventBuildValidAlertFields::newFormDataSource(PRM_Journal_Form,PRM_Journal_Form.dataSource(1),false)
);


tmpEventAlertField = fds2EventBuildValidAlertFields.lookup(PRM_Journal_Form.dataSource(1).id()).label2TmpEventAlertField('Due date');
eventRule.alertField([tmpEventAlertField]);
/* Alert Field data end */

ttscommit;

}


Remember to setup all alert processing... such as email templates, alert batch jobs, batch server etc.

Etiketter:

2 kommentarer:

Klokken 9. december 2009 kl. 07.03 , Anonymous Anonym sagde ...

hvad jeg ledte efter, tak

 
Klokken 30. december 2009 kl. 07.09 , Anonymous Anonym sagde ...

thanks !! very helpful post!

rH3uYcBX

 

Send en kommentar

Abonner på Kommentarer til indlægget [Atom]

<< Start