602SQL-Úplná dokumentace Index  

Vytknutí stejných hodnot před opakující se element

V záznamech z databáze se mohou hodnoty některých sloupců opakovat. Při výstupu do XML může být účelné:

  1. setřídit záznamy podle stejných hodnot a
  2. vytknout stejné hodnoty před opakující se element
  3. .
XML soubor tím získá kompaktnější tvar a v případě transformace do čitelné podoby bude přehlednější.

Vytknutí stejných hodnot neovlivní možnost zpětného importu dat z XML do databáze (při použití analytického DADu). Vytknuté hodnoty se po importu objeví ve všech záznamech, z nichž byly vytknuty.

Setřídění záznamů pro výstup do XML

Záznamy vystupující z databáze je třeba nejprve setřídit podle hodnot těch sloupců, které se mají případně vytknout.

V syntetickém DAD se setřídění záznamů dosáhne pomocí klauzule ORDER BY použité v dotazu.

V analytickém DAD se setřídění záznamů popíše v elementech, v nichž se připojují jednotlivé tabulky. V dialogu se vyplní pole Setřídit podle a uvede se do něj jméno sloupce nebo seznam sloupců oddělený čárkami. Pokud by jméno některého sloupce obsahovalo čárku, uveďte ho v obrácených apostrofech.

Vzorové příklady vytknutí hodnot

Protože popis principů vytýkání hodnot je poněkud abstraktní, doporučujeme nejprve podrobně projít níže uvedené příklady a až pak se věnovat exaktnější specifikaci.

Příklad 1

Uvažujme tabulku Customers s tímto obsahem:
ID_CUST FIRST_NAME SURNAME REGISTER_DATE
0 John Smith 1997-02-25
1 Peter White 1997-02-25
2 Charles Black 2002-12-03
3 Peter White 2003-07-05

Chceme exportovat do XML přehled zákazníků po dnech, kdy se registrovali. Navrhneme tento (syntetický) DAD (v příkladech XML je pod jménem Structuring 1):

i XML TOP: SELECT * FROM Customers ORDER BY register_date
E <list>
  E <customers> TABLE - base cursor -
    E <registered>
      Tx register_date
    E </registered>
    E <person> Multi_occurence
      E <name>
        Tx first_name
      E </name>
      E <surname>
        Tx surname
      E </surname>
    E </person>
  E </customers>
E </list>

Setřídění záznamů podle sloupce registrace je zajištěno klauzulí ORDER BY registrace na konci dotazu uloženého v DAD. Jelikož v elementu person je zatrženo Opakovatelný element (Multi_occurence), výstup do XML funguje tak, že:

V důsledku toho jsou údaje o zákaznících, kteří se zaregistrovali stejného dne, seskupeny:

<?xml version="1.0" encoding="UTF-8"?>
<list>
 <customer>
  <registered>1997-02-25</registered>
  <person>
   <name>John</name>
   <surname>Smith</surname>
  </person>
  <person>
   <name>Peter</name>
   <surname>White</surname>
  </person>
 </customer>
 <customer>
  <registered>2002-12-03</registered>
  <person>
   <name>Charles</name>
   <surname>Black</surname>
  </person>
 </customer>
 <customer>
  <registered>2003-07-5</registered>
  <person>
   <name>Peter</name>
   <surname>White</surname>
  </person>
 </customer>
</list>

Příklad 2

Nyní exportujeme data ze stejné tabulky tak, aby ukazovala opakované registrace stejné osoby. Seskupíme data podle jména a příjmení. Pro změnu vytvoříme analytický DAD vhodný pro vstup i výstup dat (v příkladech XML je pod jménem Structuring 2).

DAD může vypadat tato:

i XML TOP
E <list>
  E <customer> TABLE Customers ORDER BY surname,first_name
    E <person>
      E <name>
        Tx Customers.first_name
      E </name>
      E <surname>
        Tx Customers.surname
      E </surname>
    E </person>
    E <registered> Multi_occurence
      Tx Customers.register_date
    E </registered>
  E </customers>
E </list>

Setřídění záznamů je zajištěno vyplněním údaje Setřídit podle v popisu elementu customer, v němž je připojena tabulka Customers. Jelikož v elementu registered je zatrženo Opakovatelný element, výstup do XML funguje tak, že:

V důsledku toho jsou údaje seskupeny podle jména a příjmení zákazníka:

<?xml version="1.0" encoding="UTF-8"?>
<list>
 <customer>
  <person>
   <name>Charles</name>
   <surname>Black</surname>
  </person>
  <registered>2002-12-03</registered>
 </customer>
 <customer>
  <person>
   <name>John</name>
   <surname>Smith</surname>
  </person>
  <registered>1997-02-25</registered>
 </customer>
 <customer>
  <person>
   <name>Peter</name>
   <surname>White</surname>
  </person>
  <registered>1997-02-25</registered>
  <registered>2003-07-5</registered>
 </customer>
</list>

Příklad 3

Uvažujme stejný případ, jako v příkladu 2. Budeme ale předpokládat, že v databázi mohou existovat různé osoby se stejným jménem i příjmením. Opakovanou registraci budeme rozpoznávat podle opakujícího se údaje ID_CUST. Předpokládáme o něm, že je při opakované registraci stejné osoby stejný, zato při registraci dvou osob se stejným jménem a příjmením různý.

Tohoto cíle lze dosáhnout tím, že přidáme do DAD údaj ID_CUST, ať už ve formě atributu nebo textu v elementu ID:

i XML TOP
E <list>
  E <customer> TABLE Customers ORDER BY surname,first_name
    E <person>
      E <name>
        Tx Customers.first_name
      E </name>
      E <surname>
        Tx Customers.surname
      E </surname>
      E <ID>
        Tx Customers.id_cust
      E </ID>
    E </person>
    E <registered> Multi_occurence
      Tx Customers.register_date
    E </registered>
  E </customers>
E </list>

Předpokládejme však, že nechceme, aby údaj ID_CUST vystupoval do XML souboru, chceme pouze to, aby ovlivnil členění XML souboru - umožnil nebo znemožnil spojení údajů o registraci osob se stejný jménem a příjmením (důvodem může být umožnění importu dat pomocí tohoto DADu - importované hodnoty ID_CUST by porušily unikátnost indexu).

V takovém případě v dialogu toho elementu, který se má opakovat při změně ve sloupci ID_CUST, zatrhneme Opakovat při změně a vyplníme tabulku a sloupec ID_CUST. Vznikne DAD (v příkladech XML je pod jménem Structuring 3):

i XML TOP 
E <list>
  E <customer> TABLE Customers ORDER BY surname,first_name REPEAT ON CHANGE IN Customers.id_cust
    E <person>
      E <name>
        Tx Customers.first_name
      E </name>
      E <surname>
        Tx Customers.surname
      E </surname>
    E </person>
    E <registered> Multi_occurence
      Tx Customers.register_date
    E </registered>
  E </customers>
E </list>

Pomocí údaje Opakovat při změně můžeme jemně řídit opakování elementů. Můžeme dosáhnout toho, že se bude opakovat element na vyšší úrovni, než by vyplývalo z hodnot, které vystupují do XML souboru.

Princip vytknutí hodnot

Při výstupu jednotlivých záznamů z databáze do XML se některé elementy mohou opakovat: ty, ve kterých je připojena nová tabulka (relační vztah 1:N) a ty, ve kterých je zatrženo Opakovatelný element.

Při výstupu každého nového záznamu z databáze se hledá element, jehož výskyt se zopakuje. Z elementů uvedených v předchozím odstavci se hledá takový, pro nějž platí:

  1. všechny hodnoty odeslané do XML v předchozím záznamu vně tohoto elementu jsou stejné,
  2. mezi hodnotami odeslanými do XML v předchozím záznamu uvnitř tohoto elementu je některá odlišná.

Pokud těmto pravidlům vyhoví více elementů, opakuje se element na nejnižší úrovni. Tomu odpovídá nejmenší rozsah XML souboru a největší míra vytknutí opakujících se dat.

Příklad 3 ukazuje případ, kde je potřeba opakovat jiný element, než by vyplývalo z předchozího pravidla. Toho lze dosáhnout nastavením údaje Opakovat při změně v popisu opakujícího se elementu.

Jinými slovy: Vytknutí hodnot se projeví tak, že místo opakování elementu na vyšší úrovni se opakuje element na nižší úrovni, který obsahuje měnící se hodnoty, uvnitř jednoho výskytu elementu vyšší úrovně, v němž jsou neměnné, "vytknuté" hodnoty.