Akcia CALL - vzdialené volanie procedúr

Akcia CALL pre vzdialené volanie procedúr umožňuje volať procedúry, ktoré sú implementované v:

  • skripte objektu typu Event, ktorý musí byť typu Server event,
  • skripte aktívnej schémy (alebo podschémy),
  • procese JAPI.


Volanie vzdialenej procedúry môže prebiehať nasledovne:

  • synchrónne - akcia CALL počká na ukončenie vykonávania vzdialenej procedúry a modifikované vstupno-výstupné parametre budú aktualizované. Ak je akcia CALL zapísaná formou výrazu (_i := CALL ...) je možné zisťovať prípadnú neošetrenú chybu (výnimku), ktorá vznikla v rámci volanej procedúry. Synchrónne volania môžu vyvolať deadlock (uviaznutie). Dialóg s chybovým hlásením obsahuje úplnú postupnosť volaní (akcie CALL), ktoré viedli k deadlocku.
  • asynchrónne - akcia CALL generuje len požiadavku na vykonanie vzdialenej procedúry (nečaká na jej ukončenie). Pri takomto volaní neexistuje možnosť kontroly vykonania procedúry.
    Asynchrónne je možné volať:
    • RPC procedúru v konkrétnom skripte na konkrétnom procese,
    • RPC procedúru v skriptoch (objekty typu Event (označené ako "Server event") alebo Schéma), ktoré sú aktívne na všetkých bežiacich procesoch (BROADCAST) D2000 HI alebo D2000 Event Handler,
    • proces JAPI .

Deklarácia vzdialenej procedúry musí začínať kľúčovým slovom RPC.


Deklarácia - synchrónne volanie
[_ret :=] CALL [objIdent] ProcName [(paramIdent1 [,paramIdent2]...)] [SYNC] [ON procIdent [INSTANCE instanceExpr]] [PRTY exprIntPrty]
 


 


Deklarácia - asynchrónne volanie
 CALL [objIdent] ProcName [(paramIdent1 [,paramIdent2]...)]  ASYNC [ON procIdent [INSTANCE instanceExpr]] [PRTY exprIntPrty]
 


 


Deklarácia - asynchrónne volanie BROADCAST


 CALL [objIdent] ProcName [(paramIdent1 [,paramIdent2]...)]  ASYNC ON ALL [PRTY prtyIdent]
 


 


Deklarácia - synchrónne volanie Klient a Server konfigurácia
[_ret :=] CALL [] ProcName [(paramIdent1 [,paramIdent2]...)] [SYNC] [ON procIdent [INSTANCE instanceExpr]] [PRTY exprIntPrty]
Parametre
ProcnameinMeno procedúry (musí vyhovovať pravidlám pre meno objektu).
paramIdent1, paramIdent2, ..., paramIdentNinIdentifikátor hodnoty pre prvý (druhý, tretí, ..., N-tý) parameter.
Počet parametrov musí byť zhodný s počtom parametrov volanej procedúry.
objIdentin
  • Identifikátor objektu (schémy alebo systémového server eventu), ktorý obsahuje skript s danou procedúrou.
  • Lokálna premenná, ktorej hodnota je zhodná s hodnotou premennej typu RefId, ktorá je pripojená ku grafickému objektu typu Schéma (volanie procedúry podschémy).
  • Pri volaní RPC z Lokálneho skriptu do Remote skriptu (HIS Server) sa identifikátor objIdent vynecháva.
  • Pri volaní procesu JAPI, musí byť odkaz na objekt prázdny (pozri príklad).
procIdentinIdentifikátor procesu, kde sa objekt objIdent nachádza (napr. SELF.EVH, SELF.HIP alebo WS_BC.HIP).
Pokiaľ je akcia CALL použitá v rámci schémy, tak preddefinovaná premenná _FROM_HIP udáva identifikátor procesu HI, v ktorom je schéma otvorená.
instanceExprinNepovinný výraz typu Int. Adresuje pri volaní procedúry určitú inštanciu.
prtyIdent
inIdentifikátor typu Int. Určuje prioritu vykonania RPC procedúry. Parameter môže nadobúdať hodnotu z intervalu: <Integer'Range> (-2147483648 to 2147483647). Ak parameter nie je zadaný, jeho preddefinovaná hodnota je 0. Prednostne spracovaná procedúra je procedúra s vyššou prioritou (s vyšším číslom).
Popis
Akcia CALL vykoná volanie RPC (RPCX) procedúry s menom ProcName. Za menom procedúry nasleduje v zátvorkách zoznam parametrov oddelených čiarkami.
Počet (a typy) parametrov musia byť zhodné s počtom parametrov volanej procedúry (ak nie je zhodný počet parametrov je generovaná výnimka _ERR_INV_NUM_PARAMS*).
Ak je niektorý parameter v deklarácii procedúry označený ak vstupno-výstupný, zodpovedajúci parameter pri volaní procedúry nesmie byť konštanta (v prípade chyby je generovaná výnimka _ERR_SET_CONST).
Parameter procIdent je odkaz na objekt typu Proces, na ktorom je objekt objIdent otvorený. Pre objekt typu Event je to proces D2000 EventHandler, ktorý je jeho rodičom (parent) alebo proces, na ktorom je volaný Event otvorený (akcia OPENEVENT). Pre objekt typu D2000 HI, v ktorom je schéma otvorená.
Ak zadaný proces nemá otvorený žiadaný objekt, event generuje chybu _ERR_OBJECT_NOT_FOUND*.

Parameter INSTANCE určuje číslo inštancie objektu (schémy alebo eventu).

Ak je pre identifikátor objIdent použitá lokálna premenná typu RefId, parametre INSTANCE a ON nie sú prípustné (ich hodnoty sú dané kontextom volania).

Ak sa volá RPC procedúra medzi Lokálnou a Remote časťou "Klient a server" konfigurácie eventu (HIS Server), identifikátor objIdent sa vynecháva.
 CALL [] ProcName [(paramIdent1 [,paramIdent2]...)] ...


Chyby označené znakom * sú generované na strane volaného skriptu. Volajúci skript (akcia CALL) túto chybu môže zistiť jedine pri synchrónnom volaní a pri zápise akcie s priradením. Ak nastane chyba, jej kód bude naplnený do premennej _ret ktorá musí byť typu INT.

Možné typy parametrov: pozri akciu PROCEDURE.

Volanie typu BROADCAST je povinne asynchrónne. Ako meno procesu (parameter procIdent) sa uvedie kľúčové slovo ALL.
Pri vykonávaní takéhoto volania systém automaticky distribuuje požiadavku na vykonanie procedúry na všetky bežiace procesy D2000 HI alebo D2000 EventHandler. Tieto procesy vyhľadajú všetky inštancie (alebo základné objekty) skriptov, ktoré sú identifikované parametrom objIdent a generujú pre ne požiadavky na vykonanie procedúry ProcName s príslušnými parametrami.
Kľúčové slovo INSTANCE nie je pri tomto type volania povolené. 

Od verzie V8.00.008 R9 má akcia CALL implementovanú optimalizáciu prenosu formálnych parametrov. Táto optimalizácia zabezpečí, že formálny parameter RPC procedúry bude "odkaz" na skutočný parameter. Priamy dôsledok je podstatné zvýšenie rýchlosti volania RPC procedúr.
Podmienky:

  • volanie prebieha na rovnakom procese *.EVH,
  • volanie procedúry je synchrónne,
  • parameter musí byť typu Record
  • parameter musí byť IN/OUT.
Kľúčové slovo PRTY umožňuje zadanie priority vykonania RPC procedúry. Táto vlastnosť zabezpečí prioritné vykonanie RPC procedúry. Priorita je zadaná parametrom prtyIdent za kľúčovým slovom PRTY.

Pomocou RPC procedúr je možný prenos dátových kontajnerov a handle na databázové spojenia.

Pri volaní procesu JAPI platia nasledujúce pravidlá:
  • parameter objIdent je prázdny objekt (pozri príklad),
  • nie je možné použiť kľúčové slovo INSTANCE,
  • nie je možné volať RPC procedúru, ktorá je implementáciou ESL Interface,
  • identifikátor procesu (procIdent) musí byť typu IC_HOBJ_EXPR (výraz typu HOBJ),
  • príjem volaní na strane procesu JAPI musí byť implementovaný ako listener registrovaný metódou D2Session::setRPCListener.
Príklad
Synchrónne volanie vzdialenej procedúry systémového eventu:


 


 INT _i
 TEXT _personName
 _personName := "Peter"
 _i  := CALL [E.Work] AddPerson(_personName) SYNC ON SELF.EVH
 IF _i # _ERR_NO_ERROR THEN
   ; chyba pri volaní vzdialenej procedúry
 ENDIF 
 


Asynchrónne volanie vzdialenej procedúry aktívnej schémy:


 


 TEXT _msg
 _msg := " ... "
 CALL [S.Picture] SendMessage(_msg) ASYNC ON _FROM_HIP 
 


Asynchrónne volanie vzdialenej procedúry aktívnej schémy:


 


 TEXT _msg
 _msg := " ... "
 CALL [_podSchema] SendMessage(_msg) ASYNC 
 


Synchrónne volanie vzdialenej procedúry, ktorú implementuje:
 


 TEXT _msg
 INT _hbj 
 _msg := " ... "
 _hbj := ...... hodnota získaná napríklad pri volaní RPC procedúry z JAPI klienta, kde jeden z parametrov je HOBJ príslušného procesu JAPI.
 CALL [(0)] SendMessage(_msg) SYNC ON (_hbj) 
 


Asynchrónne volanie BROADCAST:


 


 CALL [E.BROADCAST_RECEIVER] Broadcast(1) ASYNC ON ALL 
 


Synchrónne volanie vzdialenej procedúry so zadanou prioritou:


 


INT _i
 INT _prty 
 TEXT _personName
 
  _personName := "Peter"
  _prty := 100
 _i := CALL [E.Work] AddPerson(_personName) SYNC ON SELF.EVH PRTY _prty
 IF _i # _ERR_NO_ERROR THEN
 ; chyba pri volaní vzdialenej procedúry
 ENDIF 
 


Synchrónne volanie vzdialenej procedúry z Lokálneho do Remote skriptu:


 


 INT _i
 TEXT _personName
 _personName := "Peter"
 _i := CALL [] AddPerson(_personName) SYNC ON SELF.HIP
 IF _i # _ERR_NO_ERROR THEN
 ; chyba pri volaní vzdialenej procedúry
 ENDIF 
Poznámka
Volaná vzdialená procedúra musí byť ukončená akciou RETURN, alebo END MenoProcedury. V opačnom prípade nie je možné aktualizovať prípadné vstupno-výstupné parametre. Pri synchrónnom volaní s priradením je návratová hodnota nastavená na chybu _ERR_MISSING_RETURN.
Write a comment...