Six months into learning how to transition from AX 2012 X++ to D365FO X++ one of the things I have been struggling with the new extension model is how many different code structures you need in order to access the calling method’s property’s/datasource when subscribing to various types of events or methods. So I started to log down anytime I discover a new method. As I am sure there are plenty of other ones that I am missing as I have only touched the tip of the iceberg when it comes to field events but I decided it would be a good time to post this information as a reference. There is more than likely better ways to do some of these however I am posting this as a starting point.
I will be updating this post as my experience with D365FO grows as well
Source | Event | Parm | Example |
Class | Pre/Post event | XppPrePostArgs | Get args and parmameter values from a method that is being extended. Parm 1 = Object Parm 2 = Common PurchCreateFromSalesOrder callingClass = args.getThis() as PurchCreateFromSalesOrder; Object callerObject = args.getArgNum(1) as Object; Common callerRecord = args.getArgNum(2) as Common; |
Class | Pre/Post event | XppPrePostArgs | Class example: SalesLineType salesLineType = args.getThis() as SalesLineType; |
Form | Initialized | xFormRun | FormDataSource purchLine = sender.dataSource(formDataSourceStr([formname],[table])); |
Form | DataSource | FormDataSource | FormDataSource formDS = sender.formRun().dataSource(formDataSourceStr(EcoResProductDetailsExtended, MHSmartATPItemSettings)); MHSmartATPItemSettings smartATPItemSettings = formDS.cursor(); |
Form | DataSource Field | FormDataObject | FormDataSource formDS = sender.datasource(); PurchLine purchLine = formDS.cursor(); |
Form | Form Control | FormControl | FormRun formRun; FormControl formControl; formRun = sender.formRun(); formControl = FormRun.design().controlName(formControlStr(<form name>, <control name>)); someVariable = formControl.valueStr(); |
Form | onClicked | FormControl | FormRun formRun = sender.formRun(); FormDataSource formDSSalesTable = formRun.dataSource(formDataSourceStr(SalesTable, SalesTable)); FormDataSource formDSSalesLine = formRun.dataSource(formDataSourceStr(SalesTable, SalesLine)); SalesTable salesTable = formDSSalesTable.cursor(); SalesLine salesLine = formDSSalesLine.cursor(); |
Form | Pre/Post event | XppPrePostArgs | FormRun formRun = args.getThis(); FormDataSource formDSLogisticsPostalAddress = formRun.dataSource(formDataSourceStr(LogisticsPostalAddress, LogisticsPostalAddress)); LogisticsPostalAddress logisticsPostalAddress = formDSLogisticsPostalAddress.cursor(); |
Table | onDelete | Common | PurchLine purchLine = sender as PurchLine; |
Table | Modified Field Value | Common | TableName itemSettings = sender as TableName; ModifyFieldValueEventArgs fieldEvent = e as ModifyFieldValueEventArgs; //check to see which field was modified switch(fieldEvent.parmFieldName()) { case fieldStr([tablename], [fieldname]): ...do stuff break; } |
Table | ValidateFieldValue | Common/DataEventArgs | ValidateFieldValueEventArgs fieldEvent = e; boolean isValid; PurchLine purchLine = sender as PurchLine; //declare the checkFailed isValid = checkFailed("some error event"); //save the result fieldEvent.parmValidateResult(isValid); |
Table | Pre/Post event | XppPrePostArgs | PurchLine purchLine = args.getThis() as PurchLine; |
It is good to note that when it comes to accessing anything on a form I have realized the key component is getting access to the FormRun object. Once you have access to that then you can really access anything that is public on the form such as controls or datasources
*This post is locked for comments