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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow