Výběrové a specifikační uzly

Struktura dokumentů a jejich segmentů je navržena nejen pro oddělené ukládání informací různých typů, ale i pro jejich vzájemné sdílení mezi dokumenty. Dochází tak například k tomu, že dokument zastupce_subjektu ve své oblasti adresa_kancelare využívá prvků (tedy dat) z oblasti adresa_pobocky z dokumentu subjekt. Je to proto, že v případě přestěhování subjektu na jinou adresu – a zaznamenání této skutečnosti v evidenci subjektu – je zapotřebí, aby i všichni zástupci tohoto subjektu měli automaticky upravenu kontaktní adresu v evidenci zástupců.

Je patrné, že zde dochází k výběru jednoho dokumentu pro účely dokumentu jiného. Tj. že v rámci dokumentu zastupce_subjektu dochází k výběru zdrojového dokumentu subjekt jehož je daná osoba zástupcem. Hovoříme zde o tzv. výběrovém uzlu dokumentu zastupce_subjektu.

Pokud bychom ještě uvážili situaci, kdy subjekt má možnost více poboček, pak je jasné, že oblast pobocka, která obsahuje podoblast adresa_pobocky je opakovatelná (tj. má atribut repeat nastaven na hodnotu user). Pak je také zřejmé, že u zástupce subjektu je zapotřebí nejen vybrat dokument subjekt, ale také dále specifikovat pobočku, ve které působí (čili vybrat patřičné opakování oblasti pobocka). V takovém případě hovoříme o tzv. specifikačním uzlu dokumentu zastupce_subjektu.

O výběru tedy hovoříme v případě volby zdrojového dokumentu a o specifikaci hovoříme v případě volby opakování zdrojového segmentu již vybraného dokumentu.

Může samozřejmě nastat i situace, kdy jeden uzel dokumentu bude uzlem výběrovým a zároveň i uzlem specifikačním. V našem případě by to nastalo tehdy, když oblast adresa_kancelare v dokumentu zastupce_subjektu bude jeho kmenovou oblastí a ve zdrojovém dokumentu bude oblast adresy vůči dokumentu subjekt opakovatelnou a tedy je zapotřebí specifikace. Situace by naopak nenastala, pokud oblast adresa_kancelare je potomkem oblasti subjekt_zastupce, která je výběrovým uzlem zdrojového dokumentu subjekt.


Klíče uzlů

Je logicky odvoditelné, že je tu potřeba ukládat identifikační klíč vybraného nebo i specifikovaného zdroje. Pokud uživatel na straně klienta vybere a případně i specifikuje požadovaný zdroj dochází k uložení klíče do XML atributu u tagu výběrového uzlu. V případě výběrového uzlu jde o atribut s názvem fdk (foreign document key) a v případě specifikace zdrojového opakování jde o atribut fsk (foreign segment key). Tento atribut se pak při rozkládání dokumentu do databáze vloží do pole s názvem fsk? či fdk?, kde znak "?" obsahuje pořadovou číslici od 1. Je odvoditelné, že v jedné tabulce může být více fsk i fdk klíčů, a proto jsou dále odlišeny pořadovou číslicí. To nastává v případě, že jeden dokument čerpá informace z různých dokumentů v různých segmentech, které mají vzájemný vztah 1:1. Například náš dokument zastupce_subjektu bude vedle cizí oblasti adresa_subjektu bude mít i jinou cizí oblast privátní_adresa_osoby, která bude vybírat data z dokumentu osoba kde mohou být evidovány všechny personální informace o lidech využívané v dalších dokumentech. To jaké fsk či jaké fdk je přiřazeno konkrétnímu výběrovému uzlu je specifikováno pomocí atributu xds-id v mapě DAD.

U klíčů opakování segmentu zdrojového dokumentu (fsk) může dojít k tomu, že opakovatelný je nejen vlastní odkazovaný segment nebo jeho rodič, ale že opakovatelný je jak odkazovaný segment, tak i jeho rodič. V našem příkladu se tak může stát, že v dokumentu subjekt bude opakovatelná nejen oblast pobocka, ale i přímo odkazovaná adresa adresa_pobocky. V takovém případě vlastně výběrem jedné položky adresy zároveň vybíráme nejen tuto adresu pobočky, ale také i zdrojovou rodičovskou oblast samotné pobočky. Určujeme tak vlastně dva klíče zdroje. Ale vzhledem k jednoznačně určenému rodiči zdrojové adresy je klíčem adresy dán i klíč pobočky a v dokumentu zástupce se tedy ukládá i v takovém případě pouze jeden klíč – klíč nejvíce vnořeného opakování – klíč adresy pobočky.


Klíče nových položek

Uživatel má, vzhledem k povaze pořizovacích formulářů, možnost pro zástupce nejen vybrat subjekt ze stávající evidence subjektů, ale také zadat subjekt nový, který bude do databáze zaveden v jedné transakci spolu se zavedením zástupce subjektu, který jej bude využívat. Tato varianta je rovněž indikována pomocí klíče vybrané položky. Klíč položky, která dosud není v databázi zavedena začínáná znakem "#". Po tomto znaku následuje číslo sloužící jako dočasná evidence pro účely programu na straně klienta.

Ve chvíli, kdy server dostane požadavek na uložení dokumentu jež využívá dat jiného dokumentu a klíč vybraného dokumentu začíná křížkem, pak se zdroj takto označené části zavede jako nová položka. Této položce server přidělí nový klíč dle své vlastní evidence (bez jakékoli souvislosti s číslem obsaženým za křížkem) a tento klíč uloží rovněž do cizího klíče dokumentu, který nově zavedeného zdroje využívá.

Tohoto mechanismu je využíváno jak pro výběrové, tak i pro specifikační uzly. Křížkem tedy může začínat jak atribut fsk, tak i atribut fdk. V našem příkladu tedy může uživatel pomocí dokumentu zastupce_subjektu přidat jednak pobočku či adresu u existujícího subjektu nebo může přidat celý dokument subjekt i s novými položkami pobočky a adresy.


Mechanismy propojení a chování klíče

Existují dva základní mechanismy propojení zdroje foreign a initial. Tyto mechanismy jsou dány atributem source v definici XDS každého jednotlivého segmentu dokumentu – tj. oblasti i prvku (viz. soubor Databázové vlastnosti v XDS.doc).

Pokud má nějaký prvek určenu metodu zdroje foreign (s patřičným odkazem), pak to znamená, že údaj zapsaný do prvku se ve skutečnosti uloží do odkazovanéh prvku odkazovaného dokumentu. Naopak u metody initial (která má stejný odkaz jako foreign) se hodnota uloží do samostatného políčka, které je pro tento prvek v tomto dokumentu vytvořeno, ale je tu možnost načíst hodnotu z odkazovaného prvku odkazovaného dokumentu s tím, že se stejně jako u foregin uloží patřičný klíč, dle kterého je možné zdroj načtení dohledat. Vzniká tedy i zde určitá souvislost se zdrojovým dokumentem.

Metody initial se využije ve chvíli, kdy nechceme, aby změna zdrojového dokumentu ovlivnila obsah hotového dokumentu, který tento zdrojový dokument datově využívá. Například tak můžeme mít dokument faktura, který čerpá údaje, jako je jméno odběratele, adresa atd. z dokumentu subjekt. Ve chvíli, kdy se subjekt přestěhuje, pak chceme, aby údaje ve starých fakturách zůstaly nezměněny a nová adresa aby se využívala jen pro faktury nově vystavované. Tato potřeba zadokumentování a zachování stavu vyvolává nutnost duplicitního úložiště údajů, které je zabezpečeno popsanou metodou initial. Vedle metod foreign a intial jsou v popisu zdroje ještě možnosti own a count, které ovšem nepropojují dokumenty a proto je zde nebudeme popisovat. Jen se krátce zmíním o vlastnosti count, která se rozkládá do dvou polí (viz. DAD). Jedno z těcho polí je logická hodnota a druhé je vlastní hodnota s obsahem prvku. Logická hodnota ukládá skutečnost, zda došlo k ruční korektuře vypočítaného údaje – to však pro server není podstatné. Podstatné je, že tato logická hodnota se do tagu ukládá jako atribut s názvem "manual" a může obsahovat textovou hodnotu "true" nebo "false".

Jak již bylo řečeno, obě metody propojení (initial a foreign) ukládají klíč fdk a případně i klíč fsk. Oba tyto klíče mohou v XML dokumentu na místo obbsažení hodnoty klíče být prázdné (tj. obsahují prázdný řetězec "") nebo mohou obsahovat požadavek na tvorbu nové položky v databázi. Klíče, jejichž atributy jsou u výběrových uzlů v datových XML dokumentech vždy uvedeny, nabízejí tři možnosti obsahu:

platné číslo klíče (např. "123")

požadavek na tvorbu nové položky (např. "#123")

mají prázdný obsah ("")

V kombinaci se dvěma metodami propojení mohou vytvářet různé způsoby chování (celkem šest možností chování) při požadavku na uložení obsažených prvků. Podívejme se na to, co se děje v případě požadavku na uložení prvku, který má definovánu metodu zdroje a jeho klíč nebo klíč jeho rodiče spadá do jedné z výše uvedených tří kategorií:

fdk="123" + metoda foreign

- data se uloží do odkazovaného zdroje a změní tak obsah jedné existující položky

fdk="#123" + metoda foreign

- je vytvořen nový zdrojový dokument a do něj je obsah prvku uložen dle odkazu

fdk="" + metoda foreign

- nevznikne žádný zdrojový dokument – případné změny prvku jsou ignorovány (nemělo by k nim dojít)

fdk="123" + metoda initial

- data se uloží do pole vyhrazené ukládanému dokumentu (zdrojový odkaz zůstane zachován)

fdk="#123" + metoda initial

- je vytvořen nový zdrojový dokument a do něj je obsah prvku uložen dle odkazu; data jsou rovněž uložena do pole v tomto dokumentu

fdk="" + metoda initial

- případné změny prvku se uloží do pole ukládaného dokumentu

Podobným způsobem je možné popsat chování u klíče zdrojového opakování fsk:

fsk="123" + metoda foreign

- data se uloží do odkazovaného zdroje a změní tak obsah jedné existující položky

fsk="#123" + metoda foreign

- je vytvořeno nové opakování ve zdrojovém dokumentu a do něj je obsah prvku uložen dle odkazu

fsk="" + metoda foreign

- nevznikne žádný zdrojový dokument ani nové opakování – případné změny prvku jsou ignorovány (nemělo by k nim dojít)

fsk="123" + metoda initial

- data se uloží do pole vyhrazené ukládanému dokumentu (zdrojový opakovatelný odkaz zůstane zachován)

fsk="#123" + metoda initial

- je vytvořeno nové opakování zdrojového dokumentu a do něj je obsah prvku uložen dle odkazu; data jsou rovněž uložena do pole v tomto dokumentu

fsk="" + metoda initial

- případné změny prvku se uloží do pole ukládaného dokumentu


Indikace uzlů v XDS

V XDS na základě tvorby DAD (dle atributu source) jsou následně vyznačeny všechny výběrové i specifikační uzly pomocí odpovídajících atributů. Následuje jejich výčet a význam:

select-node

možnosti: select, specify nebo both

- určuje zda jde o výběrový uzel (určující fdk), specifikační uzel (určuje fsk) nebo obojí;

- je uveden jen u výběrových či specifikačních uzlů (ne u jejich potomků); pokud není tento atribut u segmentu dokumentu uveden, pak tento segment není ani výběrovým ani specifikačním uzlem.

select-num

možnosti: celé číslo

- obsahuje identifikační číslo výběrového uzlu.

- atribut je uveden u výběrového uzlu i u všech potomků, které jsou výběrem ovlivněny (tj. mají stejný cizí zdroj)

specific-num

možnosti: celé číslo

- obsahuje identifikační číslo specifikačního uzlu.

- atribut je uveden u specifikačního uzlu i u všech potomků, které jsou specifikací ovlivněny (tj. mají stejný cizí zdroj) pokud nenastala další specifikace

multi-specific

možnosti: true nebo false

- určuje zda se jedná o multispecifikaci (případ s čerpáním opakovatelné adresy z opakovatelné pobočky – viz. začátek kapitoly)

- je uveden jen u specifikačních uzlů (ne u jejich potomků)


Registrování změn klíčů

V dokumentu jsou změněné prvky (tj. pojmenované uzly s textem, které již neobsahují žádné jiné uzly kromě tohoto textu) označeny atributem changed="true". Od serveru je očekáváno, že po odeslání patřičného požadavku save-dokument uloží jen tyto změněné údaje a ostatní ponechá. Případně je ještě očekáváno uložení nových opakování, tj. kde skey="#…" (skey ~ segment-key), jak již bylo uvedeno výše.

Podobně jako prvky mají indikovánu změnu obsahu pomocí atributu changed (true/false), mají i obsahy cizích klíčů výběrových uzlů (fdk a fsk) indikovánu změnu, pokud k ní dojde (tj. pokud dojde k výběru dokumentu – fdk či jeho opakování – fsk) Změna klíče je indikována pomocí atributu change-key, který může nabývat hodnot "true" nebo "false". Hodnota "true" označuje skutečnost, že obsah jednoho nebo více klíčů v daném tagu (výběrovém uzlu) byl změněn. Server pak tuto změnu patřičným způsobem zaregistruje.


Vztah opakovatelnosti depend a typu zdrojeVýběrové a specifikační uzly