progress-4gl
Rutiner
Sök…
Introduktion
Det finns två typer av procedurer i Progress ABL: interna procedurer och procedurprototyper som är fasader på Windows dlls eller Unix / Linux-delade biblioteksprocedurer.
Precis som med funktioner, kan procedurer inte kapslas. Du kan inte häcka funktioner i procedurer och vice versa.
En procedur kallas med RUN
uttalandet.
Syntax
KÖR procedurnamn. // Kör ett förfarande som heter procedurename.
KÖR proc1 (INGÅNG "HELLO"). // Matar in strängen HELLO till proc1
RUN proc2 (INPUT var1, output var2). // Ingångar var1 och utgångar var2 till / från proc2
RUN proc3 (input "name = 'joe'", OUTPUT TABLE ttResult). // Ingångar namn = joe och matar ut poster i en tabell
PROCEDURE proc: // Förklarar ett förfarande som heter proc
SLUTFÖRFARANDE. // Avslutar det aktuella förfarandet
En grundläggande intern procedur
Till skillnad från funktioner finns det inget behov av att vidarebefordra ett förfarande. Den kan placeras var som helst i din kod, före eller efter att du ringer den med RUN
.
RUN proc.
//Procedure starts here
PROCEDURE proc:
//Procedure ends here
END PROCEDURE.
Procedurnamnet följs av ett kolonskylt som säger att detta är början på ett block. Blocket slutar med END PROCEDURE.
(men detta kan ersättas med helt enkelt END.
).
INPUT- och OUTPUT-parametrar
En procedur kan ha parametrar av olika slag: input, output, input-output (dubbelriktad) och även några specialtyper som temp-tabeller och datasätt).
I körförklaringen är det valfritt att förklara INPUT
(det anses som standard) - alla andra anvisningar måste anges specifikt.
En procedur som tar två heltal som inmatning och matar ut en decimal.
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
Parametrar är helt valfria. Du kan blanda och matcha vad du vill. Parternas ordning är upp till dig men det är praktiskt att börja med input och avsluta med output - du måste sätta dem i rätt ordning i körsatsen och blandningsanvisningarna kan vara irriterande.
Rekursion - se rekursion
Rekursion är lätt - RUN
själva proceduren inifrån proceduren. Men om du rekryterar för långt kommer stacken att bli tom.
En procedurberäkning av fabriken.
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.
Omfattning
Förfarandet har sitt eget räckvidd. Det yttre räckvidden "blöder" in i proceduren men inte tvärtom.
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
Att deklarera en variabel i en procedur som har samma namn som en parameter på utsidan skapar bara en lokal variabel.
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
Alla variabler som skapas på insidan av en procedur är endast tillgängliga för den proceduren.
Detta genererar ett kompilatorfel:
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