It is a common customization task to override standard form data source field methods like jumpRef(), modified() or validate().
Recommended approach in AX 7 is to avoid overlaying and use extensions as much as possible. To achieve this new events were introduced. However on form data source field level we have only 3 available events:
We can try to use form controls instead of form data source fields but this approach has several cons:
- User can add new control using form personalization and this control won’t support overridden logic. It could be critical if you are restricting field lookup values or adding validations.
- One form could have several controls that refers to one data source field so you have to duplicate your code.
- Number of delegates are limited as well. Microsoft will add more later
For example we want to add custom jumpRef() and validate() methods to itemId field on sales order form. To achieve this we have to either overlay it or use next approach.
First of all
we will create class to handle method overrides.
public class
SalesTableEventHandler
{
/
[FormDataSourceEventHandler(formDataSourceStr(SalesTable, SalesLine),
FormDataSourceEventType::Initialized)]
public static void
SalesLine_OnInitialized(FormDataSource _sender, FormDataSourceEventArgs _e)
{
var overrides =
SalesTableFormExtensionOverrides::construct();
_sender.object(fieldNum(SalesLine,
ItemId)).registerOverrideMethod(methodStr(FormDataObject, jumpRef),
methodStr(SalesTableFormExtensionOverrides, itemId_OnJumpRef),
overrides);
_sender.object(fieldNum(SalesLine,
ItemId)).registerOverrideMethod(methodStr(FormDataObject, validate),
methodStr(SalesTableFormExtensionOverrides,
itemId_OnValidate), overrides);
}
}
Then we will
create new event handler class and subscribe to OnInitialized event of
SalesLine data source.
public class
SalesTableFormExtensionOverrides
{
protected void new()
{
}
public static
SalesTableFormExtensionOverrides construct()
{
return new
SalesTableFormExtensionOverrides();
}
public void itemId_OnJumpRef(FormDataObject
_targetField)
{
InventTable::jumpRefItemId(_targetField.getValue(), OpenMode::Edit);
}
public boolean
itemId_OnValidate(FormDataObject _targetField)
{
//emulate super() call. Comment out to
skip.
boolean ret = _targetField.validate();
if (ret)
{
//custom validation here.
}
return ret;
}
}