SET AS [DIRECT]
Akcia SET AS [DIRECT]
Funkcia
Zmena priradenia (asociovania) objektu s:
lokálnou premennou typu ALIAS,
položkou štruktúry typu Objekt (odkaz na objekt):
pre lokálne premenné typu Record alebo typový ALIAS,
pre objekty typu Štruktúrovaná premenná.
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:
Record
ALIAS
objekt typu Štruktúrovaná premenná
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:
objektov typu Štruktúrovaná premenná,
lokálnych premenných typu Record (bez modifikátora NOALIAS).
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:
dstIdent - políčko typu Objekt lokálnej premennej typu Record, lokálnej premennej typový ALIAS alebo objektu typu Štruktúrovaná premenná.
srcIdent - políčko objektu typu Štruktúrovaná premenná.
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.
Súvisiace stránky: