Business Central Musings

For the things we have to learn before we can do them, we learn by doing them

How To : 5 Easy Steps to generate your First NAV Extension

Share This Post

Thank you for landing here.

It’s quite common nowadays to hear NAV people talking about Dynamics 365, AppStore, extensions, new AL language and the Visual Studio Code.

So extension is a concept that sooner or later NAV developers need to grasp.

In this blog I will create one simple extension. I have seen a few demos on the web, but I had  a few issues following them. I will highlight these issues as I go.

I encourage everyone to visit msdn page on this topic.

1. Setting up your working space

On my development machine I installed NAV 2017 CU 9. I will be working with 3 databases which initially will be restored from your NAV DVD, from the folder below:

SQLDemoDatabase\CommonAppData\Microsoft\Microsoft Dynamics NAV\100\Database
  • restore via SQL Server Management Studio the Demo database as Demo Database NAV (10-0) (we won’t touch this – it will be our ORIGINAL DB)
  • restore via SQL Server Management Studio the Demo database as TestExtension (we will make modifications on this database – it will be our MODIFIED DB)
  • restore via SQL Server Management Studio the Demo database as ApplyExtension (we will install our extension here – it will be our TARGET DB)
  • create a NAV service(I named mine TestExtension) pointing to the database you will be working with in the development environment, in our case is TestExtension
  • created 3 folders on your local drive: ORIGINAL, MODIFIED, DELTA

2. Create extension content

I added field 50000 “Planet No.” – Integer on table 14 Location.

I added this new field to Page 15, “Location List”.

I created a new codeunit, 50000, TestExtension, with 2 empty and local functions:

Extension1

And these are the 3 objects:

Ext2

3. Populate local folders: ORIGINAL,MODIFIED and DELTA:

a. Populate ORIGINAL:

Point Service tier towards Demo Database NAV (10-0) and from Dev. environment export all objects (or just Table 14 and Page 15 if you want a faster text file processing) as Original.txt. As this file contains a concatenation of all objects we will need to split the big file into smaller ones (one per object). In the ORIGINAL folder create a Split folder. From the Dynamics NAV 2017 Administration Shell run:

Split-NAVApplicationObjectFile -Source .\original\*.txt -Destination .\original\split\

And this is the end-result:

ext3

b. Populate MODIFIED

Point Service tier towards TestExtension and from Dev. environment export all objects (or just Table 14 and Page 15 if you want a faster text file processing) as Modified.txt.
For the same reason as in the previous step split big Modified file:

 Split-NAVApplicationObjectFile -Source .\Modified\*.txt -Destination .\Modified\split\

c. Populate DELTA

To create Delta files run:

Compare-NAVApplicationObject -OriginalPath .\ORIGINAL\SPLIT\ -ModifiedPath .\MODIFIED\Split\ -DeltaPath .\DELTA\
Processed 4965 objects:
 Inserted 1 objects
 Deleted 0 objects
 Changed 2 objects
 Identical 4963 objects
 Failed 0 objects

Have a look at the composition of a Delta file:

ext4

4. Create NAVX file (extension file)

From the Microsoft Dynamics NAV 2017 Administration Shell run:

 New-NAVAppManifest -Name "FirstExtension" -Publisher "SVIRLAN.com" -Version "1.0.0.0" | New-NAVAppPackage -Path FirstExtension.navx -SourcePath .\DELTA

5. Publish extension

To publish the new extension in the ApplyExtension database, point your service tier towards the ApplyExtension database and from the Microsoft Dynamics NAV 2017 Administration Shell run:

 Publish-NAVApp -Path .\FirstExtension.navx -ServerInstance TestExtension -SkipVerification

Open page 2500 “Extension Management” and click Install on our new extension:

ext5

You can Un-install the extension(via action on Page 2500) and you can Un-publish it via “Un-Publish” powershell command.

Facts:

Let’s have a look at what we’ve got by applying our extension to the ApplyExtension database:

The Locations page contains the new field:ext6

But when looking at the objects we dont see the codeunit 50000, the new fields nor the changes in the Version List:

ext8

ext9

Moreover, trying to add the field 50000 in the Location table prompts this system error:

ext7

This makes sense!

The code in table14 and Page 15 remained as delivered by Microsoft, and the extension fields are somehow managed internally via system objects like tables 2000000150 – 2000000163.

Issues encountered:

1. First error I encountered was: “The package contains changes to the database schema that are not handled in upgrade code.”

I needed a codeunit to subscribe to standard published events:
That’s the reason I have codeunit 50000 and the 2 functions:
OnNavAppUpgradePerDatabase()
OnNavAppUpgradePerCompany()

PS C:\docs\blogs\Extensions> New-NAVAppManifest -Name "Proseware SmartStuff" -Publisher "Proseware, Inc." -Version "1.5.0.12" | New-NAVAppPackage
 -Path MyExtension.navx -SourcePath DELTA
 New-NAVAppPackage : The package contains changes to the database schema that are not handled in upgrade code.
 At line:1 char:100
 + ... 1.5.0.12" | New-NAVAppPackage -Path MyExtension.navx -SourcePath DELT ...
 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 + CategoryInfo : InvalidArgument: (Microsoft.Dynam...ewNavAppPackage:NewNavAppPackage) [New-NAVAppPackage], InvalidOperationExcepti
 on
 + FullyQualifiedErrorId : Microsoft.Dynamics.Nav.Apps.Tools.NewNavAppPackage

2. Second issue happened when running the Publish-NAVApp command: “Access is denied. You need to be a member of the local Administrators group on the server to run this cmdlet.”

Need to run powershell as Admin:

PS C:\docs\blogs\Extensions> Publish-NAVApp -Path .\FirstExtension.navx -ServerInstance TestExtension -SkipVerification
 Publish-NAVApp : Access is denied. You need to be a member of the local Administrators group on the server to run this cmdlet.
 At line:1 char:1
 + Publish-NAVApp -Path .\FirstExtension.navx -ServerInstance TestExtens ...
 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 + CategoryInfo : NotSpecified: (:) [Publish-NAVApp], NavCommandException
 + FullyQualifiedErrorId : MicrosoftDynamicsNavServer$TestExtension,Microsoft.Dynamics.Nav.Apps.Management.Cmdlets.PublishNavApp

3. In case any of the powershell cmdlets is not recognized in your environment run:

PS C:\docs\blogs\Extensions> Import-Module “C:\Program Files (x86)\Microsoft Dynamics NAV\100\RoleTailored Client\Micro
soft.Dynamics.Nav.Model.Tools.psd1” –force

Thank you for reading, sharing, commenting, liking, following 🙂

 

Share This Post

Related Articles

3 Responses

  1. Hello,
    This was incredibly useful and allowed me to create a NAV app from a single .DELTA file. The piece about the Upgrade CodeUnit was a little tricky, but your article allowed me to put together a process that worked.
    This process produces a .navx file, which is a binary. Is it possible to generate a .al file instead, or to generate a .al text file from the .navx file? This would be very helpful to us in managing our transition to AL.
    Thank you.

Leave a Reply

Recent Posts

Get Notified About New Posts

Categories