Friday, October 9, 2020

D365 Datasource range lock / visibility

Microsoft Dynamics 365 for Operations & Financials

When adding ranges to datasources in code, you sometimes don't want the user to alter the range in any way. Sometimes it is also necessary to hide the applied range.

To lock or hide the range, use the status method of the QueryBuildRange class. The following code creates a hidden range of the field MyField to empty string.

QueryBuildRange qbrExampleRange; qbrExampleRange = MyDatasource_ds.query().dataSourceTable(tableNum(MyTable)) .addRange(fieldNum(MyTable, MyField)); qbrExampleRange.value(SysQuery::valueEmptyString()); qbrExampleRange.status(RangeStatus::Hidden);
The user will not be able to see or change the range of the field MyField.

Similarly the following code sets the field Department to "HQ". This time setting the range status to Locked.

QueryBuildRange qbrDepartmentRange; qbrDepartmentRange = MyDatasource_ds.query().dataSourceTable(tableNum(MyTable)) .addRange(fieldNum(MyTable, Department)); qbrDepartmentRange.value(SysQuery::value('HQ')); qbrDepartmentRange.status(RangeStatus::Locked);
The user will be able to see that there is a "HQ" filter on the Department field, but not able to remove it or change the value.

Friday, January 10, 2020

D365 Capture switch between gridview and details view

Microsoft Dynamics 365 for Operations & Financials

In a form with the Details Master pattern, the user switches between viewing the list view (grid with all records) and a details view (only one record). This navigation happens within the same form, so there is no form initialization upon entering a record detail or going back to the list.

If you want to something to happen when the user switches between views, you need to capture the switch itself.

Let's say you want to enable a button in list view, but disable it in detail view.
Override the task() method like this:
public int task(int _p1) { int ret; #Task if(_p1 == #taskSwitchToDetailsView) { MyButton.enabled(false); } else if(_p1 == #taskSwitchToGridView) { MyButton.enabled(true); } ret = super(_p1); return ret; }
You might also want to enable or disable the button when the form opens.
Since controls are rendered after the init() is called, you need to put the code in the run() method.
You need to check if the form is in list or detail view mode:
public void run() { super(); if(element.viewOptionHelper().getViewOption() == FormViewOption::Details) { MyButton.enabled(false); } }