Mit Bedingungsanweisungen arbeiten
Bedingungsanweisungen werden in jeder Programmiersprache, einschließlich der Anwendungssprache (AL), häufig verwendet. Eine Bedingungsanweisung wird verwendet, um eine Bedingung zu testen. Basierend auf der Bewertung dieser Bedingung werden möglicherweise eine oder mehrere Anweisungen ausgeführt.
If-Anweisungen
Die am häufigsten verwendete Bedingungsanweisung ist die if-Anweisung.
var
a: Integer;
b: Integer;
c: Integer;
begin
a := 10;
b := 5;
if a > b then
c := a - b;
end;
Im vorherigen Beispiel wird den Variablen a und b ein Wert zugewiesen. Mit der if-Anweisung wird die Bedingung getestet, dass a größer ist als b. Wenn diese Bedingung erfüllt ist, wird der Variablen c der Wert a minus b zugewiesen.
Beachten Sie die Position des Semikolons. Ein Semikolon zeigt den Beginn einer neuen Anweisung an. Da if .. then als eine Anweisung betrachtet wird, befindet sich das Semikolon hinter der letzten Anweisung und nicht hinter dem Schlüsselwort then.
Sie können nach dem Schlüsselwort then nur eine Anweisung platzieren. Falls Sie mehrere Anweisungen ausführen möchten, wenn die Bedingung erfüllt ist, müssen Sie eine zusammengesetzte Anweisung verwenden. Dies wird im folgenden Beispiel gezeigt.
var
a: Integer;
b: Integer;
c: Integer;
begin
a := 10;
b := 5;
if a > b then begin
c := a - b;
Message('%1', c);
end;
end;
Es ist wichtig, die Positionen der verschiedenen Semikolons nach jeder Anweisung innerhalb der zusammengesetzten Anweisung und auch am Ende der zusammengesetzten Anweisung zu beachten.
if-then-else-Anweisung
Die if-Anweisung wird häufig mit einer else-Anweisung kombiniert. Die Anweisung(en) im Block else wird/werden ausgeführt, wenn die Bedingung nicht als wahr bewertet wird.
var
a: Integer;
b: Integer;
c: Integer;
begin
a := 10;
b := 5;
if a > b then
c := a - b
else
c := a + b;
end;
Im Block then wird am Ende der Anweisung kein Semikolon eingefügt, jedoch am Ende der vollständigen if-then-else-Anweisung.
Sie können auch zusammengesetzte Anweisungen in einer if-then-else-Struktur verwenden.
var
a: Integer;
b: Integer;
c: Integer;
begin
a := 10;
b := 5;
if a > b then begin
c := a - b;
Message('%1', c);
end
else begin
c := a + b;
Message('%1', c);
end;
end;
Da eine if-then-else-Anweisung auch eine reguläre Anweisung ist, können Sie if-Anweisungen in andere if-Anweisungen einsetzen. So entstehen geschachtelte if-Anweisungen.
begin
if Amount <> 0 then
if Amount > 0 then
Sales := Sales + Amount
else
if Reason = Reason::Return then
if ReasonForReturn = ReasonForReturn::Defective then
Refund := Refund + Amount
else
Credits := Credits + Amount
else
Sales := Sales - Amount;
end;
Seien Sie mit nested if-Anweisungen vorsichtig, weil sie oft schwer zu lesen sind und komplex sein können. Wenn Sie sich die Positionen der Semikolons ansehen, können Sie sie leichter lesen und verstehen.
Ternären Operator verwenden
Der ternäre Operator (? :), bekannt aus anderen Programmiersprachen, optimiert bedingte Operationen im Code, verbessert die Lesbarkeit und verringert die Ausführlichkeit. Es ist nützlich für einfache Bedingungen und fördert die Klarheit des Codes sowie die absichtsorientierte Programmierung. Durch die Möglichkeit der variablen Initialisierung in der gleichen Zeile wird eine ordnungsgemäße Zuweisung sichergestellt und die Codelänge wird minimiert. Mit dieser Version unterstützt AL den ternären Operator.
Der ternäre Operator kann verwendet werden, um einer Variablen je nach Bedingung eines Ausdrucks einen von zwei Werten zuzuweisen. Hier ist ein Beispiel zur Verwendung von „if-then-else“ mit einem ternären Operator.
Programmierkonventionen
Folgen Sie diesen Prinzipien, um erfolgreiche Implementierungen durchzuführen:
If und then sollten in derselben Zeile stehen, else in einer separaten.
Wenn es viele oder lange Ausdrücke gibt, sollte then in einer neuen Zeile stehen und an if-Ausdrücken ausgerichtet sein.
Wenn Sie if-Ausdrücke mit then‑ und else-Teilen schreiben, tun Sie es so, dass das then-Ergebnis wahrscheinlicher ist als das else-Ergebnis.
Wenn die letzte Anweisung im then-Teil einer if-then-else-Anweisung ein Ausgang oder ein Fehler ist, fahren Sie nicht mit einer else-Anweisung fort.
Case-Anweisung
Eine weitere bedingte Anweisung, die Sie verwenden können, ist die case-Anweisung. Abhängig vom Wert einer Bedingung führt die case-Anweisung andere Anweisungen aus.
Das nächste Beispiel zeigt, dass die case-Anweisung abhängig vom Wert des Document Type (dies ist ein Optionsfeld in einer Tabelle) einige Anweisungen ausführt. Die case-Anweisung kann sonst einen else-Block verwenden, der ausgeführt wird, wenn keine anderen Blöcke verwendet werden. Weil Sie nur eine Anweisung für jeden Block mit einer case-Anweisung ausführen können, müssen Sie zusammengesetzte Anweisungen verwenden, um mehrere Anweisungen gleichzeitig auszuführen.
var
a: Integer;
begin
case "Document Type" of
"Document Type"::Quote:
a := 1 + 1;
"Document Type"::Order:
a := 2 + 1;
"Document Type"::Invoice:
begin
// Some statement 1;
// Some statement 2;
// Some statement 3;
a := 3 + 1;
end;
"Document Type"::"Return Order":
if Reason = Reason::Return then begin
// Some statement 1;
// Some statement 2;
// Some statement 3;
a := 4 + 1;
end;
else
a := 5 + 1;
end;
end;
Case-Anweisungen werden auch Multiple-Option-Anweisungen genannt und in der Regel verwendet, wenn Sie zwischen mehr als zwei verschiedenen Aktionen auswählen müssen. Die Methode der case-Anwendung ist folgende:
Der Ausdruck wird ausgewertet, und der erste übereinstimmende Wertesatz führt die zugehörige Anweisung aus, sofern eine vorhanden ist.
Es wird keine Aktion ausgeführt, wenn kein Wertesatz mit dem Wert des Ausdrucks übereinstimmt und der optionale else-Teil weggelassen wurde. Es wird die zugehörige Anweisung ausgeführt, wenn der optionale else-Teil verwendet wird.
Der Datentyp der Wertesätze muss mit dem Datentyp von Expression übereinstimmen oder mindestens in denselben Datentyp konvertierbar sein.
Der Datentyp der Wertemengen wird in den meisten Fällen in den Datentyp des ausgewerteten Ausdrucks konvertiert. Die einzige Ausnahme besteht, wenn der ausgewertete Ausdruck eine Code-Variable ist. Die Wertesätze werden nicht in den Code-Datentyp konvertiert, wenn der ausgewertete Ausdruck eine Code-Variable ist.
Programmierkonventionen – Case-Anweisungen
Mit einer case-Anweisung rücken sie die Wertesätze um vier Leerzeichen ein. Wenn zwei oder mehr Wertesätze in derselben Zeile vorhanden sind, trennen Sie sie durch Kommas ohne Leerzeichen. Auf den letzten in einer Zeile gesetzten Wert folgt unmittelbar ein Doppelpunkt ohne vorgestelltes Leerzeichen. Die Aktion beginnt in der Zeile nach dem eingestellten Wert und wird um vier Leerzeichen weiter eingerückt. Wenn es ein begin gibt, sollte dies in eine separate Zeile gestellt werden, es sei denn, es folgt etwas anderes. Wenn ein begin auf ein else folgt, sollte dies in derselben Zeile wie else stehen.
Verwenden Sie eine Case-Anweisung, wenn es mehr als zwei Alternativen gibt. Verwenden Sie andernfalls eine if-then-else-Anweisung.
Präprozessordirektiven in AL
Wie in anderen Programmiersprachen können auch in AL Präprozessordirektiven verwendet werden, um Code als bedingt festzulegen, Warnungen zu unterdrücken oder das Ein‑ und Ausblenden des Codes zu ermöglichen.
Präprozessordirektiven können in die folgenden Gruppen unterteilt werden.
- Bedingte Direktiven
- Regionen
- Pragmata
Jeder Code kann als bedingt festgelegt werden, einschließlich Tabellenfelder, und mit einer bedingten Direktive überprüft werden. Um Code mit einer bedingten Direktive zu überprüfen, müssen Sie ein zu überprüfendes Symbol definieren. Ein Symbol gibt einen booleschen Wert zurück: „true“ oder „false“.
Symbole können am Anfang einer Quelldatei definiert werden, und der Geltungsbereich des jeweiligen Symbols ist die Datei, in der es definiert ist. Sie können auch Symbole in der Datei „app.json“ definieren, und dann ist der Geltungsbereich für die Erweiterung global.
Die folgenden bedingten Präprozessordirektiven werden in AL unterstützt.
#if – Gibt den Anfang einer Bedingungsklausel an. Sie wird mit der #endif-Klausel beendet. Kompiliert den Code zwischen den Direktiven, wenn das zur Überprüfung angegebene Symbol definiert ist.
#else – Gibt eine zusammengesetzte Bedingungsklausel an. Wenn keine der vorhergehenden Klauseln als „true“ ausgewertet wird, wertet der Compiler den Code zwischen #else und #endif aus.
#elif – Kombiniert die Anweisungen „else“ und „if“. Wenn #elif „true“ ist, wertet der Compiler den gesamten Code zwischen #elif und der nächsten bedingten Direktive aus.
#endif – Gibt das Ende einer Bedingungsklausel an, die mit #if beginnt.
#define – Definiert ein Symbol, mit dem Bedingungen für eine Kompilierung angegeben werden können. Beispiel: #define DEBUG. Der Gültigkeitsbereich des Symbols ist die Datei, in der es definiert wurde.
#undef – Definiert ein Symbol.
Symbole können global in der Datei „app.json“ definiert werden. Ein Symbol kann auch mit der Direktive „#define“ im Code definiert werden, wenn Symbole jedoch in der Datei „app.json“ definiert sind, können sie global verwendet werden.
Das folgende Beispiel definiert DEBUG als globales Symbol. Dies kann dann im Code verwendet werden, wie im folgenden Beispiel für bedingten Code dargestellt. Ein Symbol hat einen booleschen Wert, d. h. es wird als „true“ oder „false“ ausgewertet.
app.json file
"preprocessorSymbols": [ "DEBUG" ]
AL-Code, der das DEBUG-Symbol verwendet
#if DEBUG
trigger OnOpenPage()
begin
Message('Only in debug versions');
end;
#endif
AL-Warnungen unterdrücken
In einigen Fällen beruhen Compiler‑ oder Analysewarnungen auf der beabsichtigten Verwendung des Codes. Zur Verbesserung der Übersichtlichkeit bieten wir Support, um Warnungen ausdrücklich zu unterdrücken, entweder für eine vollständige Erweiterung oder lokal in einer Codeumgebung, damit sich Entwickler auf Warnungen konzentrieren können, die behoben werden müssen.
Es gibt zwei Möglichkeiten, Warnungen zu unterstützen:
Global (für eine Erweiterung)
Lokal
Bedenken Sie, dass die meisten Warnungen aus einem bestimmten Grund erscheinen. Wenn Sie sie unterdrücken, könnte dies plötzliche Auswirkungen haben, wenn Warnungen in Fehler (wie veraltete Elemente) geändert werden.
Global
Wir haben dem app.json-Manifest eine suppressWarnings-Eigenschaft hinzugefügt, damit Sie eine durch Kommata getrennte Liste von Warn-IDs unterdrücken können, wenn Sie die Erweiterung kompilieren:
"suppressWarnings": [Warning ID,Warning ID2,...]
Lokal
Direktiven ist ein neues Konstrukt in der AL-Sprache, das festlegt, wie der AL-Compiler einen umschlossenen Codeabschnitt behandelt. Das gleiche Konzept ist in anderen Sprachen bekannt. Die spezifischen Direktivenanweisungen müssen vom Compiler unterstützt werden. Sie können keine benutzerdefinierten Vorverarbeitungsanweisungen erstellen.
Eine der neuen Direktiven ist ein Warnpragma, das Sie um einen Codeabschnitt herum festlegen können, um eine durch Kommata getrennte Liste von Warnungen nur in dieser Umgebung zu unterdrücken.
Wird kein End-pragma-Abschluss bereitgestellt, ist dies der Rest der Datei. Die Wiederherstellung bringt sie in den oben beschriebenen globalen Unterdrückungsstatus zurück. Wenn keine Warnnummern angegeben sind, deaktiviert „Deaktivieren“ alle Warnungen, während „Wiederherstellen“ alle Warnungen aktiviert.
#pragma warning disable warning-list
#pragma warning restore warning-list