Akcia SET AS [DIRECT]


Funkcia
Zmena priradenia (asociovania) objektu s:
Deklarácia
SET dstIdent AS srcIdent [DIRECT]

Parametre
dstIdent in Identifikátor hodnoty typu ALIAS (alebo typu Objekt v prípade položky štruktúry), identifikátor riadku alebo celej štruktúry - cieľ hodnôt a asociácií.
srcIdent in Identifikátor hodnoty typu ALIAS (alebo typu Objekt v prípade položky štruktúry), identifikátor riadku alebo celej štruktúry - zdroj hodnôt a asociácií.

Popis
Typ štruktúr definovaných parametrami dstIdent a srcIdent musí byť vždy rovnaký (ináč akcia generuje chybu _ERR_RECORD_NO_COMP) a taktiež musia mať rovnaký rozmer. Môžu byť typu: Akcia nastavuje hodnoty položiek v dstIdent_Rec hodnotami zo zodpovedajúcich položiek srcIdent_Rec. V prípade, že dstIdent_Rec je odkaz na riadok, srcIdent_Rec musí byť taktiež odkaz na riadok. Podobne, ak dstIdent_Rec je odkaz na celú hodnotu, tak aj srcIdent_Rec musí byť odkaz na celú hodnotu.

Akcia má podobné pravidlá ako akcia SET WITH.
  • Pre položky štruktúr iného typu ako Objekt (odkaz na objekt) má aj rovnakú funkciu.
  • Pre položku typu Objekt však nemá význam priradenia hodnoty, ale zmenu asociovaného (pripojeného) objektu.

Akcia umožňuje použiť index riadku 0 v nasledovnom prípade:

SET dstIdent[0]^Col1 AS srcIdent[0]^Col2 pričom

1. dstIdent je lokálna štruktúrovaná premenná a Col1 je typu Objekt
2. srcIdent je:
  • lokálna štruktúrovaná premenná a Col2 je typu Objekt,
  • typový ALIAS (ALIAS (structDef) _rA) a Col2 je typu Objekt,
  • objekt typu štruktúrovaná premenná; je možné použiť kľúčové slovo DIRECT,
    (ak Col2 nie je typu odkaz na objekt, DIRECT je povinný).

Akcia interne vykoná predpísané priradenie (SET AS) pre všetky riadky daného stĺpca.
Preto je potrebné, aby rozmery oboch štruktúr (dstIdent aj srcIdent) boli rovnaké. 


Príklad
 ALIAS _a
 INT   _i
 
 SET _a AS U.INT
 
 ; prvý test
 IF U.Int = _a THEN
 ENDIF
 
 ; druhý test
 _i := U.Int
 IF U.Int = _i THEN
 ENDIF 

 
Prvý test na zhodu hodnôt bude vždy pravdivý, lebo lokálna premenná _a typu ALIAS je "nasmerovaná" na objekt U.Int.
Výsledok druhého testu závisí od toho, či objekt U.Int nezmenil svoju hodnotu od momentu jej priradenia do _i a vykonania testu.

Zmena hodnoty:
 
 ALIAS _a
 
 SET _a AS U.INT
 _a := 1

 
Priradenie je skriptom interpretované ako priradenie hodnoty 1 do U.Int !!!.

Vlastnosti lokálnej premennej typu ALIAS sú zhodné pre položky typu Objekt: Napríklad:
 
 ALIAS _a
 
 SET _a AS U.Int
 _a := 1   ; prvé priradenie
 
 RECORD (SD.RecordDef) _lArr1
 SET _lArr1[1]^Object AS U.Int
 _lArr1[1]^Object := 1  ; druhé priradenie 

 
Prvé aj druhé priradenie majú vzhľadom na objekt U.Int rovnaký účinok.

Zmena smerovania položky typu Objekt objektu typu Štruktúrovaná premenná:


 
 SET SV.Struktura[1]^Object AS U.Int
 

 
Akcia nasmeruje položku SV.Struktura[1]^Object na objekt U.Int. Od tohoto okamihu bude hodnota položky vždy zhodná s hodnotou objektu U.Int.

Priradenie:
 
 SV.Struktura[1]^Object := 1 

 
má za následok (podobne ako pri predchádzajúcich prípadoch) priradenie hodnoty 1 do objektu U.Int.

 
 RECORD (SD.RecordDef) _lArr1
 
 REDIM _lArr1[2]
 SET _lArr1[1]^Object AS U.Int             ; priradenie 1
 SET _lArr1[2]^Object AS U.Int2            ; priradenie 2
 SET _lArr1[1]^Object AS _lArr1[2]^Object  ; priradenie 3 

 
Význam priradení 1 a 2 bol vysvetlený v predchádzajúcom texte. Priradenie 3 má v danom kontexte význam zhodný s akciou SET _lArr1[1]^Object AS U.Int2.

Alebo:
 
 SET SV.Struktura[1]^Object AS U.Int                    ; priradenie 1
 WAIT
 SET SV.Struktura[2]^Object AS U.Int2                  ; priradenie 2
 WAIT
 SET SV.Struktura[1]^Object AS SV.Struktura[2]^Object  ; priradenie 3
 WAIT 

 
Podobne ako v predchádzajúcom prípade, posledné priradenie je zhodné s priradením SET SV.Struktura[1]^Object AS U.Int2. Ako vidieť z príkladu, ide o kopírovanie odkazu(ov), ktoré sú obsiahnuté na pravej strane (identifikátor srcIdent).

Takáto konštrukcia neumožňuje nasmerovať (vytvoriť odkaz) políčko štruktúry na iné políčko štruktúry. Preto bol zavedený modifikátor DIRECT, ktorý toto umožňuje. Akcia SET AS DIRECT obmedzuje možné typy parametrov na: Napríklad:
 
 RECORD (SD.RecordDef) _lArr1
 
 REDIM _lArr1[2]
 SET _lArr1[1]^Object AS U.Int DIRECT               ; priradenie 1
 SET _lArr1[2]^Object AS U.Int2 DIRECT              ; priradenie 2
 SET _lArr1[1]^Object AS _lArr1[2]^Object DIRECT    ; priradenie 3
 SET _lArr1[1]^Object AS SV.Struktura[2]^Int DIRECT ; priradenie 4 

 
Priradenia 1, 2, 3 sú neprípustné. Priradenie 4 nasmeruje odkaz na políčko hodnoty objektu typu Štruktúrovaná premenná.

Ak je známe len HOBJ štruktúrovanej premennej, nastavenie odkazu na jej políčko sa môže vykonať nasledovným spôsobom:

SET _locRec[2]^Object AS (HOBJ, ROW, COL) DIRECT

Napríklad:


 
 ; použité objekty
  ; SD.Active: Definícia štruktúry s jedným stĺpcom typu Objekt. Meno stĺpca je "Object".
  ; SV.Active: dvojriadková štruktúrovaná premenná typu SD.Active
 RECORD (SD.Active) _b
 BOOL _bOpenOk
 

 ; vytvorenie odkazu z políčka SV.Active[1]^Object na políčko v riadku 1, stĺpec 1 objektu s jednoznačným identifikátorom 2131 (HOBJ)
 ; ak objekt 2131 nie je typu štruktúrovaná premenná alebo index riadku alebo stĺpca je mimo rozsah, akcia neprebehne úspešne
 SET SV.Active[1]^Object AS (2131, 10, 10) DIRECT
  ; neúspešný priebeh predchádzajúcej akcie generuje Run-Time error
 WAIT
 

  ; vytvorenie odkazu z políčka _b[1]^Object na políčko v riadku 2, stĺpec 1 objektu s jednoznačným identifikátorom 24623 (HOBJ)
  ; na rozdiel od predchádzajúceho príkladu, musí byť objekt 24623 otvorený
 _bOpenOk := %OpenRefToObject(24623, @TRUE)
 IF _bOpenOk THEN
 SET _b[1]^Object AS (24623, 2, 1) DIRECT
 ENDIF 

 

!!! Akcia SET SV.Struktura[1]^Object AS U.Int (podobne ako priradenie hodnoty objektu) je spracovaná na strane procesu D2000 Server. Jej efekt sa prejaví po čase, v závislosti od zaťaženia systému. Na jej skutočnú realizáciu je možné v skripte počkať akciou WAIT !!!

Akcia umožňuje zmenu hodnoty typového ALIASu.



ALIAS (SD._System_Redundancy) _aT 
 ALIAS (SD._System_Redundancy) _aT1 
 SET _aT AS SV._System_Redundancy 
 SET _aT1 AS _aT

 
Kontrola prípustnosti priradenia vzhľadom na typ štruktúry prebehne počas ukladania ESL skriptu.
Zmena hodnoty typového ALIASu bez kontroly typu počas ukladania je možná napríklad nasledovne:
 
BOOL _bOk  
 ALIAS (SD._System_Redundancy) _aT
 INT _hbj

 ; príklad 1
 _hbj := SV._System_Redundancy\HBJ 
 SET _aT AS (_hbj)

 ; príklad 2
 _hbj := %StrToHBJ("SV._System_Redundancy") 
 _bOk := %OpenRefToObject(_hbj, @TRUE) 
 SET _aT AS (_hbj)

 ; alebo príklad 3
 ALIAS _a 
 _hbj := %StrToHBJ("SV._System_Redundancy")
 _bOk := %OpenRefToObject(_hbj, @TRUE)
 SET _a AS (_hbj)
 SET _aT AS _a  

 
Kontrola priradenia prebehne až v čase vykonávania akcie a je možná len v prípade, ak príslušný ESL skript (resp. objekt, ktorý ESL skript obsahuje) má referenciu na priraďovanú štruktúrovanú premennú alebo túto referenciu skript vytvoril sám volaním funkcie %OpenRefToObject.