Unser nächstes AL-Go Template und den ganzen Quellcode findet ihr hier: https://github.com/byndit/BeyondAL
Dort ist auch ein Wrapper für Web Requests und Control Addins zu finden!
Viele neue Funktionalitäten in AL helfen uns vormals komplexe Probleme (bspw. das Parsen von JSON oder XML) einfacher umzusetzen. Dennoch kann solcher Quellcode noch immer unnötig komplex oder lang werden.
Am Beispiel des Parsens eines JSON Objekts möchten wir illustrieren, wie Code effektiv reduziert werden kann, indem Wrapper-Funktionen geschrieben werden.
Folgendes JSON soll als Beispiel dienen:
{
"id": "7eba17ec-399e-4be8-b7a4-1aceeb155b5f",
"name": "Max Mustermann",
"address": "Musterstraße 1",
"postCode": "12345",
"city": "Musterstadt",
"attributes": {
"transfer": true,
"homepage": "https://www.mustermann.de"
},
"shippingAddresses": [{
"name": "Max Mustermann",
"address": "Musterstraße 116",
"postCode": "67891",
"city": "Musterdorf"
},
{
"name": "Maxi Musterfrau",
"address": "Musterstraße 202",
"postCode": "41342",
"city": "Musterstadt"
}
]
}
Der AL Code soll nun alle Werte aus diesem JSON Objekt auslesen und einen Debitor mit den zugehörigen Liefer-an Adressen erstellen.
Ohne Wrapper-Funktionen könnte der Quellcode in etwa so aussehen:
Mit Wrapper-Funktionen kann der obenstehende Quellcode wie folgt verkürzt werden:
Dabei stellt die Codeunit „BYD Json Helper“ kleine Helferfunktionen bereit, die die bestehenden Funktionen von JsonObject, JsonArray, JsonToken und JsonValue geschickt verpacken und einfacher nutzbar machen:
procedure FindValue(JObject: JsonObject; Path: Text): JsonValue
var
JToken: JsonToken;
begin
if JObject.SelectToken(Path, JToken) then
if JToken.IsValue() then
exit(JToken.AsValue());
Error(UnableToFindJsonValueErr, Path);
end;
procedure ValAsTxt(JObject: JsonObject; Path: Text): Text
begin
exit(FindValue(JObject, Path).AsText());
end;
procedure ValAsBool(JObject: JsonObject; Path: Text): Boolean
begin
exit(FindValue(JObject, Path).AsBoolean());
end;
procedure ReadJArrayFromObj(JObject: JsonObject; Path: Text): JsonArray
var
JToken: JsonToken;
begin
if JObject.SelectToken(Path, JToken) then
if JToken.IsArray() then
exit(JToken.AsArray());
end;
Wir machen uns hier die „SelectToken“ Funktion zu Nutze, um sowohl mit Eigenschaftennamen als auch mit Pfaden zu arbeiten bzw. Werte aus der JSON Struktur zu lesen.
Dadurch sind wir in der Lage den ursprünglichen Quellcode deutlich zu verkürzen, verständlicher zu schreiben und Variablendeklarationen zu sparen.
Da diese Funktionen in einer dedizierten Codeunit ausgelagert sind, können diese immer und immer wieder an verschiedenen Stellen der Anwendung genutzt werden!
Den ganzen Quellcode gibt's hier: https://github.com/byndit/BeyondAL
Comments