Purpose:
Demonstrate how can we write an event handler for QueryExecuting form datasource event.
Application:
Dynamics 365 for Finance and Operations
Business requirement:
Business requirement is to hide records in a form based on a given condition.
Solution:
We can use the code below to dynamically add ranges to a form datasource using an event handler for QueryExecuting event.
Code
internal final class ATLAS_VendTableLookup_Form_EventHandler
{
/// <summary>
/// ATLAS_12220_AddVendGroupToPurchCreateOrder May 23, 24 MK
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
[FormDataSourceEventHandler(formDataSourceStr(VendTableLookup, VendTable), FormDataSourceEventType::QueryExecuting)]
public static void VendTable_OnQueryExecuting(FormDataSource sender, FormDataSourceEventArgs e)
{
FormStringControl ATLAS_PurchTable_VendGroupControl;
QueryBuildDataSource qbds_VendTable;
QueryBuildRange qbr_VendTable;
ATLAS_HcmWorkerSite workerSite;
VendGroupId vendGroupId;
HcmWorker currentWorker;
FormRun callerFormRun;
FormRun formRun;
formRun = sender.formRun();
callerFormRun = formRun.args().caller();
currentWorker = HcmWorker::find(HcmWorkerLookup::currentWorker());
if (callerFormRun.name() == formStr(PurchCreateOrder))
{
ATLAS_PurchTable_VendGroupControl = callerFormRun.control(callerFormRun.controlId(formControlStr(PurchCreateOrder, ATLAS_PurchTable_VendGroup)));
if (ATLAS_PurchTable_VendGroupControl)
{
vendGroupId = ATLAS_PurchTable_VendGroupControl.text();
if (vendGroupId)
{
qbds_VendTable = sender.query().dataSourceName(tableStr(VendTable));
if (qbds_VendTable)
{
qbr_VendTable = SysQuery::findOrCreateRange(qbds_VendTable, fieldNum(VendTable, VendGroup));
qbr_VendTable.status(RangeStatus::Hidden);
qbr_VendTable.value(queryValue(vendGroupId));
}
}
}
if (SysUserInfo::find(curUserId()).ATLAS_RestrictVendorsBySite)
{
qbds_VendTable = sender.query().dataSourceName(tableStr(VendTable));
if (qbds_VendTable)
{
while select workerSite
where workerSite.Worker == currentWorker.RecId
{
qbr_VendTable = qbds_VendTable.addRange(fieldNum(VendTable, InventSiteId));
qbr_VendTable.status(RangeStatus::Hidden);
qbr_VendTable.value(SysQuery::value(workerSite.SiteId));
}
qbr_VendTable = qbds_VendTable.addRange(fieldNum(VendTable, InventSiteId));
qbr_VendTable.status(RangeStatus::Hidden);
qbr_VendTable.value(SysQuery::valueEmptyString());
}
}
}
}
}
Leave a comment