Utiliser des instructions conditionnelles
Les instructions conditionnelles sont largement utilisées dans n’importe quel langage de programmation, y compris le langage d’application (AL). Une instruction conditionnelle est utilisée pour tester une condition. En fonction de l’évaluation de cette condition, elle peut exécuter une ou plusieurs instructions.
Instructions If
L’instruction conditionnelle la plus couramment utilisée est l’instruction if.
var
a: Integer;
b: Integer;
c: Integer;
begin
a := 10;
b := 5;
if a > b then
c := a - b;
end;
Dans l’exemple précédent, les variables a et b se voient attribuer une valeur. Avec l’instruction if, la condition selon laquelle a est plus grand que b est testée. Si cette condition est true, la variable c se voit affecter la valeur a moins b.
Notez la position du point-virgule. Un point-virgule indique le début d’une nouvelle instruction. Étant donné que if est considéré comme une instruction, le point-virgule est placé après la dernière instruction, pas après le mot-clé then.
Vous ne pouvez mettre qu’une seule instruction après le mot-clé then. Si vous souhaitez exécuter plusieurs instructions lorsque la condition est true, vous devez utiliser une instruction composée, comme indiqué dans l’exemple suivant.
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;
Il est important de noter la position des différents points-virgules après chaque instruction dans l’instruction composée, ainsi qu’à la fin de celle-ci.
Instruction If-then-else
L’instruction if est fréquemment associée à une instruction else. Si la condition n’est pas évaluée comme true, les instructions du bloc else sont exécutées.
var
a: Integer;
b: Integer;
c: Integer;
begin
a := 10;
b := 5;
if a > b then
c := a - b
else
c := a + b;
end;
Aucun point-virgule n’est placé à la fin de l’instruction dans le bloc then, mais un seul est placé à la fin de l’instruction if-then-else.
Vous pouvez également utiliser des instructions composées dans une structure if-then-else.
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;
Comme une instruction if-then-else est également une instruction régulière, vous pouvez mettre les instructions if dans d’autres instructions if, ce qui crée des instructions nested if.
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;
Faites attention aux instructions nested if, car elles sont souvent difficiles à lire et peuvent être complexes. En examinant les positions des points-virgules, vous pouvez les rendre plus faciles à lire et à comprendre.
Utiliser l’opérateur ternaire
L’opérateur ternaire (? :) connu d’autres langages de programmation rationalise les opérations conditionnelles dans le code, améliore la lisibilité et réduit la verbosité. Il est utile pour les conditions simples, favorisant la clarté du code et la programmation axée sur l’intention. En permettant l’initialisation des variables au sein de la même ligne, il garantit une affectation adéquate et réduit la longueur du code. Avec cette version, AL prend en charge l’opérateur ternaire.
L’opérateur ternaire permet d’affecter une valeur parmi un choix de deux à une variable, selon la condition d’une expression. Voici un exemple d’utilisation d’une instruction if-then-else avec un opérateur ternaire :
Conventions de programmation
Pour des implémentations réussies, suivez ces principes :
If et then doivent se trouver sur la même ligne ; else doit se trouver sur une ligne distincte.
En cas d’expressions nombreuses ou longues, then doit se trouver sur une nouvelle ligne et être aligné sur les expressions if.
Lorsque vous écrivez des expressions if avec des composants then et else, écrivez-les de sorte que le résultat then soit plus probable que le résultat else.
Si la dernière instruction du composant then d’une instruction if-then-else est une sortie ou une erreur, ne continuez pas avec une instruction else.
Instruction case
L’instruction case est une autre instruction conditionnelle que vous pouvez utiliser. En fonction de la valeur d’une condition, l’instruction case exécute d’autres instructions.
L’exemple suivant montre que, selon la valeur de Document Type (qui est un champ d’option dans une table), l’instruction case exécute certaines instructions. L’instruction case peut utiliser un bloc else exécuté lorsqu’aucun autre bloc n’est exécuté. Comme vous ne pouvez exécuter qu’une seule instruction pour chaque bloc avec une instruction case, vous devez exécuter plusieurs instructions simultanément à l’aide d’instructions composées.
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;
Les instructions case sont également appelées instructions à option multiple et généralement utilisées lorsque vous devez choisir entre plus de deux actions différentes. Voici la méthode de l’instruction case :
L’Expression est évaluée et le premier ensemble de valeurs correspondant exécute l’instruction associée, le cas échéant.
Si aucun ensemble de valeurs ne correspond à la valeur de l’expression et que le composant facultatif else a été omis, aucune action n’est entreprise. Si le composant facultatif else est utilisé, l’instruction associée est exécutée.
Le type de données des ensembles de valeurs doit être le même que celui de l’Expression ou au moins être convertible dans le même type.
Dans la plupart des cas, le type de données des ensembles de valeurs est converti dans le type de données de l’expression évaluée, sauf si l’expression évaluée est une variable Code. Si l’expression évaluée est une variable Code, les ensembles de valeurs ne sont pas convertis dans le type de données Code.
Conventions de programmation : instructions case
Lorsque vous utilisez une instruction case, mettez en retrait les ensembles de valeurs de quatre espaces de caractères. Si au moins deux ensembles de valeurs se trouvent sur la même ligne, séparez-les par des virgules sans espace. La dernière valeur définie sur une ligne est immédiatement suivie de deux-points sans espace précédente. L’action commence sur la ligne après la valeur définie et est mise en retrait de quatre espaces de caractères supplémentaires. S’il y a une instruction begin, elle doit être placée sur une ligne distincte, à moins qu’elle ne suive une instruction else. Si une instruction begin suit une instruction else, elle doit se trouver sur la même ligne que l’instruction else.
S’il y a plus de deux choix, utilisez une instruction case. Sinon, utilisez une instruction if-then-else.
Directives du préprocesseur dans AL
Dans AL, comme dans d’autres langages de programmation, les directives du préprocesseur permettent de rendre le code conditionnel, de supprimer les avertissements ou de développer ou réduire le code.
Les directives du préprocesseur peuvent être divisées selon les groupes suivants :
- Directives conditionnelles
- Régions
- Pragmas
Tout code peut être rendu conditionnel, y compris les champs de table, et vérifié à l’aide d’une directive conditionnelle. Pour vérifier le code à l’aide d’une directive conditionnelle, vous devez définir un symbole à vérifier. Un symbole renvoie une valeur booléenne ; true ou false.
Les symboles peuvent être définis au début d’un fichier source et l’étendue du symbole spécifique est le fichier dans lequel il est défini. Vous pouvez également définir des symboles dans le fichier app.json, et l’étendue est alors globale pour l’extension.
Les directives de préprocesseur conditionnelles suivantes sont prises en charge dans AL.
#if : spécifie le début d’une clause conditionnelle. La clause #endif y met fin. Compile le code entre les directives si le symbole spécifié en cours de vérification est défini.
#else : spécifie une clause conditionnelle composée. Si aucune des clauses précédentes n’est true, le compilateur évalue le code entre #else et #endif.
#elif : associe des instructions else et if. Si #elif est true, le compilateur évalue tout le code entre #elif et la prochaine directive conditionnelle.
#endif : spécifie la fin d’une clause conditionnelle qui commence par #if.
#define: définit un symbole qui peut être utilisé pour spécifier les conditions d’une compilation. Par exemple, #define DEBUG. L’étendue du symbole est le fichier dans lequel il a été défini.
#undef : annule la définition d’un symbole.
Les symboles peuvent être définis globalement dans le fichier app.json. Un symbole peut également être défini à l’aide de la directive #define dans le code, mais si des symboles sont définis dans le fichier app.json, ils peuvent être utilisés globalement.
L’exemple suivant définit DEBUG comme symbole global. Cela peut ensuite être utilisé dans le code, comme illustré dans l’exemple de code conditionnel ci-dessous. Un symbole a une valeur booléenne, c’est-à-dire qu’il est évalué sur true ou false.
Fichier app.json
"preprocessorSymbols": [ "DEBUG" ]
Code AL utilisant le symbole DEBUG
#if DEBUG
trigger OnOpenPage()
begin
Message('Only in debug versions');
end;
#endif
Supprimer les avertissements AL
Dans certains cas, les avertissements du compilateur ou de l’analyseur sont dus à l’utilisation prévue du code. Pour réduire l’encombrement et permettre aux développeurs de se concentrer sur les avertissements à traiter, nous avons ajouté une prise en charge permettant de supprimer explicitement les avertissements, soit pour l’ensemble d’une extension, soit localement dans une enceinte de code.
Il existe deux façons de prendre en charge les avertissements :
Globalement (pour une extension)
Localement
N’oubliez pas que la plupart des avertissements existent pour une raison et que leur suppression peut avoir un impact soudain, si les avertissements sont transformés en erreurs (comme les obsolescences).
Globalement
Une propriété suppressWarnings dans le manifeste app.json vous permet de supprimer une liste d’ID d’avertissement séparés par des virgules lorsque vous compilez l’extension :
"suppressWarnings": [Warning ID,Warning ID2,...]
Localement
Directives est une nouvelle construction dans le langage AL qui spécifie comment le compilateur AL traite une section de code fermée. Le même concept est connu dans d’autres langages. Les instructions spécifiques de la directive doivent être prises en charge par le compilateur. Vous ne pouvez pas créer d’instructions de prétraitement personnalisées.
L’une des nouvelles directives est un pragma d’avertissement, que vous pouvez définir autour d’une section de code pour supprimer une liste d’avertissements séparés par des virgules uniquement dans cette enceinte.
Si aucune fermeture de pragma n’est prévue, ce sera le reste du fichier. La restauration le renvoie à n’importe quel état de suppression globale tel que décrit ci-dessus. Lorsqu’aucun numéro d’avertissement n’est spécifié, « disable » désactive tous les avertissements et « restore » les active tous.
#pragma warning disable warning-list
#pragma warning restore warning-list