After implementing lookup in D365 I encountered an error "More than one form was opened at once for the lookup control" while interacting with control as shown below.
Lookup Code
FormControlEventHandler(formControlStr(SalesTable, LC_AssetGroup_LC_AssetId), FormControlEventType::Lookup)]
public static void LC_AssetGroup_LC_AssetId_OnLookup(FormControl sender, FormControlEventArgs e)
{
Query query = new Query();
QueryBuildDataSource queryBuildDataSource;
SysTableLookup sysTableLookup;
sysTableLookup = SysTableLookup::newParameters(tableNum(AssetBook), sender);
queryBuildDataSource = query.addDataSource(tableNum(AssetBook));
queryBuildDataSource.addRange(fieldNum(AssetBook, Status)).value(strFmt('((Status == %1) || (Status == %2))', any2int(AssetStatus::Open), any2int(AssetStatus::Closed)));
sysTableLookup.addLookupField(fieldNum(AssetBook, AssetId), true);
sysTableLookup.addLookupMethod(tableMethodStr(AssetBook, assetName));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}
In order to fix this issue we need to make sure of following things:
- No super() call in lookup code
- FormControlCancelableSuperEventArgs must be used to cancel super()
FormControlCancelableSuperEventArgs event = e as FormControlCancelableSuperEventArgs;
event.CancelSuperCall();
Lookup Code with Fix
[FormControlEventHandler(formControlStr(SalesTable, LC_AssetGroup_LC_AssetId), FormControlEventType::Lookup)]
public static void LC_AssetGroup_LC_AssetId_OnLookup(FormControl sender, FormControlEventArgs e)
{
Query query = new Query();
QueryBuildDataSource queryBuildDataSource;
SysTableLookup sysTableLookup;
FormControlCancelableSuperEventArgs event = e as FormControlCancelableSuperEventArgs;
sysTableLookup = SysTableLookup::newParameters(tableNum(AssetBook), sender);
queryBuildDataSource = query.addDataSource(tableNum(AssetBook));
queryBuildDataSource.addRange(fieldNum(AssetBook, Status)).value(strFmt('((Status == %1) || (Status == %2))', any2int(AssetStatus::Open), any2int(AssetStatus::Closed)));
sysTableLookup.addLookupField(fieldNum(AssetBook, AssetId), true);
sysTableLookup.addLookupMethod(tableMethodStr(AssetBook, assetName));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
event.CancelSuperCall();
}
Hope you find this post useful :)