Access Stuff In The New Event Subscriptions
Views (9306)
Often when creating a new event subscription (some time ago I wrote about Events and Subscriptions in the new Dynamics AX) I need to look up how I can access stuff from the given parameters. So here are some random examples listed, without making claims of being complete.
The examples cover the new standard events. There’s nothing new on how you access things from the args you have in pre- and post-events. In case of delegates the parameters vary from case to case because each of them has its separate declaration.
Form datasource from xFormRun
[FormEventHandler(formStr(SomeForm), FormEventType::Initialized)] public static void SomeForm_OnInitialized(xFormRun sender, FormEventArgs e) { FormDataSource MyRandomTable_ds = sender.dataSource(formDataSourceStr(SomeForm, MyRandomTableDS)); ... }
Get FormRun from form datasource
[FormDataSourceEventHandler(formDataSourceStr(MyForm, MyRandomTableDS), FormDataSourceEventType::Written)] public static void MyRandomTableDS_OnWritten(FormDataSource sender, FormDataSourceEventArgs e) { FormRun formRun = sender.formRun() as FormRun; // you can even call custom methods (I think IntelliSense won't work though) formRun.myCustomMethod(); }
Get FormRun from form control
[FormControlEventHandler(formControlStr(MyForm, MyButton), FormControlEventType::Clicked)] public static void MyButton_OnClicked(FormControl sender, FormControlEventArgs e) { FormRun formRun = sender.formRun() as FormRun; formRun.myCustomMethod(); }
Access form control from xFormRun
[FormEventHandler(formStr(SomeForm), FormEventType::Initialized)] public static void SomeForm_OnInitialized(xFormRun sender, FormEventArgs e) { // set the control to invisible as an example sender.design().controlName(formControlStr(SomeForm, MyControl)).visible(false); }
Get current record in form control event
[FormControlEventHandler(formControlStr(SomeForm, SomeButton), FormControlEventType::Clicked)] public static void SomeButton_OnClicked(FormControl sender, FormControlEventArgs e) { // as an example the datasource number is used for access; I perceive the formDataSourceStr as more robust SomeTable callerRec = sender.formRun().dataSource(1).cursor(); }
Convert Common and use DataEventArgs
[DataEventHandler(tableStr(AnyTable), DataEventType::ValidatedWrite)] public static void InventLocation_onValidatedWrite(Common sender, DataEventArgs e) { // convert Common to AnyTable AnyTable anyTable = sender; // the DataEventArgs actually are ValidateEventArgs and can be converted ValidateEventArgs validateEventArgs = e; // the ValidateEventArgs carry the validation result (so far) boolean ret = validateEventArgs.parmValidateResult(); // the table has some additional validation logic and gives back the result ret = anyTable.doSomeAdditionalCustomValidation(ret); // provide the args with the validation result validateEventArgs.parmValidateResult(ret); }
Use the onValidatedFieldValue event properly
[DataEventHandler(tableStr(SomeTable), DataEventType::ValidatedFieldValue)] public static void SomeTable_onValidatedFieldValue(Common sender, DataEventArgs e) { SomeTable someTable = sender; // the clue is to know that the DataEventArgs actually are ValidateFieldValueEventArgs and that you can get the field name from them ValidateFieldValueEventArgs validateEventArgs = e; boolean ret = validateEventArgs.parmValidateResult(); FieldName fieldName = validateEventArgs.parmFieldName(); switch (fieldName) { case fieldStr(SomeTable, SomeCustomField): ... do some magic break; } validateEventArgs.parmValidateResult(ret); }
Use the MappedEntityToDataSource event
[DataEventHandler(tableStr(MyTableEntity), DataEventType::MappedEntityToDataSource)] public static void MyTableEntity_onMappedEntityToDataSource(Common _sender, DataEventArgs _eventArgs) { DataEntityContextEventArgs eventArgs = _eventArgs; MyTableEntity entity = _sender; if (eventArgs.parmEntityDataSourceContext().name() == dataEntityDataSourceStr(MyTableEntity, MyTable)) { MyTable myTable = eventArgs.parmEntityDataSourceContext().getBuffer(); ... do some magic with it } }
*This post is locked for comments