progress-4gl
Procedury
Szukaj…
Wprowadzenie
Istnieją dwa rodzaje procedur w toku ABL: wewnętrzne procedury i prototypy procedur, które są fasadami dla bibliotek DLL Windows lub procedur bibliotek współdzielonych Unix / Linux.
Podobnie jak w przypadku funkcji, procedury nie mogą być zagnieżdżone. Nie można zagnieżdżać funkcji w procedurach i odwrotnie.
Wywoływana jest procedura z instrukcją RUN
.
Składnia
Uruchom nazwę procedury. // Uruchamia procedurę o nazwie procedurename.
RUN proc1 (WEJŚCIE „CZEŚĆ”). // Wprowadza ciąg CZEŚĆ do proc1
RUN proc2 (WEJŚCIE var1, wyjście var2). // Wejścia var1 i wyjścia var2 do / z proc2
RUN proc3 (wpisz „name = 'joe'”, TABELA WYNIKÓW ttResult). // Wprowadza nazwę = Joe i wyświetla rekordy w tabeli
PROCEDURA proc: // Deklaruje procedurę o nazwie proc
PROCEDURA KOŃCOWA. // Kończy bieżącą procedurę
Podstawowa procedura wewnętrzna
W przeciwieństwie do funkcji nie ma potrzeby przekazywania dalej deklaracji procedury. Można go umieścić w dowolnym miejscu w kodzie, przed lub po wywołaniu go za pomocą RUN
.
RUN proc.
//Procedure starts here
PROCEDURE proc:
//Procedure ends here
END PROCEDURE.
Po nazwie procedury pojawia się znak dwukropka informujący, że jest to początek bloku. Blok kończy się na END PROCEDURE.
(ale można to zastąpić po prostu END.
).
Parametry WEJŚCIA i WYJŚCIA
Procedura może mieć parametry różnego rodzaju: dane wejściowe, wyjściowe, dane wejściowe-wyjściowe (dwukierunkowe), a także niektóre specjalne typy, takie jak tabele tymczasowe i zestawy danych.
W instrukcji run deklaracja INPUT
jest opcjonalna (uważa się ją za domyślną) - wszystkie inne instrukcje muszą być wyraźnie zadeklarowane.
Procedura przyjmuje dwie liczby całkowite jako dane wejściowe i dane dziesiętne.
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
Parametry są całkowicie opcjonalne. Możesz mieszać i dopasowywać w dowolny sposób. Kolejność parametrów zależy od ciebie, ale wygodnie jest zacząć od wejścia i zakończyć od wyjścia - musisz ustawić je w odpowiedniej kolejności w instrukcji run, a kierunki mieszania mogą być denerwujące.
Rekurencja - patrz rekursja
Rekurencja jest łatwa - RUN
samą procedurę od wewnątrz procedury. Jeśli jednak powtórzysz się zbyt daleko, na stosie zabraknie miejsca.
Procedura obliczania silni.
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.
Zakres
Procedura ma swój zakres. Zewnętrzny zakres „spadnie” do procedury, ale nie w drugą stronę.
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
Zadeklarowanie zmiennej w procedurze, która ma taką samą nazwę jak parametr na zewnątrz, spowoduje utworzenie tylko zmiennej lokalnej.
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
Każda zmienna utworzona wewnątrz procedury jest dostępna tylko dla tej procedury.
To wygeneruje błąd kompilatora:
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