Ricerca…


introduzione

Ci sono due tipi di procedure in Progress ABL: procedure interne e prototipi di procedure che sono facciate di dll di Windows o procedure di libreria condivisa Unix / Linux.

Proprio come con le funzioni, le procedure non possono essere annidate. Non è possibile nidificare le funzioni nelle procedure e viceversa.

Una procedura viene chiamata con l'istruzione RUN .

Sintassi

  • RUN procedurename. // Esegue una procedura denominata procedurename.

  • RUN proc1 (INPUT "HELLO"). // Inserisce la stringa HELLO in proc1

  • RUN proc2 (INPUT var1, output var2). // Input var1 e output var2 a / from proc2

  • RUN proc3 (input "name = 'joe'", TABELLA DI OUTPUT ttResult). // Inputs name = joe e output records in una tabella

  • PROCEDURE proc: // Dichiara una procedura denominata proc

  • PROCEDURA DI FINE. // Termina la procedura corrente

Una procedura interna di base

A differenza delle funzioni, non è necessario inoltrare una procedura. Può essere inserito ovunque nel codice, prima o dopo averlo chiamato utilizzando RUN .

RUN proc.

//Procedure starts here
PROCEDURE proc:

//Procedure ends here
END PROCEDURE. 

Il nome della procedura è seguito da un segno del colon che ci dice che questo è l'inizio di un blocco. Il blocco termina con END PROCEDURE. (ma questo può essere sostituito semplicemente con END. ).

Parametri INPUT e OUTPUT

Una procedura può avere parametri di diverso tipo: input, output, input-output (bidirezionale) e anche alcuni tipi speciali come temp-tables e dataset).

Nell'istruzione run è facoltativo dichiarare INPUT (è considerato predefinito) - tutte le altre direzioni devono essere dichiarate in modo specifico.

Una procedura che prende due interi come input e che emette un decimale.

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

I parametri sono totalmente opzionali. Puoi mescolare e abbinare come preferisci. L'ordine dei parametri dipende da te, ma è comodo iniziare con l'input e terminare con l'output - devi metterli nell'ordine giusto nell'istruzione run e le direzioni di mixaggio possono essere fastidiose.

Ricorsione: vedi ricorsione

La ricorsione è semplice: RUN la procedura stessa dall'interno della procedura. Tuttavia, se si recita troppo lontano, lo stack esaurirà lo spazio.

Una procedura di calcolo fattoriale.

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.

Scopo

La procedura ha il proprio scopo. L'ambito esterno "sanguinerà" nella procedura, ma non viceversa.

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

Dichiarare una variabile all'interno di una procedura che ha lo stesso nome di un parametro all'esterno creerà solo una variabile 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

Qualsiasi variabile creata all'interno di una procedura è accessibile solo a quella procedura.

Questo genererà un errore del compilatore:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow