progress-4gl
Procedures
Zoeken…
Invoering
Er zijn twee soorten procedures in Progress ABL: interne procedures en procedure-prototypes die gevels zijn voor Windows dll's of Unix / Linux gedeelde bibliotheekprocedures.
Net als bij functies kunnen procedures niet worden genest. U kunt functies niet nesten in procedures en vice versa.
Een procedure wordt aangeroepen met de RUN
instructie.
Syntaxis
RUN procedurenaam. // Voert een procedure uit genaamd procedurenaam.
RUN proc1 (INGANG "HALLO"). // Voert de tekenreeks HELLO naar proc1 in
RUN proc2 (INPUT var1, output var2). // Ingang var1 en output var2 naar / van proc2
RUN proc3 (voer "name = 'joe'" in, UITVOERTABEL ttResult). // Voert naam in = Joe en voert records in een tabel uit
PROCEDURE proc: // Verklaart een procedure met de naam proc
EINDEPROCEDURE. // Beëindigt de huidige procedure
Een eenvoudige interne procedure
In tegenstelling tot functies is het niet nodig om een procedure door te geven. Het kan overal in uw code worden geplaatst, voor of nadat u het met RUN
.
RUN proc.
//Procedure starts here
PROCEDURE proc:
//Procedure ends here
END PROCEDURE.
De procedurenaam wordt gevolgd door een dubbele punt die aangeeft dat dit het begin van een blok is. Het blok eindigt met END PROCEDURE.
(maar dit kan eenvoudig worden vervangen door END.
).
INPUT- en OUTPUT-parameters
Een procedure kan verschillende parameters hebben: invoer, uitvoer, invoer-uitvoer (bidirectioneel) en ook enkele speciale typen zoals tijdelijke tabellen en gegevenssets).
In de run-instructie is het optioneel om INPUT
te declareren (het wordt als standaard beschouwd) - alle andere richtingen moeten specifiek worden aangegeven.
Een procedure waarbij twee gehele getallen als invoer worden gebruikt en een decimaal wordt uitgevoerd.
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
Parameters zijn volledig optioneel. Je kunt mixen en matchen op elke manier die je wilt. De volgorde van de parameters is aan jou, maar het is handig om te beginnen met invoer en te eindigen met uitvoer - je moet ze in de juiste volgorde in de run-instructie plaatsen en mixrichtingen kunnen vervelend zijn.
Recursie - zie recursie
Recursie is eenvoudig - RUN
de procedure zelf uit vanuit de procedure. Als u echter te ver gaat, heeft de stapel onvoldoende ruimte.
Een procedure berekening van de faculteit.
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.
strekking
De procedure heeft zijn eigen toepassingsgebied. De externe scope zal in de procedure "bloeden" maar niet andersom.
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
Als u een variabele binnen een procedure declareert die aan de buitenkant dezelfde naam heeft als een parameter, wordt alleen een lokale variabele gemaakt.
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
Elke variabele die aan de binnenkant van een procedure is gemaakt, is alleen voor die procedure toegankelijk.
Dit genereert een compilerfout:
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