30 January 2024

PowerShell: display truncated command output

Some PowerShell commands will truncate text data during output to the screen. For example,  'Get-AzContext' command will truncate 'Name' column. However, we need to know the full text from the 'Name' column in order to switch to the given context.

One of the solutions is to add '| format-table -wrap' option:

Get-AzContext | format-table -wrap

11 January 2024

D365FO: Visual Studio error when opening a project file

 In some cases you could get the following error when opening the Visual Studio project file:

Unsupported

This version of Visual Studio is unable to open the following projects. The project types may not be installed or this version of Visual Studio may not support them. 

For more information on enabling these project types or otherwise migrating your assets, please see the details in the "Migration Report" displayed after clicking OK.


The solution is to install (or re-install) D365FO VSIX Visual Studio add-in and make sure it is Enabled. You could get the latest version of the add-in by downloading service update deployment package from LCS and extracting it to a local folder. Then search for "Microsoft.Dynamics.Framework.Tools.Installer" under "DevToolsService\Scripts" folder.



30 August 2023

Visual Studio: unable to comment on code review with "closed by ()" message

I've seen a few times the following strange issue with new code reviews: when reviewer is trying to open newly created code review, he is unable to add any comments and there is a message displayed "closed by  ()":



The solution is the following:

  1. Close all Visual Studio instances
  2. Delete all files from this directory: 
    VS 2019: "%LocalAppData%\Microsoft\Team Foundation\8.0\Cache"
    VS 2022: "%LocalAppData%\Microsoft\Azure DevOps\8.0\Cache"
            and "%LocalAppData%\Microsoft\VisualStudio Services\8.0\Cache"

12 June 2023

D365FO: TempDB tables

In D365FO all types of temporary tables are automatically dropped by the system when the table variable in X++ goes out of scope. A TempDB table is not dropped in such case. You could see capabilities and limitations of TempDB tables here.

Sometimes there is a need to add more information to existing TempDB table, typical using event handling extensions or chain of command. In this case you may realise that the data you are adding is not saved/missing. This happens becase new data will be saved in a different TempDB table session and will not be visible by the code/form you are trying to extend.

The solution is to use a special linkPhysicalTableInstance() method to link current table instance with existing one.

Code example below:

    MyTempDBTable myTempDBTableCaller;
    
    public void init()
    {
        MyTempDBTable myTempDBTable;
    
        next init();

        myTempDBTable.linkPhysicalTableInstance(myTempDBTableCaller.cursor());        
        
        // insert more data to existing myTempDBTable session
        ...
    }
    


17 April 2023

D365FO: DBSync error 'The SQL view definition for your_view_name is deployed as a code package but has not been synchronized with the database'

 I got the following error today while doing the full DBSync:

The SQL view definition for your_view_name is deployed as a code package but has not been synchronized with the database. As it is currently used by one or more financial dimensions, the database must be synchronized to the code deployment.


The root cause of the issue was described in this Yammer thread by Denis Fedotenko a few years ago. Quote from the thread:

It looks like the problem is caused by the following code in the method DimensionEnabledType::getDimensionEnabledTypeCollection()
select firstonly RecId from sqlDictionary where sqlDictionary.name == any2Str(viewName);

The standard logic is trying to find whatever the view, to which the dimension definition refers, actually exists in the system. The problem is with the expression on the right side of the comparison in the select statement. Since it is not a variable with a defined length, the system cannot properly compile the statement; it creates a bunch of similar SQL Statements with different declared lengths of the only parameter. After execution of the code, my SQL Statement cache was thrashed with similar SQL Statements, which differs only in the string length in the parameter declaration, like:

(@P1 nvarchar(34))SELECT TOP 1  T1.RECID, T1.RECID FROM SQLDICTIONARY T1 WHERE( T1.NAME  =  @P1)

(@P1 nvarchar(25))SELECT TOP 1  T1.RECID, T1.RECID FROM SQLDICTIONARY T1 WHERE( T1.NAME  =  @P1)

(@P1 nvarchar(40))SELECT TOP 1  T1.RECID, T1.RECID FROM SQLDICTIONARY T1 WHERE( T1.NAME  =  @P1)

The problem is, that sometimes the length of the parameter declaration (like nvarchar(40)) does not match the length of the real string, so the passed parameter value is cut like:

<ColumnReference Column="@P1" ParameterDataType="nvarchar(40)" ParameterCompiledValue="N'BOSDimAttributesmmBusRelSalesDistrictGro'" />

The real name of the view is indeed BOSDimAttributesmmBusRelSalesDistrictGroup

I am not 100% sure now how to reproduce the error in  clean-room conditions, but I suspect that if the view name length is larger than 40 characters (or maybe if  it is larger than 40 chars and is equal to some magic numbers, on which the compiler chokes), the sync fails.

The solution depends on the length of your query name:

  • if query name is too long - rename it and make it shorter
  • if query name is not so long - just retry full DBSync, eventually it will succeed

06 March 2023

D365FO: missing menu item for running custom X++ scripts

Some time ago Microsoft released a new feature for running custom X++ scripts without having to go through Microsoft Dynamics Lifecycle Services (LCS) or suspend your system. According to the documentation, feature should be accessible via "System administration > Periodic tasks > Database > Custom scripts". In some cases this menu item is missing:


The solution is to run the following SQL query and restart IIS:

INSERT INTO SYSFLIGHTING (FLIGHTNAME, ENABLED) VALUES('AppConsistencyCustomScriptFlight', 1)

20 December 2022

D365FO: 'Serialization version mismatch detect' error

This error could happen during running DbSync, deploying a package (LCS or manually) or just starting up IIS. Error message looks like the following: 

Serialization version mismatch detect, make sure the runtime dlls are in sync with the deployed metadata. Version of file '204'. Version of dll '203'.

Versions could vary, but the file version is always higher then dll version.

The root cause of the issue is that your D365FO version is lower then the minimum version required by installed ISV solution as a binary model. 

There are two possible solutions:

  1. Delete binary model
  2. Update D365FO to the minimum version required by ISV solution