progress-4gl
Procédures
Recherche…
Introduction
Il existe deux types de procédures dans Progress ABL: les procédures internes et les prototypes de procédures qui sont des façades pour les DLL Windows ou les procédures de bibliothèque partagée Unix / Linux.
Tout comme avec les fonctions, les procédures ne peuvent pas être imbriquées. Vous ne pouvez pas imbriquer des fonctions dans les procédures et inversement.
Une procédure est appelée avec l'instruction RUN
.
Syntaxe
Nom de procédure RUN. // Exécute une procédure appelée nom-procédure.
RUN proc1 (INPUT "HELLO"). // Saisit la chaîne HELLO pour proc1
RUN proc2 (INPUT var1, sortie var2). // Entrée var1 et sorties var2 vers / depuis proc2
RUN proc3 (entrée "name = 'joe'", OUTPUT TABLE ttResult). // Entrée nom = joe et produit des enregistrements dans une table
PROCEDURE proc: // Déclare une procédure nommée proc
PROCÉDURE DE FIN. // Termine la procédure en cours
Une procédure interne de base
Contrairement aux fonctions, il n'est pas nécessaire de transmettre une procédure de déclaration. Il peut être placé n'importe où dans votre code, avant ou après l’appel via RUN
.
RUN proc.
//Procedure starts here
PROCEDURE proc:
//Procedure ends here
END PROCEDURE.
Le nom de la procédure est suivi d'un signe deux-points nous indiquant qu'il s'agit du début d'un bloc. Le bloc se termine par END PROCEDURE.
(mais cela peut être remplacé par simplement END.
).
Paramètres INPUT et OUTPUT
Une procédure peut avoir des paramètres de différents types: entrée, sortie, entrée-sortie (bidirectionnelle) et certains types spéciaux tels que les tables de temp-temp et les jeux de données).
Dans l'instruction run, il est facultatif de déclarer INPUT
(il est considéré comme par défaut) - toutes les autres directions doivent être déclarées spécifiquement.
Une procédure prenant deux entiers en entrée et produisant une décimale.
PROCEDURE divideAbyB:
DEFINE INPUT PARAMETER piA AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER piB AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER pdeResult AS DECIMAL NO-UNDO.
pdeResult = piA / piB.
END PROCEDURE.
DEFINE VARIABLE de AS DECIMAL NO-UNDO.
RUN divideAbyB(10, 2, OUTPUT de).
DISPLAY de. //5.00
Les paramètres sont totalement optionnels. Vous pouvez mélanger et assortir comme vous le souhaitez. L'ordre des paramètres dépend de vous, mais il est utile de commencer par une entrée et de terminer par une sortie - vous devez les placer dans le bon ordre dans l'instruction d'exécution et les directions de mixage peuvent être gênantes.
Récursivité - voir récursivité
La récursivité est facile - RUN
la procédure elle-même depuis l'intérieur de la procédure. Cependant, si vous recentrez trop loin, la pile manquera d'espace.
Un calcul de procédure de la factorielle.
PROCEDURE factorial:
DEFINE INPUT PARAMETER piNum AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER piFac AS INTEGER NO-UNDO.
DEFINE VARIABLE iFac AS INTEGER NO-UNDO.
IF piNum = 1 THEN DO:
pifac = 1.
END.
ELSE DO:
RUN factorial(piNum - 1, OUTPUT iFac).
piFac = piNum * iFac.
END.
END PROCEDURE.
DEFINE VARIABLE f AS INTEGER NO-UNDO.
RUN factorial(7, OUTPUT f).
DISPLAY f.
Portée
La procédure a sa propre portée. La portée extérieure "saigne" dans la procédure mais pas dans l'autre sens.
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 1.
DEFINE VARIABLE j AS INTEGER NO-UNDO.
PROCEDURE p:
MESSAGE i VIEW-AS ALERT-BOX. // 1
MESSAGE j VIEW-AS ALERT-BOX. // 0
j = 2.
END PROCEDURE.
RUN p.
MESSAGE i VIEW-AS ALERT-BOX. // 1
MESSAGE j VIEW-AS ALERT-BOX. // 2
Déclarer une variable dans une procédure qui porte le même nom qu'un paramètre à l'extérieur ne créera qu'une variable locale.
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 1.
DEFINE VARIABLE j AS INTEGER NO-UNDO.
PROCEDURE p:
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 5.
MESSAGE i VIEW-AS ALERT-BOX. // 5
MESSAGE j VIEW-AS ALERT-BOX. // 0
j = 2.
END PROCEDURE.
RUN p.
MESSAGE i VIEW-AS ALERT-BOX. // 1
MESSAGE j VIEW-AS ALERT-BOX. // 2
Toute variable créée à l'intérieur d'une procédure est accessible à cette procédure uniquement.
Cela générera une erreur de compilation:
PROCEDURE p:
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 5.
END PROCEDURE.
RUN p.
MESSAGE i VIEW-AS ALERT-BOX. // Unknown Field or Variable name i - error 201