progress-4gl
procedure
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