Objects4NAV

Upgrade Code Generation Tool for NAV 2013

Upgrade Code Generation Tool for NAV 2013


MVP_FullColor_ForScreenDoing a data transfer means that you need to compare the tables of the old version and the new version and where you have mismatch you have to take some action. The data transfer is build on the upgrade from 2009 to 2013 R2 released by Microsoft.

We have the MergeTool that is used to compare and merge code and a lot of other cool things. This tool does the table and field comparison and builds the upgrade code based on the selected actions.

UpgradeMenu

This tool imports exported object files into a table version. Then I can compare two table versions and get all the difference listed. I also import the CRONUS tables for each version to make sure that I am not comparing built-in fields.

TableVersions

I give the comparison an identification and select the source and destination versions. Then I hit Compare. Within seconds I get the result.

CompareResult3

I have got to make decisions on what to do with modified and deleted tables. I can list all the tables and check the fields comparison.

Fields

I can select both step 1 and step 2 actions for each table. For new fields I can select a source field from the source table. The example I show here is the customer table. I choose in step 1 to copy all the needed fields to a temporary table. The tool will find the next available upgrade table automatically. In step 2 I choose to move the data from the temporary table into the destination version. I can ask that a new field will get a value from another field in the temporary table. In this example the Registration No. field has a new ID.

The best part is yet to come. To really save some work I make the tool create all the needed NAV upgrade objects. For step 1 I get all the upgrade tables with only required fields.

OBJECT Table 66001 Temp Customer
{
  OBJECT-PROPERTIES
  {
    Date=11.02.14;
    Time=12:11:11;
    Version List=Dynamics.is;
  }
  PROPERTIES
  {
  }
  FIELDS
  {
    { 1   ;   ;No.                 ;Code20         }
    { 10010400;;Registration No.    ;Code20        }
    { 10017241;;Require Purchase Request;Boolean   }
    { 10017290;;Freight Paid By     ;Option       ;OptionString=[Recipient,Prepaid,Senders Account,See Ship-to Address] }
  }
  KEYS
  {
    {    ;No.                   ;Clustered=Yes }
  }
  FIELDGROUPS
  {
  }
  CODE
  {

    BEGIN
      {
        ¸Dynamics.is Upgrade Table
      }
    END.
  }
}

OBJECT Table 66002 Temp Cust. Ledger Entry
{
...

The codeunit required to make the data manipulation.

OBJECT Codeunit 66000 Upgrade FurblandanR
{
  OBJECT-PROPERTIES
  {
    Date=11.02.14;
    Time=12:11:11;
    Version List=Dynamics.is;
  }
  PROPERTIES
  {
  }
  CODE
  {
    PROCEDURE Upgrade@1(VAR StateIndicator@1000 : Record 104037);
    BEGIN
      // Call this function from the top of the Upgrade trigger in Codeunit ID 104045
      CopyCustomer(StateIndicator);
      CopyCustLedgerEntry(StateIndicator);
...
      MoveCashierBankBranch(StateIndicator);
...
      ForcePaymentTerms(StateIndicator);
      ForceSalesHeader(StateIndicator);
...
    END

    LOCAL PROCEDURE CopyCustomer@2(VAR StateIndicator@1002 : Record 104037);
    VAR
      Customer@1000 : Record 18;
      TempCustomer@1001 : Record 66001;
    BEGIN
      WITH Customer DO
        IF StateIndicator.UpdateTable(TABLENAME) THEN BEGIN
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,TRUE);
          IF FINDSET(TRUE) THEN
            REPEAT
              StateIndicator.Update;
              CALCFIELDS("Picture");
              TempCustomer.INIT;
              TempCustomer.TRANSFERFIELDS(Customer);
              TempCustomer.INSERT;
            UNTIL NEXT = 0;
            MODIFYALL("Registration No.",'');
            MODIFYALL("Require Purchase Request",FALSE);
            MODIFYALL("Freight Paid By",0);
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,FALSE);
          StateIndicator.EndUpdateTable(TABLENAME);
        END;
    END;

    LOCAL PROCEDURE CopyCustLedgerEntry@3(VAR StateIndicator@1002 : Record 104037);
    VAR
      CustLedgerEntry@1000 : Record 21;
      TempCustLedgerEntry@1001 : Record 66002;
    BEGIN
      WITH CustLedgerEntry DO
        IF StateIndicator.UpdateTable(TABLENAME) THEN BEGIN
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,TRUE);
          IF FINDSET(TRUE) THEN
            REPEAT
              StateIndicator.Update;
              TempCustLedgerEntry.INIT;
              TempCustLedgerEntry.TRANSFERFIELDS(CustLedgerEntry);
              TempCustLedgerEntry.INSERT;
            UNTIL NEXT = 0;
            MODIFYALL("Final Due Date",0D);
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,FALSE);
          StateIndicator.EndUpdateTable(TABLENAME);
        END;
    END;

    LOCAL PROCEDURE MoveCashierBankBranch@26(VAR StateIndicator@1002 : Record 104037);
    VAR
      CashierBankBranch@1000 : Record 10010402;
      TempCashierBankBranch@1001 : Record 10000202;
    BEGIN
      WITH CashierBankBranch DO
        IF StateIndicator.UpdateTable(TABLENAME) THEN BEGIN
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,TRUE);
          IF FINDSET(TRUE) THEN
            REPEAT
              StateIndicator.Update;
              TempCashierBankBranch.INIT;
              TempCashierBankBranch.TRANSFERFIELDS(CashierBankBranch);
              TempCashierBankBranch.INSERT;
            UNTIL NEXT = 0;
          DELETEALL;
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,FALSE);
          StateIndicator.EndUpdateTable(TABLENAME);
        END;
    END;

    LOCAL PROCEDURE ForceFixedAsset@48(VAR StateIndicator@1002 : Record 104037);
    VAR
      FixedAsset@1000 : Record 5600;
    BEGIN
      WITH FixedAsset DO
        IF StateIndicator.UpdateTable(TABLENAME) THEN BEGIN
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,TRUE);
          IF FINDFIRST THEN BEGIN
            StateIndicator.Update;
            MODIFYALL("Straight-Line %",0);
            MODIFYALL("Depreciation Starting Date",0D);
            MODIFYALL("Biling Contract No.",'');
          END;
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,FALSE);
          StateIndicator.EndUpdateTable(TABLENAME);
        END;
    END;

...

And to complete step 1 the addition needed to the DeleteDiscontinuedTables trigger.

// Add these lines to the DeleteDiscontinuedTables trigger of Codeunit ID 104002
DeleteTable(72000);
DeleteTable(72001);
DeleteTable(72003);
DeleteTable(87400);
...// Add these lines to the DeleteDiscontinuedTables trigger of Codeunit ID 104002

Then there is the upgrade codeunit for step 2

OBJECT Codeunit 66001 Upgrade FurblandanR
{
  OBJECT-PROPERTIES
  {
    Date=11.02.14;
    Time=12:11:11;
    Version List=Dynamics.is;
  }
  PROPERTIES
  {
  }
  CODE
  {
    PROCEDURE Upgrade@1(VAR StateIndicator@1000 : Record 104037);
    BEGIN
      // Call this function from the top of the Upgrade trigger in Codeunit ID 104048
      CopyBankingWebServicesUser(StateIndicator);
      MoveCustomer(StateIndicator);
..    END

    LOCAL PROCEDURE CopyBankingWebServicesUser@2(VAR StateIndicator@1002 : Record 104037);
    VAR
      TempCashierWebServicesUser@1000 : Record 66022;
      BankingWebServicesUser@1001 : Record 10010428;
    BEGIN
      WITH TempCashierWebServicesUser DO
        IF StateIndicator.UpdateTable(TABLENAME) THEN BEGIN
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,TRUE);
          IF FINDSET(TRUE) THEN
            REPEAT
              StateIndicator.Update;
              "BankingWebServicesUser".INIT;
              "BankingWebServicesUser"."Authentication Code" := "Authentication Code";
              "BankingWebServicesUser"."User ID" := "User ID";
              "BankingWebServicesUser"."Certificate Key Identifier" := "Certificate Key Identifier";
              //"BankingWebServicesUser"."User ID Store" := ;
              //"BankingWebServicesUser"."Password Store" := ;
              //"BankingWebServicesUser"."Certificate Location" := ;
              //"BankingWebServicesUser"."Certificate Value" := ;
              "BankingWebServicesUser".INSERT;
            UNTIL NEXT = 0;
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,FALSE);
          StateIndicator.EndUpdateTable(TABLENAME);
        END;
    END;

    LOCAL PROCEDURE MoveCustomer@3(VAR StateIndicator@1002 : Record 104037);
    VAR
      TempCustomer@1000 : Record 66001;
      Customer@1001 : Record 18;
    BEGIN
      WITH TempCustomer DO
        IF StateIndicator.UpdateTable(TABLENAME) THEN BEGIN
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,TRUE);
          IF FINDSET(TRUE) THEN
            REPEAT
              StateIndicator.Update;
              "Customer".GET("No.");
              "Customer"."Registration No." := "Registration No.";
              //"Customer"."Momentum Claims Active" := ;
              "Customer".MODIFY;
            UNTIL NEXT = 0;
          DELETEALL;
          TimeLog.TimeLogInsert(TimeLog,TABLENAME,FALSE);
          StateIndicator.EndUpdateTable(TABLENAME);
        END;
    END;

  ...

And to complete the process the upgrade tables are marked to be deleted.

// Add these lines to the OnRun trigger of Codeunit ID 104003
MarkTable(66001);
MarkTable(66002);
...

Use this link for 80% discount if you have already bought the 2015 version.

Leave a Reply