PROCEDURE

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 ProcName

Parametre

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:

  1. Vyhodnotenie indexu riadku skutočného parametra (v tomto prípade 0 => celá hodnota objektu).

  2. Prečítanie hodnoty skutočného parametra _arr1.

  3. Zmena rozmeru formálneho parametra podľa potreby: REDIM _arr[_arr1\DIM].

  4. Naplnenie formálneho parametra: SET _arr WITH _arr1.

Návrat z procedúry Proc1 podobne:

  1. Prečítanie hodnoty formálneho parametra _arr.

  2. Vyhodnotenie indexu riadku skutočného parametra (v tomto prípade 0 => celá hodnota objektu).

  3. Zmena rozmeru formálneho parametra podľa potreby: REDIM _arr1[_arr\DIM].

  4. Naplnenie formálneho parametra: SET _arr1 WITH _arr.

Ak pri volaní nie je uvedený index pri skutočnom parametri (štruktúrovaná premenná alebo objekt typu Štruktúra), pracuje sa s celou hodnotou. Toto platí tiež vtedy, ak je uvedený index, ktorý nadobudne hodnotu = 0 (nesmie byť prístup na položku).
Výnimkou je skutočný parameter typu IC_L_AT. Tento je bez indexu a prístupu na položku chápaný ako odkaz na objekt typu Štruktúrovaná premenná, nie ako jeho hodnota.

Dokumentácia

Komentáre priamo nad deklaráciou procedúry (nesmú byť oddelené ani prázdnym riadkom) vytvárajú dokumentáciu procedúry.  Dokumentácia sa môže skladať z viacerých riadkov komentárov, pričom popis funkcie tvorí všetko od začiatku bloku komentárov po prvý znak @, alebo po koniec bloku komentárov, ak sa znak @ v komentároch nenachádza. Popis parametrov sa značí @Param _názovParametra - , pričom popis parametra tvorí všetko za znakom až po ďalší znak @, alebo po koniec bloku komentárov. Príklad:

; Test je procedúra s dokumentáciou ; na viac riadkov ; ; @Param _a - popis parametra a ; @Param _b - popis parametra b ; na viac riadkov PROCEDURE Test(IN BOOL _a, INT _b) END Test

Popis procedúry bude:

"Test je procedúra s dokumentáciou

na viac riadkov"

Popis parametra _a bude:

"popis parametra a"

Popis parametra _b bude:

"popis parametra b

 na viac riadkov"

Dokumentáciu je možné v ESL editore vygenerovať kliknutím ľavého tlačidla myši na meno procedúry a vybratím možnosti "Vytvoriť dokumentáciu pre ..." z ponúknutého menu pod ikonkou žiarovky. Dokumentácia danej procedúry sa zobrazí pri prechode kurzorom nad názvom procedúry pri jej volaní "CALL názovProc(...)". Pre RPC procedúry je možné vygenerovať OpenAPI špecifikáciu do YAML súboru pomocou tell príkazu GENERATEYAML.