AL Programmieren in Visual Studio Code

"Wo ist meine tolle Entwicklungsoberfläche hin?" oder "Ich sag da nur: Back to the roots!" waren die ersten Reaktionen der Entwickler auf die neue Entwicklungssprache AL.

AL unterscheidet sich zu C/AL dahingehend, dass der NAV Developer Client für die Enwicklung entfällt, synaxtechnisch sind beide Sprachen jedoch kaum voneinander zu unterscheiden. Für die AL Entwicklung wird jetzt Visual Studio Code verwendet, welches das Erstellen von Extensions ermöglicht.

Ein weiterer Unterschied ist, dass mit AL das Programmieren in NAV Standardobjekten untersagt wird, alles muss unter einer Extension laufen.

Begriffserklärung "Extensions"

Eine Extension ist meist eine kleine Anwendung, welche die Hauptanwendung Microsoft Dynamics 365 Business Central um zusätzliche Funktionalitäten erweitert.

AL Language

Um in AL programmieren zu können, muss eine AL Language Extension für Visual Studio Code installiert werden. Diese findet man meistens unter dem Installationsverzeichnis von BC, oder im Falle von Docker und einem existierenden Container, kann man diese über eine WebSite runterladen:

http://CONTAINERNAME:8080/

Extension erstellen

Um eine neue Extension zu erstellen, muss folgender Befehl in Visual Studio Code ausgeführt werden (mit F1):

AL Go

Visual Studio Code fragt nach einem lokalen Repo Pfad, in welchem die Extension hinterlegt werden soll.

Bereits existierende Extension in DevOps

Um eine Extension aus DevOps zu holen, muss die gewünschte Repo geklont werden, siehe Hilfe zu DevOps.

AL Download Symbols

Damit in einer Extension programmiert werden kann, müssen zuerst die Symbole aus der Business Central runtergeladen werden.

Damit der Befehl...

AL Download Symbols

erfolgreich abläuft, muss gecheckt werden, ob die launch.json im .vscode Verzeichnis richtig eingerichtet ist.

Folgende Parameter müssen gepflegt sein:

"server": "http://Cronus/",
"serverInstance": "nav",
"authentication": "Windows",

Im Falle eines Containers kommt in der Parameter server der Containername rein, und die serverInstance ist meist "nav", falls dies abweicht, kann man den Namen ganz einfach abfragen, siehe Hilfe zu Docker Befehlen.

Damit muss der Befehl AL Download Symbols erfolgreich ablaufen, vorausgesetzt der Container läuft schon.

Neues AL Objekt anlegen

Bei der Bennenung von AL Dateien müssen die akuellsten Guidelines von Microsoft berücksichtigt werden. Microsoft Guidelines

Neue Tabelle anlegen

Um eine neue Tabelle anzulegen, muss zuerst eine .al Datei erstellt werden. Diese soll nach den Microsoft Guidelines benannt werden.

Da wir in AL keine einsteigerfreundliche Oberfläche wie in C/AL haben, startet man hier in einer leeren Datei. Damit diese Datei als Table deklariert werden kann, kann ein Snippet verwendet werden:

ttable

Es gibt allerhand Snippets, die dem Entwickler das Programmieren einfacher machen sollen. Vom erstellen von Tabellen, bis hin zu Funktions- und Feld-Snippets. Snippets können über IntelliSence aufgerufen, diese beginnen immer mit einem t. Weitere Beispiele für Snippets:

tfield
tpage
tpagefield
tprocedure

Wenn das Snippet ttable ausgewählt wurde, muss zu aller erst die Tabellen-ID eingefügt werden, wie auch den Tabellen Namen. Mit TAB springt man von Highlight zu Highlight und kann die Werte ersetzen.

ttable

Da wir hier keine Übersicht der Properties von Tabelle und Feld bekommen, kann man hier das IntelliSence für nutzen. Wenn man mit dem Cursor in einem Property-Bereich steht, kann man mit

Strg + Leertaste

IntelliSence aufrufen. Dieser schlägt dann alle verfügbaren Properties vor, die die Tabelle oder das Feld besitzen.

Tabellenstruktur

Nachdem die Tabelle und die Properties gepflegt wurden, folgt immer der Bereich der Felder. Dieser muss ajuch explizit gekennzeichet werden. Der Bereich wird mit

fields
{
    ...
}

definiert.

Nach den Feldern folgen die Keys. Diese werden folgendermaßen deklariert:

keys
{
    ...
}

Nach den Keys folgen die globalen Variablen, welche auf derselben Ebene folgend beginnen:

var
    MyVar: Integer;

Danach folgen die typischen Trigger für die Tabelle und die Felder, diese sehen wie folgt aus:

trigger MyTrigger()
begin
    ...
end;

Wenn man nun Funktionen hinzufügen will, muss das wie folgt aussehen:

local procedure MyProcedure(Parameter1, ...)
var
    myVar: Integer;
begin
    ...
end;

Bei einer globalen Funktion fällt das local weg:

procedure MyProcedure(Parameter1, ...)
var
    myInt: Integer;
begin
    ...
end;

Programmieren in einem Objekt.

Das Programmieren in einem Objekt ist identisch zu der Programmierung in C/AL. Es hat sich kaum was geändert, hauptsächlich fallen Variablentypen weg und es kommen neue hinzu, bspw. um bei Listen kein dotNet mehr verwenden zu müssen, wurde der Variablentyp List neu hinzugefügt. Außerdem versucht Microsoft, den Typ Option mit Enums auszutauschen.

Es folgen Beispiele für die Deklaration von Variablen:

myBool: Boolean;
myInt: Integer;
myRec: Record "Item";
myEnum: Enum "CB Colors";
myRecRef: RecordRef;

Weiterhin sollen Keywords, die für die AL Sprache reserviert wurden (bspw. begin end, if then, case, etc.) immer klein geschrieben werden, im gegensatz zu C/AL, wo diese immer groß geschrieben werden.

Es is noch zu beachten, dass Funktionen, welche aufgerufen werden, immer mit Klammern beendet werden müssen, auch wenn die Funktion keine Übergabeparameter besitzt.

if myBool then
    myProcedure();

Neue Page Extension

Extensions verhalten sich ähnlich wie normale Objekte, jedoch verweisen diese auf eine bereits vorhandene Page. Folgendes Snippet erstellt in einem neuen Objekt eine Page Extension:

tpageext

tpageext

Neues Feld / Action einfügen

Um ein neues Feld/eine neue Action einzufügen, muss zuerst bestimmt werden, wo sich das neue Feld/die neue Action befinden soll. Dies tut man wie folgt:

addafter(AnyField)
{
    field(MyField; NewField)
    {
        ...
    }
}

Neuen Report anlegen

Um einen neuen Report anzulegen, gibt es folgenden Snippet:

treport

treport

Damit ein Report ein RDL bekommt, muss folgende Property gepflegt werden:

RDLCLayout = `Extension\Report\TestReport.rdl`;

Beim AL Package erstellt VSCode dann automatisch eine RDL-Datei in dem angegebenen Pfad. Diesen kann man dann auch mit Visual Studio oder dem SQL Report Designer aufgerufen werden.

Reportstruktur

Nach den Report-Properties folgt das dataset. Das dataset sollte dann mit dataitems bestückt werden. In den dataitems werden zuerst die Properties beschrieben und danach folgen die columns.

Wichtig ist, dass die dataitem trigger erst nach den columns geschrieben werden. Bedeutet, dass die drei Trigger OnPreDataItem,OnAfterGetRecord,OnPostDataItem immer unter den columns des dataitems stehen müssen. Dies kann jedoch zu Problemen in der Übersichtlichkeit kommen, wenn der Report größer wird.

Nach dem dataset folgt die requestpage. Eine RequestPage verhält sich äquivalent zu einer Page.

treportrequestpage

Hier gibt es wieder Properties, das layout, ein area, eine group und darin dann spezifische Felder.

Globale Variablen folgen in einem Report immer zum Schluss.

Wenn Text Konstante in Reports genutzt werden sollen, sollte man dafür Labels nutzen. Denn Labels werden mit in die TranslationFile gepackt, in welchen man diese dann global übersetzen kann.

translationfile

Zurück zur Startseite Home

Back to top Generated by DocFX