# Databáze a archivace dat

Data lze uchovávat (archivovat) v souborech různých formátů. V systému Control Web jsou archivní data ukládána buď do standardních databázových souborů ve formátu dBase III Plus nebo přes rozhraní ODBC do jiných formátů souborů či do libovolných databázových systémů.

Databázový soubor je organizován jako tabulka, kde každý řádek tabulky představuje jeden záznam a každý sloupec představuje jednu položku záznamu. Každá položka záznamu je identifikována svým jménem, typem, délkou a u numerických položek i počtem desetinných míst.

Struktura databázového souboru

Archivovaná data jsou zapisována do souboru po záznamech. Standardně je každý záznam ještě doplněn o položky časových značek archivace. Do položky s názvem DATE (typ datum, délka 8) je ukládána informace o datu archivace a do položky s názvem TIME (znaková, délka 8) čas archivace záznamu. Každou z těchto standardně přidávaných položek lze samozřejmě zakázat, definovat její jméno a případně i výraz, jehož vyčíslením je datum nebo čas získáván. Poslední jmenovanou vlastnost lze využít například při archivovaní dat z měřicích jednotek, které střádají data doplněná o datum a čas ve své paměti a přenos těchto dat se uskutečňuje na vyžádání.

U všech archivních souborů lze také definovat podmínky jejich zakládání, délku časového období zachyceného v každém z nich a jejich historii, respektive počet souborů uchovávaných na disku nebo v databázovém systému.

Data lze archivovat periodicky, asynchronně (např. výjimkou od ovladače) nebo také voláním nativní metody příslušného virtuálního přístroje.

## Archivní soubory

Archivní soubory můžeme rozdělit podle způsobu jejich vzniku na relativní, absolutní a permanentní. Relativní a absolutní soubory vznikají periodicky a dělíme je ještě podle délky časového období, které zachycují, na minutové (jen u relativních), hodinové, denní, měsíční a roční. Při archivaci do permanentních souborů lze dokonce řídit, do kterého souboru bude právě archivováno.

### Relativní soubory

Relativní soubory vznikají periodicky, a obsahují data celého období vymezeného typem souboru. To znamená, že v případě minutových souborů se budou v souboru vyskytovat data archivovaná mezi začátkem a koncem každé minuty, tedy mezi 0. a 59. sekundou, v případě hodinových souborů mezi začátkem a koncem každé hodiny, tedy mezi 00:00 a 59:59, v případě denních souborů mezi začátkem a koncem dne, tedy mezi 00.00:00 a 23.59:59, v případě měsíčních souborů mezi začátkem a koncem měsíce, tedy od začátku prvního dne v měsíci od 00.00:00 do posledního dne v měsíci do 23.59:59 a v případě ročních souborů mezi začátkem a koncem roku, tedy od prvního dne v roce od 00.00:00 do posledního dne v roce do 23.59:59.

Soubory jsou vždy zakládány až při prvním požadavku na archivaci v daném časovém období a nikoliv na začátku tohoto období. Pokud se tedy mají archivovat data do hodinových souborů a první požadavek na archivaci vznikne v páté minutě aktuální hodiny, pak je tento soubor založen až v páté minutě této hodiny a zároveň jsou do souboru zapsána příslušná data.

Historie určuje, jak stará data budou dostupná v souborech na disku nebo v databázích. Pokud tedy nadefinujeme historii 10 pro hodinové soubory, budou k dispozici data jen za posledních deset hodin. Soubory obsahující data starší desíti hodin budou smazány. Z toho plyne, že pokud byla aplikace odstavena delší dobu než je doba určená součinem historie a časovým obdobím, budou při spuštění aplikace ihned při prvním požadavku na archivaci všechny tyto soubory smazány!

### Absolutní soubory

Absolutní soubory jsou periodicky vznikající soubory. Na rozdíl od relativních archivních souborů lze určit u hodinových souborů minutu, u denních hodinu a minutu, u měsíčních den, hodinu a minutu a u ročních měsíc, den, hodinu a minutu vzniku archivního souboru, respektive první možný výskyt dat v archivním souboru. Pro lepší pochopení této problematiky si uvedeme příklad:

Příklad:

Hodnoty u parametru file_start určují vznik souboru v pořadí minuta, hodina, den, měsíc. Je-li tedy definován tento parametr jako:

`file_start = 15, 6, 10, 3;`

pak platí pro jednotlivé typy souborů:

hodinové soubory — Význam má pouze první hodnota ze seznamu, tj. minuta. V souboru se budou vyskytovat data od hodina.15:00 do (hodina+1).14:59. denní soubory — Význam mají pouze první dvě hodnoty ze seznamu, tj. minuta a hodina. V souboru se budou vyskytovat data od den 06.15:00 do (den+1) 05.14:59. měsíční soubory— Význam mají pouze první tři hodnoty ze seznamu, tj. minuta, hodina a den. V souboru se budou vyskytovat data od 10.`měsíc 06.15:00 do 10.`(měsíc+1) 05.14:59. roční soubory — Význam mají všechny hodnoty ze seznamu, tj. minuta, hodina, den a měsíc. V souboru se budou vyskytovat data od 10.`3.`rok 06.15:00 do 10.`3.`(rok+1) 05.14:59.

Rozsah časových období, která lze zachycovat v absolutním archivním souboru, je oproti relativním archivním souborům ochuzen o minutové soubory. Princip zakládání souborů je stejný jako u relativních archivních souborů, jsou tedy zakládány až při prvním požadavku na archivaci v daném časovém období a nikoliv na začátku tohoto období. Pro historii platí totéž, co pro relativní archivní soubory.

### Permanentní soubory

Permanentní soubory lze s úspěchem využívat všude tam, kde z nějakého důvodu nelze použít ani relativní ani absolutní archivní soubory. Permanentní soubory jsou dvojího druhu — s pevným jménem nebo s proměnným jménem. V prvním případě jsou data ukládána stále do stejného souboru s předem nadefinovaným jménem. Ve druhém případě je za pomoci speciálních znaků definována maska jména souboru. Jméno souboru je potom vytvářeno tak, že speciální znaky, tvořící masku, jsou nahrazeny hodnotou získanou vyčíslením numerického výrazu file_mask_expression. Pomocí výrazů file_name_expression lze tedy řídit, do kterého permanentního archivního souboru budou data zapisována. Pro lepší pochopení této problematiky je uveden následujicí příklad:

Příklad:

Vyčíslením výrazu file_mask_expression získáme hodnotu 1435. Výsledná jména souborů budou vypadat následovně:

- pro masku XYZ????? bude výsledné jméno souboru vypadat XYZ1435
- pro masku X??YZ??? bude výsledné jméno souboru vypadat X1YZ435
- pro masku XYZ@@@@@ bude výsledné jméno souboru vypadat XYZ01435
- pro masku X@YZ@@@@ bude výsledné jméno souboru vypadat X0YZ1435
- pro masku X@@@YZ?? bude výsledné jméno souboru vypadat X014YZ35

Jak je vidět na příkladech, použije-li se v masce znak '@' , jsou za chybějící znaky doplněny nuly, zatímco použije-li se znak '?', nejsou chybějící znaky doplňovány. Počet permanentních souborů na disku lze řídit pomocí parametru file_delete. Je-li výsledkem tohoto výrazu hodnota true, je soubor smazán. Pokud nebyl definován výraz condition nebo je výsledkem tohoto výrazu hodnota true, je ve stejném časovém kroku do tohoto souboru zapsán nový záznam, tzn., že tento archivní soubor bude obsahovat jeden záznam. Z výše uvedeného vyplývá, že pokud bude condition = false, lze příslušný soubor smazat.

### Kódování data a času do jména relativního a absolutního souboru

Součástí jména relativního a absolutního souboru je i datum a čas prvního možného výskytu dat v souboru.

U souborů s dlouhými jmény je datum a čas přidáván do kulatých závorek za jméno souboru ve tvaru rrrrmmdd hhmm — jméno archivního souboru s daty od 12.`srpna`1999`12.30 může například vypadat takto:

`'Archivní data (19990812 1230).dbf'`

Protože jména operačního systému MS-DOS mohla mít délku názvu nejvýše osm znaků, bylo nutné do těchto osmi míst datum a čas nějakým vhodným způsobem zakódovat. Datum a čas je zakódováno do pěti znaků a pro rozlišení souborů lze tedy využívat jeden až tři znaky. Jméno archivního souboru s daty od 12.`srpna`1999`12.30 může například vypadat takto:

`'ad_7akcw.dbf'`

Pro snazší práci s kódovanými názvy souborů v aplikačním programu jsou k dispozici dvě systémové nativní procedury. Metoda EncodeArchiveFileName pro zakódování názvu souboru a procedura DecodeArchiveFileName pro jeho rozkódování.

(Poznámka:)

Pokud je datum nebo čas získáván z externích zdrojů pomocí výrazů expression uvedených v sekcích date_item a time_item, jsou tyto výrazy při archivaci vyhodnocovávány. Dojde-li k chybě nebo jsou-li vyhodnocením získany neplatné hodnoty, jsou data zapsána do chybového souboru, kde místo zakódovaného data je '(*?*) ERR ' nebo u souborů s dlouhými jmény ' ERROR FILE'.

#### Dekódování data a času z názvu souboru

Pro případ potřeby získání data a času z názvu souboru v jiných aplikacích je uveden příklad v programovacím jazyce Modula-2.

    (* FileCodeStr - posledních pět znaků z názvu souboru *)
    TYPE
      CodeType = ARRAY [ '$'..'Z' ] OF SHORTCARD;
    CONST
      DecYear = 388;
      CodeBase = 38;
    ConvInt = CodeType(
      000H, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH,
      0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 001H, 002H,
      003H, 004H, 005H, 006H, 007H, 008H, 009H,
      00AH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH,
      00BH, 00CH, 00DH, 00EH, 00FH, 010H, 011H,
      012H, 013H, 014H, 015H, 016H, 017H, 018H,
      019H, 01AH, 01BH, 01CH, 01DH, 01EH, 01FH,
      020H, 021H, 022H, 023H, 024H, 025H
    );

    PROCEDURE Decode( S : ARRAY OF CHAR; VAR OK : BOOLEAN ) : CARDINAL;
    VAR
      x : SHORTCARD;
      i, l, t : CARDINAL;
      ch : CHAR;
    BEGIN
      i := 0;
      l := HIGH( S );
      t := 0;
      OK := S[ i ] <> CHR( 0 );
      WHILE (i <= l) AND (S[ i ] <> 0C) DO
        ch := S[ i ];
        IF (ch < '$') OR (ch > 'Z') THEN
          OK := FALSE;
          RETURN 0;
        END;
        x := ConvInt[ ch ];
        IF (x > CodeBase - 1) OR
           (t > MAX(CARDINAL) - CARDINAL( x )) DIV CodeBase) THEN
          OK := FALSE;
        END;
        t := t * CodeBase + VAL( CARDINAL, x );
        INC( i );
      END;
      RETURN t;
    END Decode;

    PROCEDURE DateToDMY( Julian : INTEGER; VAR Day, Month, Year : INTEGER );
    CONST
      MinYear = 1600;
      First2Months = 59; (* rok 1600 byl přestupný *)
    VAR
      i, j : INTEGER;
    BEGIN
      IF Julian <= First2Months THEN
        IF Julian <= 30 THEN
          Month := 1;
          Day := Julian + 1;
        ELSE
          Month := 2;
          Day := Julian - 30;
        END;
        Year := MinYear;
      ELSE
        i := 4 * ( Julian - First2Months ) - 1;
        j := 4 * (( i MOD 146097 ) DIV 4 ) + 3;
        Year := 100 * ( i DIV 146097 ) + j DIV 1461;
        i := 5 * (( j MOD 1461 + 4 ) DIV 4 ) - 3;
        Month := i DIV 153;
        Day := ( i MOD 153 + 5 ) DIV 5;
        IF Month < 10 THEN
          Month := Month + 3;
        ELSE
          Month := Month - 9;
          Year := Year + 1;
        END;
        Year := Year + MinYear;
      END;
    END DateToDMY;

    PROCEDURE GetDate( FileCodeStr : ARRAY OF CHAR; VAR Day, Month, Year : INTEGER );
    (* získání datumu prvního možného výskytu záznamu v souboru *)
    VAR
      FileCode : INTEGER;
      ok : BOOLEAN;
    BEGIN
      FileCode := Decode( FileCodeStr, ok );
      IF ok THEN
        DateToDMY( FileCode DIV 1000H, Day, Month, Year );
        INC( Year, DecYear );
      END;
    END GetDate;

    PROCEDURE GetTime( FileCodeStr : ARRAY OF CHAR; VAR Hour, Mins : INTEGER );
    (* získání času prvního možného výskytu záznamu v souboru *)
    VAR
      FileCode : INTEGER;
      ok : BOOLEAN;
    BEGIN
      FileCode := Decode( FileCodeStr, ok );
      IF ok THEN
        FileCode := FileCode - FileCode DIV 1000H * 1000H;
        Hour := FileCode DIV 60;
        Mins := FileCode MOD 60;
      END;
    END GetTime;

## DBF soubory

### Distribuce archivních souborů

Velmi často je třeba distribuovat vytvářené archivní databázové soubory do různých adresářů na lokálních nebo na síťových discích. K tomuto účelu lze s výhodou využít přesměrování souborů podle definice sekce directories. Podle potřeby lze do definice této sekce doplnit masky souborů (podle pravidel zástupných znaků operačního systému MS-DOS) a přiřadit jim příslušný adresář, do kterého budou soubory zapisovány nebo z něj načítány.

Příklad:

    directories
      ...
      'a*.dbf' = 'c:\cwapp\data\alarms';
      'tr*.dbf' = 'g:\data\trends';
      'p??xx*.dbf' = 'd:\data';
      ...
    end_directories;

### Struktura databázového souboru

Databázový soubor formátu dBASE III Plus se skládá z návěští souboru a záznamů obsahujících data.

#### Struktura návěští souboru

Struktura návěští souboru

#### Struktura deskriptoru položky

Struktura deskriptoru položky

Jméno položky může obsahovat pouze znaky 'A'..'Z', '0'..'9' a '_' a nesmí začínat číslicí.

#### Maximální délky položek

Maximální délky položek

Pro záznamy obsahující data platí:

1. První znak každého záznamu je indikátor stavu záznamu, tj. označuje, zda je záznam určen pro zrušení (obsahuje hvězdičku — kód 2AH) nebo nikoli (obsahuje mezeru — kód 20H).
2. Ani položky, ani záznamy nejsou odděleny zvláštními oddělovači.
3. Data jsou uložena v ASCII takto:

- řetězec: znaky ASCII
- číslo: znaky 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ., -
- logická: znaky Y, y, T, t pro true, N, n, F, f pro false, ? pro neinicializovanou hodnotu
- datum: 8 číslic ve tvaru rrrrmmdd

4. Koncové návěští souboru je reprezentováno znakem ASCII 1AH.

## Archivace dat přes rozhraní ODBC

Pro archivaci dat lze v systému Control Web také využívat rozhraní ODBC.

Aby bylo možné připojit se do databáze přes rozhraní ODBC, musíte mít nainstalován příslušný ovladač ODBC a musí být nadefinován tzv. souborový zdroj dat (DSN — Data Source Name). Zdroj dat obsahuje informace o způsobu připojení ke zprostředkovateli dat. Control Web využívá souborový zdroj dat proto, že tento zdroj není vázán na konkrétní počítač, a je možné jej distribuovat spolu s aplikací. Zdroj dat lze nadefinovat tak, že v aplikaci "Ovládací panely" dvakrát kliknete na ikonu "Zdroje dat ODBC".

Ikona zdroje dat ODBC v Ovládacích panelech

Ve "Správci zdrojů dat ODBC" můžete nyní nadefinovat nový nebo upravit stávající souborový zdroj dat.

Výběr zdroje dat

Po kliknutí na tlačítko "Přidat..." se zobrazí průvodce Vytvořením nového zdroje dat, pomocí kterého nadefinujete vše potřebné pro konkrétní připojení k poskytovateli dat. Kliknutím na tlačítko "Konfigurovat..." pak můžete upravit již existujicí definici zdroje dat.

Aby přístroj archivoval data přes rozhraní ODBC, je třeba v inspektoru přístroje v sekci (záložce) odbc v parameru enable volbu zatrhnout a v záložce (sekci) dsn vybrat zdroj dat. Případně je možné ještě nadefinovat přihlašovací jméno a heslo do databáze.

Definice zdroje dat v inspektoru přístroje

Ve zdrojovém textu přístroje bude vypadat sekce odbc například takto:

    odbc
      enable;
      dsn = 'Control Web Data.dsn';
      user_name = 'Control Web';
    end_odbc;

## Přehled přístrojů pro archivaci

### archiver

Přístroj archiver je určen k obecné archivaci naměřených i nějakým způsobem jinak zpracovaných veličin. Pomocí tohoto přístroje lze ukládat do archivního souboru data libovolného typu . Proces archivace lze podmínit logickou podmínkou. Po provedené archivaci je vždy nastaven nadefinovaný datový element na hodnotu true a mohou být aktivovány i další virtuální přístroje.

### trend

Obdobnou funkci jako přístroj archiver plní i přístroj trend. Přístroj trend je navíc doplněn o možnost grafického zobrazování průběhu jednotlivých archivovaných veličin. Každé veličině lze přiřadit barvu, kterou bude v grafu vykreslována, rozsah hodnot a její rozměr (jednotku). Historie dat trendu je teoreticky neomezená — je závislá jen na množství archivních dat. Počet sledovaných hodnot, stejně jako počet zobrazovaných vzorků v jednom přístroji také není nijak omezen. Zobrazování mřížky i každého sledovaného průběhu lze zapínat i vypínat i za běhu aplikace. Kdykoliv lze změnit i zobrazovaný časový interval, počet čar mřížky v horizontálním i vertikálním směru, cejchování a rozsah y-ové osy. Samozřejmostí je časový kursor, pomocí kterého lze odečítat naměřené hodnoty.

### alarm

Přístroj alarm je určen k archivování a vyhodnocování událostí, alarmů nebo poruch. Přístroj vyhodnocuje definovaný seznam událostí, u nichž rozlišuje tři základní stavy — vznik, zánik a potvrzení události. Pro každý stav lze definovat činnosti, které přístroj v okamžiku vzniku stavu vykoná (zápis do souboru, tisk na tiskárnu, zápis do provozního deníku, přehrání zvukového souboru, nastavení datového elementu na definovanou logickou hodnotu atd.).

### journal

Pro sledování a archivaci změn hodnot veličin je určen přístroj journal nebo chcete-li "provozní deník". Každé vyhodnocované změně lze přiřadit text a u numerických hodnot také pásmo necitlivosti.

### recipe

Přístroj recipe má mezi přístroji určenými k archivaci zvláštní postaveni. Tento přístroj je vlastně jednoduchý editor databázových souborů. Umožňuje data archivních souborů nejen zapisovat, ale také je z nich číst a takto získané hodnoty z jednotlivých položek záznamů nastavovat do definovaných datových elementů. Receptura také umožňuje základní operace se záznamy — jako například editování, vkládání, mazání, vyhledávání atd.

### SQL

Pomocí tohoto přítroje lze prostřednictvím SQL dotazů provádět různé operace nad daty v databázích. Data je samozřejmě možné pomocí nativních metod přístroje načítat do aplikace, kde je možné je dále zpracovávat. Výsledky výběrových dotazů dokáže také zobrazit v přehledných tabulkách.