How To Override An Existing Lookup Method: Chain Of Command & Event Handler
Usama Mehmood
Senior Technical Consultant ERP / Microsoft Dynamics 365 Finance & Operations | Integration & Customization specialist | Enabler of Business | Digital Transformation
In this article you will learn how to override an existing lookup method that exists on a form that is in a different model than your own. In a previous article we looked at
. However, there are some extra steps needed to learn how to override an existing lookup method in D365.
Two Ways To Override An Existing Lookup Method
There are actually two ways to override an existing lookup method.
I will explain both methods. Ultimately, I do not know that one way is preferred over the other. I am more partial to using Chain Of Command, because I find the attribute syntax easier to write. And I tend to put all of my other extension code in a Chain Of Command class. But please use whatever you are most comfortable with.
COC BASE Source Code of Lookup:
[ExtensionOf(formStr(HCMPosition))]
final class SLD_HCMPosition_Form_Extension
{
???public void init()
???{
???????next init();
?
?????// ?FormStringControl DepartmentGroupControl = this.design().controlName(formControlStr(HCMPosition, HcmPositionDetail_Department));
???????HcmPositionDetail_Department.registerOverrideMethod(methodStr(FormDataObject, lookup), formMethodStr(HCMPosition, overridenDepartmentLookup));
???}
?
???public void overridenDepartmentLookup(FormStringControl _formControl)
???{
???????Query query = new Query();
???????QueryBuildDataSource qbds;
???????QueryBuildRange qbr;
?
???????SysTableLookup sysTableLookup;
?
???????sysTableLookup = SysTableLookup::newParameters(tableNum(OMOperatingUnit), _formControl);
???????sysTableLookup.addLookupfield(fieldNum(OMOperatingUnit, Name));
?
???????qbds = query.addDataSource(tableNum(OMOperatingUnit));
???????qbds.addRange(fieldNum(OMOperatingUnit, Division)).value("Department");
?
???????sysTableLookup.parmQuery(query);
???????sysTableLookup.performFormLookup();
?
???}
?
}
领英推荐
Event Handler of Lookup
/// <summary>
???///
???/// </summary>
???/// <param name="sender"></param>
???/// <param name="e"></param>
???[FormControlEventHandler(formControlStr(HcmPosition, HcmPositionDetail_DepartmentName), FormControlEventType::Lookup)]
???public static void HcmPositionDetail_DepartmentName_OnLookup(FormControl sender, FormControlEventArgs e)
???{
??????
?
???????Query query = new Query();
???????QueryBuildDataSource qbds;
???????QueryBuildRange qbr;
?
???????SysTableLookup sysTableLookup;
?
???????sysTableLookup = SysTableLookup::newParameters(tableNum(OMOperatingUnit), sender);
???????sysTableLookup.addLookupfield(fieldNum(OMOperatingUnit, Name));
?
???????qbds = query.addDataSource(tableNum(OMOperatingUnit));
???????qbds.addRange(fieldNum(OMOperatingUnit, Division)).value("Department");
?
???????sysTableLookup.parmQuery(query);
???????sysTableLookup.performFormLookup();
?
???????//cancel the call to super() to prevent the system from trying to show
???????//the lookup form twice and cause an error.
???????FormControlCancelableSuperEventArgs cancelableSuperEventArgs = e as FormControlCancelableSuperEventArgs;
???????cancelableSuperEventArgs.CancelSuperCall();
?
?
???}
Happy Learning!!
Usama Mehmood