Announcements
Hello, I am working on a custom report UI in Dynamics 365 Finance & Operations that allows users to filter Sales Orders and Item Numbers based on a selected FromDate and ToDate.
However, after selecting FromDate and ToDate, the Sales Orders and Item Numbers lookups are not refreshing dynamically. Users still see all values instead of only those within the selected date range.
FromDate
or ToDate
, the lookup values for Sales Orders and Item Numbers should update automatically.I am using a UI Builder class (IS_CustomsUIBuilder
) with lookup methods for filtering Sales Orders and Item Numbers.
I have tried:
✅ Using DialogField.registerOverrideMethod()
to track modified()
events for FromDate
and ToDate
.
✅ Re-registering the lookup
method when dates change.
✅ Using SysLookupMultiSelectGrid::lookup()
inside the lookup methods.
But the lookups are not updating dynamically when FromDate
or ToDate
is changed.
class IS_CustomsController extends SrsReportRunController
{
protected boolean isArabic;
public boolean showPrintSettings()
{
return false;
}
public boolean showQueryValues(str parameterName)
{
return false;
}
protected void prePromptModifyContract()
{
IS_CustomContract contract = this.parmReportContract().parmRdpContract();
// this.processreportparamters(contract);
contract.parmFromDate(DateNull());
contract.parmToDate(DateNull());
contract.parmMutliSelectSalesOrders(new List(Types::String));
contract.parmAllCust(new List(Types::String));
contract.parmMultiSelectItemNumbers(new List(Types::String));
contract.parmPort('');
contract.parmCountry('');
contract.parmisArabic(NoYes::No);
}
protected void prerunmodifycontract()
{
#define.CustomsDS_isArabic('isArabic')
boolean isArabicc;
SrsReportDataContract datacontract = this.parmReportContract();
IS_CustomContract contract = this.parmReportContract().parmRdpContract();
isArabicc = contract.parmisArabic();
if(isArabicc == Noyes::Yes)
{
this.parmReportContract().parmReportName(ssrsReportStr(IS_CustomsInvRep,ar));
}
else
{
this.parmReportContract().parmReportName(ssrsReportStr(IS_CustomsInvRep,en));
}
}
//protected void processreportparamters(IS_CustomContract _contract)
//{
// IS_CustomContract contract;
// IS_Salesline_Transport IS_Salesline_Transport;
// if(this.parmArgs().record().TableId==tableNum(IS_Salesline_Transport))
// {
// if(this.parmArgs()&&this.parmArgs().record())
// {
// contract = this.parmReportContract().parmRdpContract() as IS_CustomsContract();
// IS_Salesline_Transport = this.parmArgs().record();
// }
// //_contract.parmPrimaryCustomer(IS_Salesline_Transport.inventtransid);
// }
//}
public static void main(Args _args)
{
IS_CustomsController controller = new IS_CustomsController();
controller.parmArgs(_args);
controller.parmReportName(ssrsReportStr(IS_CustomsInvRep,en));
controller.startOperation();
}
}
class IS_CustomsUIBuilder extends SysOperationAutomaticUIBuilder
{
IS_CustomContract _contract;
DialogField dialogItemID,dialogPort,dialogSO,dialogAllCust,dialogFromDate, dialogToDate;
SysLookupMultiSelectGrid msCtrlCustNames, msCtrlSO, msCtrlItemId;
public void build()
{
_contract = this.dataContractObject();
//dialogItemID = this.addDialogField(methodStr(IS_CustomContract, parmMultiSelectItemNumbers), _contract);
//dialogSO = this.addDialogField(methodStr(IS_CustomContract, parmMutliSelectSalesOrders), _contract);
//dialogFromDate = this.addDialogField(methodStr(IS_CustomContract, parmMutliSelectSalesOrders), _contract);
//dialogToDate = this.addDialogField(methodStr(IS_CustomContract, parmMutliSelectSalesOrders), _contract);
}
public void postBuild()
{
// super();
this.showallparameters();
_contract = this.dataContractObject();
//TransDate fromDate = _contract.parmFromDate();
//TransDate toDate = _contract.parmToDate();
//if(!fromDate || !toDate)
//{
// throw error("Please specify From date and to Date before proceeding.");
//}
// dialogFromDate = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmFromDate));
// dialogToDate = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmToDate));
dialogItemID = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmMultiSelectItemNumbers));
dialogItemID.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder,ItemidLookup), this);
dialogPort = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmPort));
dialogPort.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder,portLookup), this);
dialogSO = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmMutliSelectSalesOrders));
dialogSO.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder,SOLookup), this);
dialogAllCust = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmAllCust));
dialogAllCust.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder, allCustomersLookup), this);
}
public void postRun()
{
// this.dataContractObject().parmallCustomers('');
//Query query = new Query();
// QueryBuildDataSource qbdsCust = query.addDataSource(tableNum(CustTable));
// qbdsCust.fields().addField(fieldNum(CustTable, AccountNum));
// container selectedFields = [tableNum(CustTable), fieldNum(CustTable, AccountNum)];
// SysLookupMultiSelectCtrl::constructWithQuery(this.dialog().dialogForm().formRun(), dialogAllCust.control(), query, false, selectedFields);
}
public void allCustomersLookup(FormStringControl _control)
{
TransDate fromDate = this.dataContractObject().parmFromDate();
TransDate toDate = this.dataContractObject().parmToDate();
Query query = new Query();
QueryBuildDataSource qbdsTransport = query.addDataSource(tableNum(IS_Salesline_Transport));
QueryBuildDataSource qbdsCustTable = qbdsTransport.addDataSource(tableNum(CustTable));
qbdsCustTable.relations(true);
qbdsCustTable.joinMode(JoinMode::InnerJoin);
qbdsCustTable.addLink(fieldNum(CustTable, AccountNum), fieldNum(IS_Salesline_Transport, CustAccount));
QueryBuildRange rangeETD = qbdsTransport.addRange(fieldNum(IS_Salesline_Transport, ETD));
rangeETD.value(SysQuery::range(fromDate, toDate));
qbdsTransport.fields().clearFieldList();
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, CustAccount));
qbdsCustTable.addSelectionField(fieldNum(CustTable, Party));
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, ETD));
SysLookupMultiSelectGrid::lookup(query,_control, _control, _control, conNull());
}
public void SOLookup(FormStringControl _control)
{
TransDate fromDate = _contract.parmFromDate();
TransDate toDate = _contract.parmToDate();
Query query = new Query();
QueryBuildDataSource qbdsSales = query.addDataSource(tableNum(IS_Salesline_Transport));
// ✅ Apply ETD date filter (Ensure Sales Orders are shown based on FromDate & ToDate)
if (fromDate && toDate)
{
QueryBuildRange rangeETD = qbdsSales.findRange(fieldNum(IS_Salesline_Transport, ETD));
if (!rangeETD)
{
rangeETD = qbdsSales.addRange(fieldNum(IS_Salesline_Transport, ETD));
}
if (!rangeETD.value())
{
rangeETD.value(SysQuery::range(fromDate, toDate));
}
}
qbdsSales.fields().clearFieldList();
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, SalesId));
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, ETD));
// ✅ Perform the lookup with the filtered query
SysLookupMultiSelectGrid::lookup(query, _control, _control, _control, conNull());
}
public void ItemidLookup(FormStringControl _control)
{
TransDate fromDate = this.dataContractObject().parmFromDate();
TransDate toDate = this.dataContractObject().parmToDate();
Query query = new Query();
QueryBuildDataSource qbdsTransport = query.addDataSource(tableNum(IS_Salesline_Transport));
QueryBuildRange rangeETD = qbdsTransport.addRange(fieldNum(IS_Salesline_Transport, ETD));
rangeETD.value(SysQuery::range(fromDate, toDate));
qbdsTransport.fields().clearFieldList();
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, ItemId));
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, ETD));
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, SalesId));
SysLookupMultiSelectGrid::lookup(query,_control, _control, _control, conNull());
}
public void portLookup(FormStringControl _formControl)
{
TransDate fromDate = this.dataContractObject().parmFromDate();
TransDate toDate = this.dataContractObject().parmToDate();
LogisticsAddressCountryRegionId selectedCountry = this.dataContractObject().parmCountry();
Query query = new Query();
QueryBuildDataSource qbds = query.addDataSource(tableNum(TMSHubMaster));
qbds.fields().clearFieldList();
qbds.addSelectionField(fieldNum(TMSHubMaster, HubMasterCode));
qbds.addSelectionField(fieldNum(TMSHubMaster, Name));
if (selectedCountry)
{
qbds.addRange(fieldNum(TMSHubMaster, Location)).value(queryValue(selectedCountry));
}
SysTableLookup sysLookup = SysTableLookup::newParameters(tableNum(TMSHubMaster), _formControl);
sysLookup.parmQuery(query);
sysLookup.addLookupfield(fieldNum(TMSHubMaster, HubMasterCode), true);
sysLookup.addLookupfield(fieldNum(TMSHubMaster, Name), false);
sysLookup.performFormLookup();
}
private void showallparameters()
{
this.addDialogField(methodStr(IS_CustomContract, parmFromDate));
this.addDialogField(methodStr(IS_CustomContract, parmToDate));
this.addDialogField(methodStr(IS_CustomContract, parmCountry));
this.addDialogField(methodStr(IS_CustomContract, parmPort));
this.addDialogField(methodStr(IS_CustomContract, parmPrimaryCustomer));
this.addDialogField(methodStr(IS_CustomContract, parmAllCust));
this.addDialogField(methodStr(IS_CustomContract, parmMultiSelectItemNumbers));
this.addDialogField(methodStr(IS_CustomContract, parmMutliSelectSalesOrders));
this.addDialogField(methodStr(IS_CustomContract, parmisArabic));
}
}
class IS_CustomsUIBuilder extends SysOperationAutomaticUIBuilder
{
IS_CustomContract contract;
public void postBuild()
{
contract = this.dataContractObject();
DialogField dialogSO = this.bindInfo().getDialogField(contract, methodStr(IS_CustomContract, parmMutliSelectSalesOrders));
dialogSO.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(IS_CustomsUIBuilder, soLookup), this);
}
public void soLookup(FormStringControl _control)
{
TransDate fromDate = _contract.parmFromDate();
TransDate toDate = _contract.parmToDate();
Query query = new Query();
QueryBuildDataSource qbdsSales = query.addDataSource(tableNum(IS_Salesline_Transport));
QueryBuildRange rangeETD = qbdsSales.findRange(fieldNum(IS_Salesline_Transport, ETD));
if (!rangeETD)
{
rangeETD = qbdsSales.addRange(fieldNum(IS_Salesline_Transport, ETD));
}
if (!rangeETD.value())
{
rangeETD.value(SysQuery::range(fromDate, toDate));
}
qbdsSales.fields().clearFieldList();
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, SalesId));
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, ETD));
SysLookupMultiSelectGrid::lookup(query, _control, _control, _control, conNull());
}
}
class IS_CustomsUIBuilder extends SysOperationAutomaticUIBuilder
{
IS_CustomContract contract;
public void postBuild()
{
contract = this.dataContractObject();
DialogField dialogSO = this.bindInfo().getDialogField(contract, methodStr(IS_CustomContract, parmMutliSelectSalesOrders));
dialogSO.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(IS_CustomsUIBuilder, soLookup), this);
}
public void soLookup(FormStringControl _control)
{
info(strFmt("FromDate: %1, contract.parmFromDate()));
}
}
class IS_CustomsUIBuilder extends SysOperationAutomaticUIBuilder
{
IS_CustomContract contract;
public void postBuild()
{
this.showAllParameters();
contract = this.dataContractObject();
DialogField dialogSO = this.bindInfo().getDialogField(contract, methodStr(IS_CustomContract, parmMutliSelectSalesOrders));
dialogSO.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder, soLookup), this);
}
public void soLookup(FormStringControl _control)
{
TransDate fromDate = contract.parmFromDate();
TransDate toDate = contract.parmToDate();
Query query = new Query();
QueryBuildDataSource qbdsSales = query.addDataSource(tableNum(IS_Salesline_Transport));
// ✅ Apply ETD date filter (Ensure Sales Orders are shown based on FromDate & ToDate)
if (fromDate && toDate)
{
QueryBuildRange rangeETD = qbdsSales.addRange(fieldNum(IS_Salesline_Transport, ETD));
rangeETD.value(SysQuery::range(fromDate, toDate));
}
qbdsSales.fields().clearFieldList();
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, SalesId));
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, ETD));
// ✅ Perform the lookup with the filtered query
SysLookupMultiSelectGrid::lookup(query, _control, _control, _control, conNull());
}
private void showAllParameters()
{
this.addDialogField(methodStr(IS_CustomContract, parmMutliSelectSalesOrders));
}
}
class IS_CustomsUIBuilder extends SysOperationAutomaticUIBuilder
{
IS_CustomContract contract;
public void postBuild()
{
contract = this.dataContractObject();
DialogField dialogSO = this.bindInfo().getDialogField(contract, methodStr(IS_CustomContract, parmMutliSelectSalesOrders));
dialogSO.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder, soLookup), this);
}
public void soLookup(FormStringControl _control)
{
TransDate fromDate = contract.parmFromDate();
TransDate toDate = contract.parmToDate();
Query query = new Query();
QueryBuildDataSource qbdsSales = query.addDataSource(tableNum(IS_Salesline_Transport));
if (fromDate && toDate)
{
QueryBuildRange rangeETD = qbdsSales.addRange(fieldNum(IS_Salesline_Transport, ETD));
rangeETD.value(SysQuery::range(fromDate, toDate));
}
qbdsSales.fields().clearFieldList();
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, SalesId));
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, ETD));
SysLookupMultiSelectGrid::lookup(query, _control, _control, _control, conNull());
}
}
class IS_CustomsUIBuilder extends SysOperationAutomaticUIBuilder
{
IS_CustomContract _contract;
DialogField dialogItemID,dialogPort,dialogSO,dialogAllCust,dialogFromDate, dialogToDate;
SysLookupMultiSelectGrid msCtrlCustNames, msCtrlSO, msCtrlItemId;
public void build()
{
_contract = this.dataContractObject();
//dialogItemID = this.addDialogField(methodStr(IS_CustomContract, parmMultiSelectItemNumbers), _contract);
//dialogSO = this.addDialogField(methodStr(IS_CustomContract, parmMutliSelectSalesOrders), _contract);
//dialogFromDate = this.addDialogField(methodStr(IS_CustomContract, parmMutliSelectSalesOrders), _contract);
//dialogToDate = this.addDialogField(methodStr(IS_CustomContract, parmMutliSelectSalesOrders), _contract);
}
public void postBuild()
{
// super();
this.showallparameters();
_contract = this.dataContractObject();
//TransDate fromDate = _contract.parmFromDate();
//TransDate toDate = _contract.parmToDate();
//if(!fromDate || !toDate)
//{
// throw error("Please specify From date and to Date before proceeding.");
//}
// dialogFromDate = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmFromDate));
// dialogToDate = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmToDate));
dialogItemID = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmMultiSelectItemNumbers));
dialogItemID.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder,ItemidLookup), this);
dialogPort = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmPort));
dialogPort.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder,portLookup), this);
dialogSO = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmMutliSelectSalesOrders));
dialogSO.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder,SOLookup), this);
dialogAllCust = this.bindInfo().getDialogField(_contract, methodStr(IS_CustomContract, parmAllCust));
dialogAllCust.registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(IS_CustomsUIBuilder, allCustomersLookup), this);
}
public void postRun()
{
// this.dataContractObject().parmallCustomers('');
//Query query = new Query();
// QueryBuildDataSource qbdsCust = query.addDataSource(tableNum(CustTable));
// qbdsCust.fields().addField(fieldNum(CustTable, AccountNum));
// container selectedFields = [tableNum(CustTable), fieldNum(CustTable, AccountNum)];
// SysLookupMultiSelectCtrl::constructWithQuery(this.dialog().dialogForm().formRun(), dialogAllCust.control(), query, false, selectedFields);
}
public void allCustomersLookup(FormStringControl _control)
{
TransDate fromDate = this.dataContractObject().parmFromDate();
TransDate toDate = this.dataContractObject().parmToDate();
Query query = new Query();
QueryBuildDataSource qbdsTransport = query.addDataSource(tableNum(IS_Salesline_Transport));
QueryBuildDataSource qbdsCustTable = qbdsTransport.addDataSource(tableNum(CustTable));
qbdsCustTable.relations(true);
qbdsCustTable.joinMode(JoinMode::InnerJoin);
qbdsCustTable.addLink(fieldNum(CustTable, AccountNum), fieldNum(IS_Salesline_Transport, CustAccount));
QueryBuildRange rangeETD = qbdsTransport.addRange(fieldNum(IS_Salesline_Transport, ETD));
rangeETD.value(SysQuery::range(fromDate, toDate));
qbdsTransport.fields().clearFieldList();
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, CustAccount));
qbdsCustTable.addSelectionField(fieldNum(CustTable, Party));
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, ETD));
SysLookupMultiSelectGrid::lookup(query,_control, _control, _control, conNull());
}
public void SOLookup(FormStringControl _control)
{
TransDate fromDate = _contract.parmFromDate();
TransDate toDate = _contract.parmToDate();
Query query = new Query();
QueryBuildDataSource qbdsSales = query.addDataSource(tableNum(IS_Salesline_Transport));
// ✅ Apply ETD date filter (Ensure Sales Orders are shown based on FromDate & ToDate)
if (fromDate && toDate)
{
QueryBuildRange rangeETD = qbdsSales.findRange(fieldNum(IS_Salesline_Transport, ETD));
if (!rangeETD)
{
rangeETD = qbdsSales.addRange(fieldNum(IS_Salesline_Transport, ETD));
}
if (!rangeETD.value())
{
rangeETD.value(SysQuery::range(fromDate, toDate));
}
}
qbdsSales.fields().clearFieldList();
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, SalesId));
qbdsSales.addSelectionField(fieldNum(IS_Salesline_Transport, ETD));
// ✅ Perform the lookup with the filtered query
SysLookupMultiSelectGrid::lookup(query, _control, _control, _control, conNull());
}
public void ItemidLookup(FormStringControl _control)
{
TransDate fromDate = this.dataContractObject().parmFromDate();
TransDate toDate = this.dataContractObject().parmToDate();
Query query = new Query();
QueryBuildDataSource qbdsTransport = query.addDataSource(tableNum(IS_Salesline_Transport));
QueryBuildRange rangeETD = qbdsTransport.addRange(fieldNum(IS_Salesline_Transport, ETD));
rangeETD.value(SysQuery::range(fromDate, toDate));
qbdsTransport.fields().clearFieldList();
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, ItemId));
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, ETD));
qbdsTransport.addSelectionField(fieldNum(IS_Salesline_Transport, SalesId));
SysLookupMultiSelectGrid::lookup(query,_control, _control, _control, conNull());
}
public void portLookup(FormStringControl _formControl)
{
TransDate fromDate = this.dataContractObject().parmFromDate();
TransDate toDate = this.dataContractObject().parmToDate();
LogisticsAddressCountryRegionId selectedCountry = this.dataContractObject().parmCountry();
Query query = new Query();
QueryBuildDataSource qbds = query.addDataSource(tableNum(TMSHubMaster));
qbds.fields().clearFieldList();
qbds.addSelectionField(fieldNum(TMSHubMaster, HubMasterCode));
qbds.addSelectionField(fieldNum(TMSHubMaster, Name));
if (selectedCountry)
{
qbds.addRange(fieldNum(TMSHubMaster, Location)).value(queryValue(selectedCountry));
}
SysTableLookup sysLookup = SysTableLookup::newParameters(tableNum(TMSHubMaster), _formControl);
sysLookup.parmQuery(query);
sysLookup.addLookupfield(fieldNum(TMSHubMaster, HubMasterCode), true);
sysLookup.addLookupfield(fieldNum(TMSHubMaster, Name), false);
sysLookup.performFormLookup();
}
private void showallparameters()
{
this.addDialogField(methodStr(IS_CustomContract, parmFromDate));
this.addDialogField(methodStr(IS_CustomContract, parmToDate));
this.addDialogField(methodStr(IS_CustomContract, parmCountry));
this.addDialogField(methodStr(IS_CustomContract, parmPort));
this.addDialogField(methodStr(IS_CustomContract, parmPrimaryCustomer));
this.addDialogField(methodStr(IS_CustomContract, parmAllCust));
this.addDialogField(methodStr(IS_CustomContract, parmMultiSelectItemNumbers));
this.addDialogField(methodStr(IS_CustomContract, parmMutliSelectSalesOrders));
this.addDialogField(methodStr(IS_CustomContract, parmisArabic));
}
}
André Arnaud de Cal...
293,309
Super User 2025 Season 1
Martin Dráb
232,160
Most Valuable Professional
nmaenpaa
101,156
Moderator