progress-4gl
Verfahren
Suche…
Einführung
In Progress ABL gibt es zwei Arten von Prozeduren: interne Prozeduren und Prozedurprototypen, bei denen es sich um Fassaden für Windows-DLLs oder Unix / Linux-Bibliotheksverfahren handelt.
Wie bei Funktionen können Prozeduren nicht verschachtelt werden. Sie können Funktionen nicht in Prozeduren verschachteln und umgekehrt.
Eine Prozedur wird mit der Anweisung RUN
aufgerufen.
Syntax
RUN verfahrename. // Führt eine Prozedur mit dem Namen Prozedurname aus.
RUN proc1 (EINGABE "HALLO"). // Gibt den String HELLO in proc1 ein
RUN proc2 (INPUT var1, Ausgang var2). // Eingänge var1 und Ausgänge var2 zu / von proc2
RUN proc3 (Eingabe "name = 'joe'", OUTPUT TABLE ttResult). // gibt name = joe ein und gibt Datensätze in einer Tabelle aus
PROCEDURE proc: // Deklariert eine Prozedur mit dem Namen proc
ENDE VERFAHREN. // Beendet die aktuelle Prozedur
Ein grundlegendes internes Verfahren
Im Gegensatz zu Funktionen muss keine Prozedur weitergeleitet werden. Er kann vor oder nach dem Aufruf mit RUN
an beliebiger Stelle in Ihrem Code platziert werden.
RUN proc.
//Procedure starts here
PROCEDURE proc:
//Procedure ends here
END PROCEDURE.
Dem Namen der Prozedur folgt ein Doppelpunkt, der uns mitteilt, dass dies der Beginn eines Blocks ist. Der Block endet mit END PROCEDURE.
(aber dies kann einfach durch END.
).
INPUT- und OUTPUT-Parameter
Eine Prozedur kann verschiedene Parameter haben: Eingabe, Ausgabe, Eingabe-Ausgabe (bidirektional) sowie einige spezielle Typen wie temporäre Tabellen und Datensätze.
In der run-Anweisung ist es optional, INPUT
zu deklarieren (es gilt als Standard) - alle anderen Richtungen müssen ausdrücklich deklariert werden.
Eine Prozedur, die zwei Ganzzahlen als Eingabe verwendet und eine Dezimalzahl ausgibt.
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
Parameter sind völlig optional. Sie können nach Belieben mischen und kombinieren. Die Reihenfolge der Parameter hängt von Ihnen ab, aber es ist praktisch, mit der Eingabe zu beginnen und mit der Ausgabe zu enden - Sie müssen sie in der Run-Anweisung in die richtige Reihenfolge bringen, und die Mischrichtungen können ärgerlich sein.
Rekursion - siehe Rekursion
Rekursion ist einfach - RUN
die Prozedur selbst innerhalb der Prozedur. Wenn Sie jedoch zu weit zurückkehren, wird der Stapel nicht mehr ausreichen.
Eine Prozedur berechnet die Fakultät.
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.
Umfang
Das Verfahren hat seinen eigenen Geltungsbereich. Der äußere Bereich "blutet" in die Prozedur ein, aber nicht umgekehrt.
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
Durch das Deklarieren einer Variablen innerhalb einer Prozedur, die denselben Namen wie ein Parameter auf der Außenseite hat, wird nur eine lokale Variable erstellt.
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
Jede innerhalb einer Prozedur erstellte Variable ist nur für diese Prozedur zugänglich.
Dies erzeugt einen Compiler-Fehler:
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