D365: How to get caller form name in Event Handler class

Purpose:

Demonstrate how can we get caller form name in an event handler class. Some standard forms like Add products to Purchase order can be opened from many places in the system. Hence, in this case, we need to find the caller form name to add query range conditionally.

Application:

Dynamics 365 for Finance and Operations

Business requirement:

Business requirement is to add a query range based on a given caller form.

Solution:

We can take the following code as an example to understand how can we get caller form name in X++. This is also a good example to implement the OnInitialized event handler for a form datasource.

Code

/// <summary>
/// Atlas Dynamics Pty Ltd.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
[FormDataSourceEventHandler(formDataSourceStr(RetailAddItems, CustVendExternalItem), FormDataSourceEventType::Initialized)]
public static void CustVendExternalItem_OnInitialized(FormDataSource sender, FormDataSourceEventArgs e)
{
	QueryBuildDataSource qbds_custVendExternalItem;
	QueryBuildDataSource qbds_purchRetailAddItemsTmp;
	QueryBuildRange qbr_custVendExternalItem;
	QueryBuildRange qbr_purchRetailAddItemsTmp;
	FormDataSource purchTable_ds;
	PurchTable purchTable;
	FormRun callerFormRun;
	FormRun formRun;

	formRun = sender.formRun();
	callerFormRun = formRun.args().caller();

	if (callerFormRun.name() == formStr(PurchTable))
	{
		purchTable_ds = callerFormRun.dataSource(formDataSourceStr(PurchTable, PurchTable)) as FormDataSource;
		purchTable = purchTable_ds.cursor() as PurchTable;

		if (purchTable)
		{
			qbds_custVendExternalItem = sender.query().dataSourceTable(tableNum(CustVendExternalItem));
			qbr_custVendExternalItem = SysQuery::findOrCreateRange(qbds_custVendExternalItem, fieldNum(CustVendExternalItem, CustVendRelation));
			qbr_custVendExternalItem.value(queryValue(purchTable.OrderAccount));

			qbds_purchRetailAddItemsTmp = qbds_custVendExternalItem.addDataSource(tableNum(ATLAS_PurchRetailAddItemsTmp));
			qbds_purchRetailAddItemsTmp.joinMode(JoinMode::ExistsJoin);
			qbds_purchRetailAddItemsTmp.addLink(fieldNum(CustVendExternalItem, ItemId), fieldNum(ATLAS_PurchRetailAddItemsTmp, ItemId));

			qbr_purchRetailAddItemsTmp = SysQuery::findOrCreateRange(qbds_purchRetailAddItemsTmp, fieldNum(ATLAS_PurchRetailAddItemsTmp, PurchId));
			qbr_purchRetailAddItemsTmp.value(queryValue(purchTable.PurchId));
		}
	}
}

Leave a comment

Blog at WordPress.com.

Up ↑