NAV Upgrade Assessment Tool

Guidelines for Partners

NAV Upgrade Assessment Tool allows Dynamics NAV end-users to receive an assessment of their upgrade from Microsoft Dynamics NAV to Business Central. It will show two possible scenarios and determine whether an upgrade is easy, medium, or hard in each of those scenarios. The goal of this tool is to show how difficult it would be to migrate in the two scenarios:

  • Data upgrade, tables, and add-ons only

or

  • Full upgrade, including customizations

This tool will help you collect the necessary information for the automated evaluation. When installed and run in your NAV environment, it will show you the following statistics:

  • number of companies in the database,
  • size of the database,
  • current NAV/BC version,
  • number of custom and customized tables,
  • number of all objects,
  • a number of add-ons. It will also run a check whether those add-ons have new versions and migration path available.

Guideline about “NAV Upgrade Assessment Tool”

The NAV Upgrade Assessment Tool is a FOB file that contains the following three objects in the custom range: page 50098 NAV Upgrade Assessment Tool, page 50099 Assessment Tool Table List, and MenuSuite 1070 NAV Upgrade Assessment Tool.

1. Import NAV Upgrade Assessment Tool

Open your Microsoft Dynamics NAV Development Environment. Please ensure you have the permissions and licenses necessary to import objects. Also check if you have the object IDs free for the above objects. If the custom page or menusuite IDs are not free, you must renumber our objects before using this tool. Press File -> Import

Tool Import

 

 

 

 

 

 

 

 

 

Choose the proper file and press ‘Open’. Choose ‘No’ if you want to open the Import Worksheet or ‘Yes’ to import pages/forms.

NAV Upgrade Assessment tool

 

 

 

 

 

2. Run NAV Upgrade Assessment Tool

After import, please open object designer, find page/form “50098 NAV Upgrade Assessment Tool” and run it.

Run Tool

 

 

 

 

 

 

 

 

 

 

 

Run tool

 

 

 

 

 

 

 

 

 

 

 

Once you run that page, it will open in your NAV client. Please use the button “Get Information” to retrieve it. You should see something like the screenshot below:

NAV Upgrade Assessment Tool Main Page

In case you do not receive any information, please use the “Test SQL Connection” and “Test WS Connection” actions to learn where the issue might be. If you are still receiving issues, please share a detailed message to us at [email protected].

Description of how the displayed data in the image is obtained:Calculated Data

 

  • Number of companies to migrate – Number of companies is calculated by counting all the records of table 2000000006 “Company”.
  • Current NAV version – version is retrieved from codeunit’s 9015 “Application System Constants” using standard procedure “ApplicationVersion” which returns build version of current NAV. Then, by using the system function STRPOS, we specify the version of NAV without the numbers indicating cumulative update.
IF STRPOS(AppVerString, '14.') <> 0 THEN
  AppVerString := '14'
ELSE BEGIN
  IF STRPOS(AppVerString, '13.') <> 0 THEN
    AppVerString := '13'
  ELSE BEGIN
    IF STRPOS(AppVerString, '11.') <> 0 THEN
      AppVerString := '11'
    ELSE BEGIN
      IF STRPOS(AppVerString, '10.') <> 0 THEN
        AppVerString := '10'
      ELSE BEGIN
        IF STRPOS(AppVerString, '9.') <> 0 THEN
          AppVerString := '9'
        ELSE BEGIN
          IF STRPOS(AppVerString, '8.') <> 0 THEN
            AppVerString := '8'
          ELSE BEGIN
            IF STRPOS(AppVerString, '7.1') <> 0 THEN
              AppVerString := '71'
            ELSE BEGIN
              IF STRPOS(AppVerString, '7.0') <> 0 THEN
                AppVerString := '7'
              ELSE BEGIN
                AppVerString := AppMgt.ApplicationVersion;
              END;
            END;
          END;
        END;
      END;
    END;
  END;
END;
  • Number of custom tables to migrate – Number of custom tables is calculated by counting the records of table 2000000038 “AllObj” after applying filter ‘50000..99999’ to the field “Object ID”.
  • Number of customized standard tables to migrate – Number of standard tables that have added custom fields is calculated by using the code:
AllObject.RESET;
AllObject.SETFILTER("Object Type", '1');
AllObject.SETFILTER("Object ID", '1..49999|100000..1000000|99000750..99008535');
IF AllObject.FINDSET THEN BEGIN
  REPEAT
    Field.RESET;
    Field.SETRANGE(TableNo, AllObject."Object ID");
    Field.SETFILTER("No.", '50000..99999');
    IF Field.FINDFIRST THEN
      CustomizedStandardTables += 1;
  UNTIL AllObject.NEXT = 0;
END;

Variable AllObject is record of table 2000000038 “AllObj”, variable Field is record of table 2000000041 “Field”.

  • Number of Add-ons – After applying filter ‘100000..99008535’ to the field “ID” of table 2000000001 “Object”, the tool’s code checks in every filtered record if the table’s field “Version List” contains a version that is not a standard one. If a nonstandard version is found in the version list, then the table 2000000001 “Object” is filtered by the detected version to determine the ID range of the found add-on. The SOAP request sends the determined ID range to our database, which contains a list of existing add-ons and returns a response that contains information identifying the detected add-on (name, provider). If our database does not have information about add-on, then it’s marked as ‘unknown’. The ‘Number of Add-ons’ is calculated by counting all detected add-ons.

Moreover, after counting the add-ons, all the add-ons that were found are listed in the page group “Add-ons”. Check marks “Add-on Migration Tool Exists” and “ Add-on Extensions Exists” indicates whether identified add-on has the data migration toolkit and extension in the newer version.

Addons Group

 

  • Unknow Add-on Exists – Checkmark is checked if an unknown add-on is found.
  • Number of Unknown Add-on’s objects – Number of unknown add-on objects is calculated by counting all the records of the table 2000000001 “Object” after filtering it’s field “Version List” with unknown add-on’s version tag for every found unknown add-on.
  • Current NAV Localization – localization is retrieved from codeunit’s 9015 “Application System Constants” using standard procedure “ApplicationVersion” which returns build version of current NAV. Function’s returned value contains tag of NAV’s localization and we retrieve it by using system function COPYSTR.
AppLocaliztion := COPYSTR(AppMgt.ApplicationVersion, 1, 2);
  • Database size in GB – The database size is retrieved by sending SQL statement to SQL Server, which displays space usage information about the needed database. SQL Statement: ‘USE [database_name]; EXEC sp_spaceused’. Before sending the SQL statement, it is required to connect to the SQL Server. Class Data.SqlClient.SqlConnection is used to establish a connection to the SQL Server (from DotNet assembly System.Data.SqlClient.dll ). Connection is established with a connection string:

‘Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security= SSPI;MultipleActiveResultSets=TRUE’

Connection code:

_ConnString :=
  STRSUBSTNO(
    'Data Source=%1;' +
    'Initial Catalog=%2;' +
    'Integrated Security=%3;' +
    'MultipleActiveResultSets=TRUE',
    ServerName,
    DatabaseName,
    'SSPI');


IF ISNULL(_SQLConn) THEN
  _SQLConn := _SQLConn.SqlConnection(_ConnString);
_SQLConn.Open;


ServerName is retrieved by using the class ServerUserSettings of assembly Microsoft.Dynamics.Nav.Types:

ServerName := ServerUserSettings.Instance.ServerName;

DatabaseName is retrieved from the field “Database Name” of table 2000000048 “Database” after filtering out records that have the field “My Database” set to ‘false’.

After connecting to the server and sending the SQL statement, the result of the statement is read. Function “ExecuteReader” from class SqlCommand is used to execute the SQL statement, and class SqlDataReader is used to read the result (both classes are from assembly System.Data.SqlClient.dll).

IF _SQLConn.State = 1 THEN BEGIN
  _SQLCommand := _SQLCommand.SqlCommand;
  _SQLCommand.Connection := _SQLConn;
  _SQLCommand.CommandText := STRSUBSTNO('USE [%1];'+'EXEC sp_spaceused;',_DatabaseName);
  _SQLReader := _SQLCommand.ExecuteReader;


  IF _SQLReader.HasRows THEN BEGIN
    IF _SQLReader.Read THEN;
    DatabaseSizeString := _SQLReader.GetString(1);
  END ELSE
    ERROR('No rows found');


END ELSE
  ERROR('The connection to the database has been closed.');


The database size from the result is in Megabytes, so we need to convert it to Gigabytes. SQL statement’s result is provided as a string, so before converting size to GB, we first convert it to Decimal type. Code that provides the final result of the database size:

DatabaseSizeString := CONVERTSTR(DatabaseSizeString,'.',',');
    DatabaseSizeString := SELECTSTR(1,DatabaseSizeString);
    EVALUATE(DatabaseSize,DatabaseSizeString);
    DatabaseSize := ROUND((DatabaseSize/1024),0.01,'=');

  • The “Objects” page group displays the number of all objects in the database by type. Objects of each type are calculated by counting the records of table 2000000038 “AllObj”, filtered by each object type that exists in NAV. When counting tables and codeunits, filter ‘1..2000000000’ is applied to the field “Object ID” to exclude system objects. Code and displayed information:
AllObject.RESET;
AllObject.SETFILTER("Object Type", '1');
AllObject.SETFILTER("Object ID", '1..2000000000');
TableCount := AllObject.COUNT;


AllObject.RESET;
AllObject.SETFILTER("Object Type", '3');
ReportCount := AllObject.COUNT;


AllObject.RESET;
AllObject.SETFILTER("Object Type", '5');
AllObject.SETFILTER("Object ID", '1..2000000000');
CodeunitCount := AllObject.COUNT;


AllObject.RESET;
AllObject.SETFILTER("Object Type", '6');
XMLPortCount := AllObject.COUNT;


AllObject.RESET;
AllObject.SETFILTER("Object Type", '7');
MenuSuiteCount := AllObject.COUNT;


AllObject.RESET;
AllObject.SETFILTER("Object Type", '8');
PageCount := AllObject.COUNT;


AllObject.RESET;
AllObject.SETFILTER("Object Type", '9');
QueryCount := AllObject.COUNT;

Objects Group







3. Review tables (optional)

Before submitting the number of tables to be upgraded, we suggest reviewing the table list and deciding whether all tables should be migrated. In order to view custom or customized tables, click on the field’s “Number of custom tables to migrate” calculated number.

 

 

 

 

 

 

The assessment Tool Table List page opens and shows all the custom tables counted (here it is possible to filter by “Version List”, ID, Date, and other fields if only some specific tables have to be included):

Check Custom Tables

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

You can view table fields by pressing the “Table Fields” action:

Check Custom Tables

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NAV Upgrade Assessment Tool

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4. Submit results for Assessment

Once you have reviewed the results, use the “Fill In Simplanova Form” button to send your statistical data to the Simplanova website. This will take you to Simplanova’s website’s online form.

NAV Upgrade Assessment Tool

 

 

 

 

 

 

You will see your NAV solution information automatically populated to the form under the “Technical information” tab. Please review. You will then be asked to fill-in the “Contact information” tab.

Once you submit the online form, you will receive an email with an assessment of your NAV Upgrade effort evaluation together with the inputs from your NAV solution. You can use this information to consult with your Microsoft Partner on the best migration path for you.

NAV Upgrade Assessment Tool is great for getting the required information for Microsoft’s „AIM“ incentive program for upgrading Dynamics NAV to Business Central SaaS. As a Microsoft Modernization Center, Simplanova can help you navigate through the program. You can find more information on the „AIM” incentive here: AIM with Simplanova.  To download the NAV Upgrade Assessment Tool, click here: Nav Upgrade Assessment Tool. Don’t miss out on this opportunity because the program will run until June 30, 2024.