Showing posts with label D365FO. Show all posts
Showing posts with label D365FO. Show all posts

Thursday, March 9, 2023

D365 Retain record position on grid refresh

Microsoft Dynamics 365 Finance
When refreshing the datasource of a grid, a common requirement is to retain the position of the selected record.
The datasource function refresh(true) was supposed to handle this, but does not always work. Also getPosition() and setPosition() will not provide this functionality.

One way to solve it is to use findRecord(Common _record). For this to work you will need to fetch the record from the database, as simply using the cursor() record will not suffice.

  MyTable myTableCursor = MyTable_ds.cursor();
  MyTable myTableLocal = MyTable::findRecId(myTableCursor.RecId);
  MyTable_ds.executeQuery();
  if(myTableLocal)
  {
  	MyTable_ds.findRecord(myTableLocal);
  }

Monday, March 6, 2023

Build and sync menu items greyed out

Microsoft Dynamics 365 Finance
Just encountered a situation where the D365 "Build models" and "Synchronize database" menu elements in VS were disabled.
Solution turned out to be very simple:
Close Visual Studio and restart IIS

Monday, March 28, 2022

D365 Browse OData entities with simple URL

Microsoft Dynamics 365 for Finance

If you quickly want to see entity records using OData, just add /data/[Public collection name] to the environment URL!
https://yourenvironment.dynamics.com/data/Customers

Sunday, March 20, 2022

D365 WHS app get current worker user id

Microsoft Dynamics 365 Warehouse Management app

When you want to get the current WHS session worker user id using x++.

#WHSRF public static WHSUserId getCurrentWHSUserId() { WhsrfPassthrough pass = controller.parmSessionState().parmPass(); WHSUserId userId; if (pass.exists(#UserId)) { userId = pass.lookup(#UserId); } }

Friday, March 11, 2022

Deploy error "Cannot edit a record in Batch job"

Microsoft Dynamics 365 for Operations & Financials

Encountered a problem when deploying an ISV the other day.
03/11/2022 10:29:31: Infolog diagnostic message: 'System Job should be scheduled to run within 7 day(s) of last execution time' on category 'Error'.
03/11/2022 10:29:31: Infolog diagnostic message: 'Recurrence validation failed' on category 'Error'.
03/11/2022 10:29:31: Infolog diagnostic message: 'Cannot edit a record in Batch job (BatchJob).
The corresponding AOS validation failed.' on category 'Error'.
03/11/2022 10:29:40: Application configuration sync failed. Microsoft.Dynamics.AX.Framework.Database.TableSyncException: Custom action threw exception(s), please investigate before synchronizing again: 'ErrorException:Cannot edit a record in Batch job (BatchJob).


I found a solution in the dynamics community:

Step 1 : Select * from classidtable where name = 'SysFeatureTranslationPopulationBatch'
Step 2 : Get the ID, and Run --> Select batchjobid from batch where classnumber = RecId
Step 3 : Get the batchjobid, and Run --> Select * from BATCHJOB where RECID = batchjobid
Step 4: Update Batchjob set enddatetime=getdate()-1 where recid = batchjob RecId

Friday, November 19, 2021

D365 FO Error MSB6006: "LabelC.exe" exited with code -1

Your D365 build pipeline in Azure DevOps exits with a message like this:
##[error]D:\a\1\NuGets\Microsoft.Dynamics.AX.Platform.CompilerPackage\DevAlm\Microsoft.Dynamics.Framework.Tools.BuildTasks.targets(140,5): Error MSB6006: "LabelC.exe" exited with code -1.

The most likely reason for this is that you have duplicate entries in one or more label files.

You can locate, open and even edit your label files directly in DevOps. Just go to Repos > Files and locate your label files in the hierarchy.
Example: Metadata/Model/Model/AxLabelFile/LabelResources/en-US/XXX.en-US.label.txt

Thanks to Johan Persson for sharing his experiences.

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); } }

Tuesday, October 8, 2019

D365 Do not disable form controls - disable the datasource fields!

When developing forms in Microsoft Dynamics 365 for Operations you sometimes want to disallow the user to edit some of the forms fields. The typical approach is to turn on Auto Declaration on the form controls and diasable them using:
FormControl.allowEdit(false);

The problem with this approach is that the same field might be exposed more than once in your design, for instance both in the grid view and in the details view. Also, users adding fields via Personalization might pose challenges. In order to make sure the user is not allowed to edit the data, use this approach:
Datasource_ds.object(fieldNum(tablename, fieldname)).allowEdit(false);

Similarly you can enable/disable the fields if this is your business requirement. This will make it more evident for the user that the field is not editable:
Datasource_ds.object(fieldNum(tablename, fieldname)).enabled(false);