It is a common customization task to override standard form data source field methods like jumpRef(), modified() or validate(), lookupReference(), resolveReference() and etc
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:
// <summary> /// Handles events raised by <c>SalesTable</c> form. /// </summary> public class SalesTableEventHandler { /// <summary> /// Post event handler for <c>SalesTable</c> <c>SalesLine</c> Initialized event. /// </summary> /// <param name=“_sender”></param> /// <param name=“_e”></param> [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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | /// <summary> /// Contains methods which are used to override <c>SalesLine</c> data source field methods. /// </summary> public class SalesTableFormExtensionOverrides { protected void new () { } /// <summary> /// Constructs a new instance of <c>SalesTableFormExtensionOverrides</c> class. /// </summary> /// <returns> /// A <c>SalesTableFormExtensionOverrides</c> class. /// </returns> public static SalesTableFormExtensionOverrides construct() { return new SalesTableFormExtensionOverrides(); } /// <summary> /// Provides the open main table functionality for an item. /// </summary> /// <param name ="_targetField"> The <c>FormDataObject</c> where the jumpRef is triggered.</param> public void itemId_OnJumpRef(FormDataObject _targetField) { InventTable::jumpRefItemId(_targetField.getValue(), OpenMode::Edit); } /// <summary> /// Checks whether <c>ItemId</c> is valid. /// </summary> /// <param name = "_targetField"> The <c>FormDataObject</c> where the Validate is triggered.</param> public boolean itemId_OnValidate(FormDataObject _targetField) { //emulate super() call. Comment out to skip. boolean ret = _targetField.validate(); if (ret) { //custom validation here. } return ret; } } |
That’s all. Using this approach you can override any data source field method.
Comments
Post a Comment