During our project with Dynamics NAV 2018, we needed to consume a web service from CleverReach (see documentation of their REST API: https://rest.cleverreach.com/howto/), so that we can synchronize the recipients of the newsletters.

Here are now procedures that can be universally useful for using web services from within Dynamics NAV:

See the code at https://github.com/TBits/Al-examples/blob/master/HTTPRequests/cod50131.HttpRequest.al

How to do a simple GET http request:

procedure LoadWebpage(url: Text) result: Text;

How to do a simple POST http request:

procedure PostRequest(url: Text; post_names: List of [Text]; post_values: List of [Text]) result: Text;

And then how to do a POST http request, that is behind Basic Authentication (eg. done with htaccess/htpasswd):

procedure PostRequestWithBasicAuth(
        url: Text;
        post_names: List of [Text];
        post_values: List of [Text];
        username: Text;
        password: Text) result: Text;

I have prepared some web services for testing, see the code in https://github.com/TBits/Al-examples/blob/master/HTTPRequests/pag50130.HttpRequest.al for how to call them.

By the way, this example also shows how to use lists in AL, which is a feature that can hardly be found in the documentation:

var
    post_names: List of [Text];
    i: Integer;
begin
    post_names.Add('test1');
    post_names.Add('test2');
    for i := 1 to post_names.Count do
    begin
        message(post_names.Get(i));
    end;
end;
Tags: ,
Posted in Software Development | Comments Closed

Today, we had an issue that a web service returned a timestamp in unixtime format, ie. all seconds that have passed since January 1st 1970.

We would like to convert that timestamp to a DateTime variable in AL Code.

We finally came up with these functions: UnixTimeToDateTime (see https://github.com/TBits/Al-examples/blob/master/ALBasics/cod50101.AlBasics.al#L8) and DateTimeToUnixTime (see https://github.com/TBits/Al-examples/blob/master/ALBasics/cod50101.AlBasics.al#L36).

See also the example calls at https://github.com/TBits/Al-examples/blob/master/ALBasics/pag50101.ALBasics.al

procedure TestUnixTime();
var
	myCodeUnit: Codeunit myLibrary;
	nowUnixTime: BigInteger;
	FormatString: Text;
	nowDateTime: DateTime;
begin
	nowUnixTime := myCodeUnit.DateTimeToUnixTime(CurrentDateTime);
	Message('to unixtime: ' + Format(nowUnixTime));
	nowDateTime := myCodeUnit.UnixTimeToDateTime(nowUnixTime);
	// formatting the date time to string
	FormatString := '<Day,2>.<Month,2>.<Year4> <Hours24,2>:<Minutes,2>:<Seconds,2>.<Thousands,3>';
	Message('from unixtime: ' + Format(nowDateTime, 0, FormatString));
end;

Also note how you can specify the formatting of a date with the keywords Day, Month, Year4, Hours24, Minutes.

Tags: ,
Posted in Software Development | Comments Closed

In the previous post, Setting up Dynamics NAV 2018 for Testing and Development in Docker we have covered how to setup a development and testing environment, and had our first steps with Visual Studio Code to publish our first hello world application.

Now I want to show you some AL language thing that might be useful. You can see them in action in the example app ALBasics: https://github.com/TBits/Al-examples/tree/master/ALBasics

There are test procedures illustrating how to:

  • Working with basic constructs like “if”
  • Format various types of variables to string (known as Text), using Format(), or StrSubstNo().
  • Parse Integer to String with Evaluate()
  • Working with Date and DateTime, getting the current Now with CurrentDateTime or Today with Today. Comparing dates, even by a given difference in for example days, with CalcDate(). Converting between DateTime and Date, with DT2Time(), and setting a date with DMY2DATE().
  • How to work with options: calling a procedure with an option parameter, and the issues you can get if you have different definitions of the options.
  • How to call procedures with reference parameters (keyword var), and how to return a result either by a named variable or with exit(<value>)
  • How to call a procedure that is defined inside a code unit.
Tags: ,
Posted in Software Development | Comments Closed

In the past months, I have learned a lot about Dynamics NAV 2018. There are some examples available on the net, but not enough. So I will provide some examples on my blog.

Let’s start with setting up the free Docker container on Windows of Dynamics NAV for testing and development purposes.

My first obstacle was the requirements to the CPU.

First, you need a CPU with SLAT for running Hyper-V on Windows 10. See also https://social.technet.microsoft.com/wiki/contents/articles/1401.hyper-v-list-of-slat-capable-cpus-for-hosts.aspx which states: “Every Core i3, i5 and i7 supports SLAT. You can look up the supported AMD versions at KB article on AMD“.
So I bought a refurbished HP ProBook 6560b with a Intel Core i5-2520M CPU, but that did not work. It does not support docker images with more than 2 GB of RAM. But you need 4 GB to run Dynamics NAV 2018 in a container. See this bug for more details: https://github.com/docker/for-win/issues/1094.
With the coreinfo tool (download here for free: https://docs.microsoft.com/en-us/sysinternals/downloads/coreinfo), you can test if your CPU is supported:

Coreinfo.exe -f

If you see a star, then you should be fine.

PAGE1GB * Supports 1 GB large pages

If you see a hyphen, then you cannot use that computer:

PAGE1GB - Supports 1 GB large pages

You can install Docker for Windows from https://www.docker.com/docker-windows. You need to register in the Docker Hub for free. You install it, and it will ask you to restart the computer, the latest version enables Hyper-V, and it asks if you want to use Linux or Windows containers. Let the installer prepare your computer for Windows containers.

When you start Docker, and right click on the symbol, you see Kitematic. That is a useful tool to manage your containers graphically. Click on it, and it will download a zip file. Extract the contents to C:\Program Files\Docker\Kitematic.

The docker images from Microsoft are listed here: https://hub.docker.com/r/microsoft/dynamics-nav/

As administrator you open a PowerShell, and run these commands:

# this should pull the latest dynamics-nav, 2018 at the moment
docker pull microsoft/dynamics-nav
# now start a container
docker run -e accept_eula=Y -e ClickOnce=Y -e UseSSL=N -m 4G microsoft/dynamics-nav

I chose the setting ClickOnce=Y because I wanted to test not only the web client, but also the Windows Client.

I chose the UseSSL=N setting because I had issues with Visual Studio Code to download the symbols or to upload my extension if it Dynamics NAV was installed with a self-signed certificate. I got the message:

Die zugrunde liegende Verbindung wurde geschlossen: Für den geschützten SSL/TLS-Kanal konnte keine Vertrauensstellung hergestellt werden..
Das Remotezertifikat ist laut Validierungsverfahren ungültig.

You probably could download the certificate from http://YOURCONTAINERIP:8080/certificate.cer and install it into your “Trusted Root Certification Authorities” but I did not want to do that just for testing purposes.

This is the output of the docker run command:

PS C:\WINDOWS\system32> docker run -e accept_eula=Y -e ClickOnce=Y -e UseSSL=N -m 4G microsoft/dynamics-nav
Initializing...
Starting Container
Hostname is c63405985172
PublicDnsName is c63405985172
Using NavUserPassword Authentication
Starting Local SQL Server
Starting Internet Information Server
Creating Self Signed Certificate
Self Signed Certificate Thumbprint 5D0E6813F13AA90A59328F196F9594CCEF3F1DF9
Modifying Service Tier Config File with Instance Specific Settings
Starting NAV Service Tier
Creating DotNetCore Web Server Instance
Creating http download site
Creating Windows user admin
Setting SA Password and enabling SA
Creating admin as SQL User and add to sysadmin
Creating SUPER user
Creating ClickOnce Manifest
Container IP Address: 172.17.43.185
Container Hostname  : c63405985172
Container Dns Name  : c63405985172
Web Client          : http://c63405985172/NAV/
NAV Admin Username  : admin
NAV Admin Password  : Qake5494
Dev. Server         : http://c63405985172
Dev. ServerInstance : NAV
ClickOnce Manifest  : http://c63405985172:8080/NAV

Files:
http://c63405985172:8080/al-0.12.25327.vsix

Initialization took 114 seconds
Ready for connections!

Now how to test your Dynamics NAV instance:

    • Web Client: you see the URL in the output above. It will be different in your installation…
    • Windows Client: it does not work in Firefox, to download the ClickOnce manifest from the URL mentioned above, installing it gives the error: System.Deployment.Application.InvalidDeploymentException (Zone)
      – Die Bereitstellung und die Anwendung haben keine übereinstimmenden Sicherheitszonen.
      But it works in Edge or Internet Explorer just fine. You use the NAV Admin Username and Password as specified in the docker output.
    • With Visual Studio Code: Install the AL Language extension from http://c63405985172:8080/, the file is called like al-0.12.25327.vsix. In Visual Studio Code, go to Extension, select the hamburger menu at the top, and choose “Install from VSIX file”. Installing the AL Language extension from the Marketplace would install a newer version of the extension, but it probably causes issues with your server because it is not compatible.

First steps with Visual Studio Code: Create a sample application: Ctrl-Shift-P, search for AL:Go!, and run it. This will ask you where you want the project stored, and then create a hello world example.

You need to modify the file launch.json, and enter for server the URL which was in the docker output labelled as “Dev. Server”, in my case “http://c63405985172”

Then you can press Ctrl-Shift-P, search for AL: Download Symbols, and run that.

After the symbols have been downloaded, run AL: Publish, which should first ask your for your username and password (use admin and the password from the docker output), then it will upload your extension to the NAV server, and VS Code will start the Web client with the page Contacts, because that page is the Object ID 22, which is defined in startupObjectId in launch.json. You will see the message box.

I have submitted this basic extension on Github: https://github.com/TBits/Al-examples/tree/master/HelloWorld

In the next post in this series, we will discover the AL language in more detail: Getting used to the AL language for Dynamics NAV 2018

 

In the past weeks, I have been working on a deployment of Dynamics NAV 2018. This is quite a change for me, to work again on a Windows machine, and with closed source software. Fortunately, there are already some resources on the web, eg. Powershell scripts by Waldo: https://github.com/waldo1001/Cloud.Ready.Software.PowerShell/tree/master/PSScripts

Today, I want to publish some basic Batch scripts that help our team to start our development environment. In our setup, we have a normal unprivileged Windows user. But we need a privileged user for access to the Dynamics NAV Server. Lets assume that the privileged user has a suffix called -p for privileged.

startDynamicsNAVClient.bat

This script will just start the Dynamics NAV 2018 client, running as the privileged user.

@echo off
runas /user:"MYDOMAIN\%USERNAME%-p" "C:\Program Files (x86)\Microsoft Dynamics NAV\110\RoleTailored Client\Microsoft.Dynamics.Nav.Client.exe -settings:\\files\ERP\RTCCONFIG\DEV110_NST01_V103.config"

startDynamicsNAVIDE.bat

This script will start the Dynamics NAV IDE, which we use mainly for the Object Designer. We need the parameter generatesymbolreference, so that the symbols will be generated when we compile the C/AL code, so that the symbols are available for AL development in VS Code.

It seems we have some issue with localization, some users need Ja (german culture), others need Yes as the value for generatesymbolreference.

@echo off
REM runs the Dynamics NAV IDE (Object Designer)
REM some users have to use generatesymbolreference=Ja others need generatesymbolreference=Yes
REM we try to determine the language settings by the variable HomePath: Users vs Benutzer
set "generatesymbolreference=Ja"
if "%ProgramFiles%" equ "C:\Program Files" (SET /A generatesymbolreference=Yes)
runas /user:"MYDOMAIN\%USERNAME%-p" "C:\Program Files (x86)\Microsoft Dynamics NAV\110\RoleTailored Client\finsql.exe generatesymbolreference=%generatesymbolreference%"

startDynamicsNAVShell.bat

This script starts a PowerShell with the right startup parameters, so that some specific modules will be preloaded for development of Dynamics NAV. This seems to be quite tricky, to start PowerShell with another user. So we call the Batch script again as the different user, in order to be able to start PowerShell as that user.

@echo off
REM start the DynamicsNAV Development PowerShell
SET mypath=%~dp0
echo %mypath%
IF "%USERNAME:~-2%" neq "-p" (
  runas /user:"MYDOMAIN\%USERNAME%-p" "%mypath%\startDynamicsNAVShell.bat"
) else (
  cd C:\Users\%USERNAME%\DEV
  C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell.exe  -NoExit -ExecutionPolicy RemoteSigned " &amp; ' C:\Program Files (x86)\Microsoft Dynamics NAV\110\RoleTailored Client\NavModelTools.ps1 ' "
)

startVSCode.bat

Last, but not least: we start VSCode as a different user.

@echo off
start runas /user:"MYDOMAIN\%USERNAME%-p" "C:\Program Files\Microsoft VS Code\Code.exe"
Tags: , ,
Posted in Software Development | Comments Closed