PROCEDURE
Akcia PROCEDURE
Deklarácia
PROCEDURE ProcName [([IN] type1 paramName1[,paramName2, ...] [IN] type2 paramName3]...)]
; akcie
END ProcName
Deklarácia pre vzdialené volanie
[IMPLEMENTATION] RPC PROCEDURE [ESLInterface^]ProcName [([IN] type1 paramName1[,paramName2, ...] [IN] type2 paramName3]...)]
; akcie
END ProcName
[IMPLEMENTATION] RPCX PROCEDURE [ESLInterface^]ProcName [([IN] type1 paramName1[,paramName2, ...] [IN] type2 paramName3]...)]
; akcie
END ProcName
Deklarácia pre volanie do UNITu
PUBLIC PROCEDURE ProcName [([IN] type1 paramName1[,paramName2, ...] [IN] type2 paramName3]...)]
; akcie
END ProcNameParametre
procname | in | Meno procedúry (musí vyhovovať pravidlám pre meno objektu). |
type1, type2, ..., type10 | in | Typ prvého (druhého, tretieho, ..., desiateho) formálneho parametra. |
paramName1, paramName2, ..., paramName10 | in | Meno prvého (druhého, tretieho, ..., desiateho) formálneho parametra. |
Popis
Akcia uvádza procedúru (hlavička procedúry) s menom ProcName. Meno procedúry musí byť v rámci skriptu jednoznačné. Hlavička procedúry sa môže nachádzať pred inicializačnou časťou skriptu mimo inej procedúry (vnorené procedúry nie sú podporené).
Procedúra môže obsahovať neobmedzený počet parametrov. Každý parameter v tele procedúry predstavuje lokálnu premennú (v deklarácii má uvedené meno aj typ). Ak je pred typom v deklarácii parametra uvedené kľúčové slovo IN, lokálna premenná je chápaná ako vstupná hodnota (prípadné zmeny jej hodnoty neovplyvnia hodnotu parametra po ukončení procedúry). Parametre bez kľúčového slova IN sú vstupno-výstupné.
Procedúra musí byť ukončená akciou END ProcName.
Možné typy formálnych parametrov procedúry:
Príklady - jednotlivé typy formálnych parametrov:
Typ formálneho parametra | Popis parametra | Príklad |
NTC | Konštanta typu Int, Bool, ..., ako parameter nie je prípustná. |
|
NT | Premenná typu Int, Bool, Real, Time, Text. | INT _paramInt |
AN | Netypový ALIAS. | ALIAS _an |
AT | Typový ALIAS. | ALIAS (SD.RecordDef) _at |
RN | Štruktúra bez odkazov na objekty. | RECORD NOALIAS (SD.RecordDef) _rn |
R | Štruktúra. | RECORD (SD.RecordDef) _rn |
Pri volaní procedúry akciou CALL sa na miesto formálneho parametra dosadí skutočný parameter. Pri formálnom parametri typu NT, prebehne typová konverzia medzi skutočným->formálnym->skutočným parametrom. Pre jednotlivé typy formálnych parametrov sú prípustné nasledovné kombinácie skutočných parametrov:
Kategória parametra | Formálny parameter | ||||
NT | AN | AT | RN | R | |
IC_C | IN | - | - | - | - |
IC_HBJ_EXPR | IN | IN | - | - | - |
IC_L |
| - | - | - | - |
IC_L_CONST | IN | - | - | - | - |
IC_L_AN |
|
| - | - | - |
IC_L_AT_RIA |
|
| - | - | - |
IC_L_AT_RIN |
| - | - | - | - |
IC_L_AT_R | - | - | - |
|
|
IC_L_AT | - | IN |
| - | - |
IC_L_R_RIA |
|
| - | - | - |
IC_L_R_RIN |
| - | - | - | - |
IC_L_R_R | - | - | - |
|
|
IC_L_R | - | - | - |
|
|
IC_L_RNA_RIA |
| - | - | - | - |
IC_L_RNA_RIN |
| - | - | - | - |
IC_L_RNA_R | - | - | - |
| - |
IC_L_RNA | - | - | - |
| - |
IC_O |
| IN | - | - | - |
IC_O_R_RIA |
|
| - | - | - |
IC_O_R_RIN |
| - | - | - | - |
IC_O_R_R | - | - | - |
|
|
IC_O_R | - | - | - |
|
|
IC_L_NR_R | - | - | - |
|
|
IC_L_NR | - | - | - |
|
|
IC_L_NRNA_R | - | - | - |
| - |
IC_L_NRNA | - | - | - |
| - |
Zelené políčko označuje prípustnú kombináciu formálneho a skutočného parametra.
Políčko s textom IN označuje nutnosť deklarovať formálny parameter ako vstupný (kľúčové slovo IN).
Činnosť so skutočným a formálnym parametrom pri volaní a návrate z procedúry:
Typ formálneho parametra | Skutočný parameter | Formálny parameter | |
| Volanie | Návrat* | Volanie |
NT | Čítanie hodnoty. | Nastavenie hodnoty. | Nastavenie hodnoty podľa parametra. |
AN | Prečítanie odkazu na objekt (nie hodnoty objektu). | Nastavenie odkazu na objekt (nie hodnoty). | Nastavenie odkazu na objekt podľa parametra, ktorý je tiež odkaz. |
AT | Prečítanie odkazu na objekt (nie hodnoty objektu). | Nastavenie odkazu na objekt (nie hodnoty). | Nastavenie odkazu na objekt podľa parametra, ktorý je tiež odkaz. |
RN | Čítanie hodnoty (riadok alebo celá štruktúra). | REDIM parametra podľa potreby (ak je index = 0 a skutočný parameter je lokálna premenná) a nastavenie hodnoty. | REDIM parametra podľa potreby a nastavenie hodnoty. |
R | Čítanie hodnoty (riadok alebo celá štruktúra). | REDIM parametra podľa potreby (ak je index = 0 a skutočný parameter je lokálna premenná) a nastavenie hodnoty. | REDIM parametra podľa potreby a nastavenie hodnoty. |
* len v prípade IN OUT parametra
Procedúru deklarovanú s kľúčovým slovom RPC je možné volať z iných ESL skriptov prostredníctvom vzdialeného volania. Pre RPC procedúry sú prípustné typy formálnych parametrov NT a RN.
Vykonávanie server eventu (alebo skriptu) prebieha na jednej inštancii. Preto súčasné volanie RPC procedúry viacerými inými udalosťami alebo skriptami je serializované a požiadavky sa spracovávajú postupne prostredníctvom fronty požiadaviek.
Ak je vzdialená procedúra deklarovaná kľúčovým slovom RPCX, všetky požiadavky na vykonanie tejto procedúry sú vyradené z fronty pri príchode novej požiadavky. Výsledné správanie je potom také, že vo fronte neexistujú súčasne dve požiadavky na vykonanie procedúry deklarovanej ako RPCX. Z pohľadu volajúceho, vyradenie požiadavky z fronty znamená ukončenie vzdialeného volania (CALL) s chybou.
Kľúčové slovo IMPLEMENTATION je použité vtedy, ak procedúra implementuje určitú procedúru z objektu ESL Interface. Meno príslušného objektu je uvedené ako prefix mena procedúry, ktorý je oddelený znakom ^.
Kľúčové slovo PUBLIC je použité vtedy, ak je procedúra súčasťou eventu typu UNIT. Takýto typ procedúry je dovolené volať iba zo skriptu, v ktorom je daný UNIT definovaný (deklarovaný) (volanie Public procedúr).
Pomocou RPC procedúr je možný prenos dátových kontajnerov a handle na databázové spojenia.
Formálny parameter procedúry NETYPOVÝ RECORD
Ak pri deklarácii formálneho parametra procedúry typu RECORD neurčíme typ štruktúry (RECORD NOALIAS () _rec), vznikne netypový record. Netypovému recordu určí typ skutočný parameter vstupujúci do procedúry pomocou akcie CALL pri volaní procedúry.
HBJ definície štruktúry netypového recordu je možné zistiť pomocou ESL funkcie %GetRecordStructHBJ (IN recordVal) (_hbj := % GetRecordStructHBJ(_rec\HBJ)).
Príklad
PROCEDURE Proc1(RECORD NOALIAS () _arr)
INT _iHbj
_iHbj := %GetRecordStructHBJ(_arr\HBJ)
; ....
; ....
; ....
REDIM _arr[ _arr\DIM + 1 ]
END
BEGIN
RECORD NOALIAS (SD.RecordDef) _arr1
; ....
; Nastavenie hodnoty lokálnej premennej _arr1 podľa hodnoty objektu
; SV.Struktura
REDIM _arr1[SV.Struktura\DIM]
SET _arr1 WITH SV.Struktura
CALL Proc1(_arr1)
END
Deklarácia procedúry a jej volanie s dvoma vstupnými a jedným výstupným parametrom:
PROCEDURE Scitaj(IN INT _p1, IN INT _p2, INT _v)
_v := _p1 + _p2
_p2:= _p2 + _p2
END Scitaj
BEGIN
INT _a = 3
INT _b = 2
INT _c
CALL Scitaj(_a, _b, _c)
END
Procedúra sčíta dva vstupné parametre _p1 a _p2 typu INT. Výsledok uloží do vstupno-výstupného parametra _v typu INT. Po návrate z procedúry bude parameter _c nastavený na súčet hodnôt parametrov _a a _b. Hodnota parametra _b nebude zmenená akciou (_p2 := _p2 + _p2), lebo _p2 je vstupný parameter a jeho zmeny sa nebudú zverejňovať.
Procedúry je možné volať rekurzívne (procedúru z procedúry).
Deklarácia procedúry s parametrom typu štruktúra:
PROCEDURE Proc1(RECORD NOALIAS (SD.RecordDef) _arr)
; ....
; ....
; ....
REDIM _arr[_arr+1]
END Proc1
BEGIN
RECORD NOALIAS (SD.RecordDef) _arr1
; ....
; Nastavenie hodnoty lokálnej premennej _arr1 podľa hodnoty objektu
; SV.Struktura
REDIM _arr1[SV.Struktura\DIM]
SET _arr1 WITH SV.Struktura
CALL Proc1(_arr1)
END
Volanie CALL v príklade prebieha v nasledovných krokoch:
Vyhodnotenie indexu riadku skutočného parametra (v tomto prípade 0 => celá hodnota objektu).
Prečítanie hodnoty skutočného parametra _arr1.
Zmena rozmeru formálneho parametra podľa potreby: REDIM _arr[_arr1\DIM].
Naplnenie formálneho parametra: SET _arr WITH _arr1.
Návrat z procedúry Proc1 podobne:
Prečítanie hodnoty formálneho parametra _arr.
Vyhodnotenie indexu riadku skutočného parametra (v tomto prípade 0 => celá hodnota objektu).
Zmena rozmeru formálneho parametra podľa potreby: REDIM _arr1[_arr\DIM].