Vytvoření, aktualizace, restrukturalizace

a indexování databázového souboru

 

Databázový soubor

Databázový soubor (DBF - DataBase File) je v podstatě tabulka (Table), zapsaná ve vnější paměti počítače. Jméno souboru (file name) odpovídá názvu tabulky. Jednotlivé řádky tabulky (rows) jsou do souboru ukládány jako záznamy (records). Paměťová místa záznamu, do kterých je možné zapisovat hodnoty atributů tabulky se nazývají položky (fields) a odpovídají sloupcům tabulky (columns). Soubory, záznamy a položky jsou pojmy jazyka FoxPro. Tabulky, řádky a sloupce jsou pojmy jazyka SQL (dotazovací jazyk).

Databázové soubory a jejich položky mají svá jména. Jména musí začínat písmenem, mohou obsahovat číslice a znaky podtržení. Písmena české abecedy se zapisují bez diakritických znaků. Velikost písmen nerozhoduje. Rozhodujících je prvních osm znaků jména souboru a deset znaků jména položky. Ostatní znaky se ignorují. Vyznačení příslušnosti položky k souboru lze provést tak, že před její jméno se zapíše jméno souboru a oddělí se tečkou. Pak nemůže dojít k chybě při stejném pojmenování položek. Vzniká tím jakási předpona jména položky, které se říká kvalifikátor nebo prefix. Jména databázových souborů mohou být uváděna v programech s příponou .DBF (DataBase File). V praxi se přípony souborů zapisují pouze ve výjimečných případech (například při rušeni nebo přejmenovávání souborů). Příklad: Chceme pořídit evidenci vozidel, která bude obsahovat označení vozidla, typ, datum pořízení, počet ujetých kilometrů.

 

 

Vytvoření databázového souboru a definování jeho struktury

Vytvoř se anglicky řekne create. Příkaz k vytvoření souboru bude mít obecný tvar:

 

CREATE <soubor>

 

Příkaz zajistí aktivaci okna pro definování struktury.

Okno má v záhlaví zobrazenou cestu a jméno souboru. Umožňuje zapsat strukturu souboru do čtyř sloupců. Do sloupce NAME se zapisuje jméno položky, do TYPE typ údaje, do WIDTH (zobrazovaná) délka a do DEC počet desetinných míst (jen číselných údajů.)

Zápis jednotlivých údajů se ukončuje klávesou ENTER. Při zápisu TYPE stačí uvést první písmeno typu údaje nebo zmáčknout ENTER a výběr provést ze zobrazeného menu. Posuv kursoru v okně lze zajistit pomocí kursorových kláves - šipek, nebo pomocí myši. Pohyb mezi prvky umístěnými v okně se zajišťuje klávesou Tab (zpětný pohyb Tab+Shift. Zapsané údaje lze opravovat přepisováním. Vložení řádku lze zajistit klávesami ^I (Insert = vlož). Zrušení klávesami ^D (Delete = zruš). Lze použít myši. Zápis struktury se ukončí klávesami ^W (Write = zapiš). Uvedené klávesy a jejich kombinace si zapamatujeme, lze je použít ve stejných funkcích v řadě oken FoxPro.

Konkrétně, po zápisu příkazu:

 

                     ┌──────COMMAND────── 
                       CREATE evid_voz  
                     └───────────────────

 

 

Zobrazení struktury databázového souboru

Strukturu databázového souboru si lze kdykoliv zobrazit nebo vytisknout. Musíme však systému sdělit, který soubor chceme použít ( použít se anglicky řekne use). Pak napíšeme příkaz: zobraz strukturu. (Anglicky: display structure).

Zadáme:

 

                     ┌──────COMMAND───── 
                       USE EVID_VOZ      
                       DISP STRU         
                     └────────────────── 

 

Zobrazí se výsledek:

 

      Structure for database: C:\FOX\PR\EVID_VOZ.DBF    
      Number of data records:       0                    
      Date of last update   : 10.09.91                   
      Field  Field Name  Type       Width    Dec         
          1  OZNACENI    Character     12                
          2  TYP         Character     10                
          3  PORIZENI    Date           8                
          4  KM          Numeric       10                
 
          ** Total **                  40             

 

Bude-li zapotřebí strukturu vytisknout, nutno zapsat příkaz zapiš strukturu na tiskárně (anglicky = list structure to printer).

 

                     ┌──────COMMAND─────── 
                      USE EVID_VOZ       
                      LIST STRU TO PRINT 
                     └──────────────────── 

 

Poznámka: Příkazy DISPLAY a LIST jsou podobné a zaměnitelné. Pro zobrazování používáme raději příkaz DISPLAY. Při větším rozsahu, než je rozsah obrazovky, umožní postupné čtení jednotlivých částí zobrazované informace. LIST pracuje bez přerušení a hodí se pro tisk.

 

Naplnění a aktualizace souborů zkušebními daty

Pro naplnění a aktualizaci databázových souborů budeme zpočátku používat příkaz:

 

                     ┌──────COMMAND────── 
                       USE EVID_VOZ      
                       BROWSE            
                     └─────────────────── 

 

Zobrazí se okno - formulář pro zápis, prohlížení a aktualizaci databázového souboru. (Slovo browse znamená prohlížet. Příkaz browse má velice složitou strukturu a bohaté možnosti využití. Pro naši potřebu stačí však uvést pouze název příkazu. Zápis záznamu si lze vynutit klávesami ^N, pohyb ve formuláři se provádí pomocí šipek, k přechodu na další sloupec se použije klávesy TAB, na předchozí sloupec - Shift a TAB. Práce v okně browse, se ukončuje klávesami ^W. Záznam nelze zrušit, pouze označit pro zrušení klávesami ^T. Vlastní zrušení proběhne až po ukončení práce a po zápisu příkazu PACK.)

Příklad zápisu hodnot do souboru EVID_VOZ:

 

 OZNACENI    TYP        PORIZENI         KM  
──────────────────────────────────────────── 
 BMR 25-36   Tatra 111  01.11.60      42414  
 BMR 72-58   Praga V3S  21.03.61      51055  
 BMR 52-83   Tatra 111  06.01.64      87544  

 

 

Výpis souboru na obrazovce a tiskárně

Výpis souboru se provádí analogicky jako výpis struktury souboru. Musíme ovšem sdělit systému, že si přejeme zobrazení všech záznamů ( anglicky všechny se řekne all).

 

                     ┌──────COMMAND────── 
                       USE EVID_VOZ      
                       DISPLAY ALL       
                     └─────────────────── 

 

Zobrazí se obsah souboru ve tvaru:

 

 RECORD#    OZNACENI     TYP         PORIZENI          KM  
       1    BMR 25-36  Tatra 111     01.11.80       42414  
       2    BMR 72-58  Praga V3S     21.03.81       51055  
       3    BMR 52-83  Tatra 111     06.01.84       87544  

 

  Pro tisk obsahu souboru je vhodnější příkaz:

 

                     ┌──────COMMAND─────── 
                       USE EVID_VOZ       
                       LIST ALL TO PRINT  
                     └──────────────────── 

 

(K potlačení tisku čísel záznamů - record# - stačí napsat klausuli OFF, tedy: LIST ALL OFF TO PRINT).

 

Vytvoření databázového souboru pomocí systémového menu

Vytváření a naplnění DBF souborů lze provádět též volbami systémového menu. Značky n  určují pořadí voleb v jednotlivých menu. Zobrazí se okno struktury databázového souboru. Vytvářený soubor nebyl pojmenován, proto po ukončení práce se zobrazí okno uchování (save). V něm nutno, na posledním řádku, zadat jméno vytvářeného souboru. Volba Quit ukončuje práci systému.

 

Restrukturalizace databázového souboru

Změna struktury otevřeného databázového souboru se zajistí příkazem:

 

MODIFY STRUCTURE

 

Příkaz předpokládá, že příslušný databázový soubor byl předem otevřen příkazem

 

USE

 

Příkaz zobrazí strukturu databázového souboru. V dialogovém okně lze měnit už nadefinované položky (například jejich typ a rozměr), přidávat nové položky a rušit staré. Po ukončení aktualizace souboru následuje dotaz na provedení změny (make the structured changes permanent). Po kladné odpovědi (yes) se provede automatická aktualizace celého souboru. Při aktualizaci nedojde ke ztrátě informací uložených v souboru, pokud nebyly přímo zadáním změn vyžádány (zkrácení rozměru, zrušení položky). Indexové soubory typu CDX, které se automaticky otevřely příkazem USE, jsou aktualizovány souběžně s aktualizací databázového souboru. O indexových souborech bude pojednáno v následující kapitole.

 

Indexování

Záznamy souboru jsou ukládány a zobrazovány v pořadí jejich pořízení. Pro aktualizaci dat i pro jejich výpisy je z důvodů lepší přehlednosti vhodné data uspořádat podle položek, které zaujímají v souboru klíčová postavení. V našem příkladě podle označení vozidla. Skutečné třídění souboru by při velkých počtech záznamů bylo velice zdlouhavé. Místo toho se používá indexových souborů.

 

Pořízení a doplňování indexového souboru

Provádí se obvykle při pořízení databázového souboru příkazem zadaným v okně command:

 

INDEX ON <klíčová položka> TAG <jmeno> [DESCENDING]

[ADDITIVE] [FOR <logický výraz>]

 

Příkaz vytvoří (nebo doplní) kompaktní indexový soubor stejného jména jako aktuální soubor, s příponou .CDX. Soubor může obsahovat více indexů vytvořených tímto příkazem (proto klausule ADDITIVE - přidat). Je povoleno postupně přidávat a měnit, podle potřeby, jednotlivé indexy. (Klíčová položka může být nahrazena libovolným číselným nebo znakovým výrazem.) Jméno klausule TAG (jmenovka) se volí obvykle shodné se jménem klíčové položky. Slouží k určení řídícího indexu (každý z indexů obsažených v indexovém souboru může být řídícím). Řídící index určuje logické uspořádání souboru. Zbylé indexy souboru se pouze automaticky aktualizují v závislosti na aktualizaci databázového souboru. Logické uspořádání je vzestupné (ascending). V případě potřeby sestupného uspořádání nutno v příkazu zadat klausuli DESCENDING.

Indexové soubory umožňují provádět výběry záznamů. Výběr se předepisuje klausulí FOR (pro), za kterou následuje logický výraz. Soubor se pak navenek jeví jako by obsahoval pouze záznamy odpovídající tomuto výrazu. (Jde o časově nenáročnou operaci).

Příklad vytvoření indexů:

 

          ┌─────────────────COMMAND─────────────────── 
            USE evid_voz                              
            INDEX ON oznaceni TAG oznaceni            
            INDEX ON porizeni TAG porizeni desc addi  
          └─────────────────────────────────────────── 

 

Od tohoto okamžiku bude mít soubor evid_voz automaticky aktualizované oba indexy. I když bude otevírán bez požadavku na uspořádaný výstup. Požadavek na uspořádaný výstup (order) se zadává v příkazu USE zadáním jmenovky požadovaného indexu (tag).

Například:

 

              ┌─────────────COMMAND────────────── 
                USE EVID_VOZ ORDER TAG oznaceni  
               LIST ALL TO PRINT                
              └────────────────────────────────── 

 

Nástroje vytváření a doplňování indexových souborů

K vytváření složitých indexových výrazů a provádění změn v indexových souborech slouží speciální dialogové okno, které lze otevřít z hlavní nabídky volbami analogickými k vytvoření databázového souboru (File, New). V dialogu New se zvolí z výběrového pole rádiový knoflík (o) Index. Dialog indexových souborů má tvar, který odpovídá výše vedené struktuře příkazu. V seznamu "Database Field" je nabídka položek, podle kterých je možné provést indexaci. Přesun vybrané položky do seznamu "Index On" se provádí tlačítkem < Move -> >. Jméno indexu (Tag name) se nastavuje automaticky, lze ho však změnit. Tlačítko < For... > vede na dialog usnadňující zápis podmínky výběru záznamů. Podmínku lze zapsat i přímo (nedejte se odradit zdánlivě malým prostorem). Tlačítko < Expr...> má podobnou funkci. Slouží k zápisu složitých výrazů uspořádání. Výraz zapsaný v okně "Index Expression" se do okna "Index On" přesouvá tlačítkem Move. Nastavené údaje v okně "Output" se nesnažíme změnit. Na posledním řádku tohoto okna vidíme, že systém sám navrhuje pro indexový soubor stejné jméno jako má soubor databázový. Rádiové knoflíky ( ) Ascending a ( ) Descending slouží k nastavení smyslu uspořádání. Smysl (vzestupně, sestupně) je vyjádřen šipkou v okně "Index On". Změnit smysl se dá pouze po nastavení kursoru na vybranou položku (výraz).

 

Aktualizace databáze

S doposud získanými znalostmi jsme schopni sestavit program pro pořízení a aktualizaci libovolného databázového souboru (podle vzoru pro program aktualizace evidence vozidel). Program (command) bude mít pouze čtyři příkazy a nazveme ho jménem souboru, který bude aktualizovat. V našem případě EVID_VOZ.

Program pořídíme příkazem:

 

                ┌───────────COMMAND───────────── 
                   MODIFY COMMAND EVID_VOZ      
                └─────────────────────────────── 

 

Vytvoří se okno nadepsané EVID_VOZ.PRG, do kterého zapíšeme příkazy podle obrázku.

 

        ┌────────────────EVID_VOZ.PRG──────────────── 
              SET  DATE TO GERMAN                      
              USE evid_voz ORDER TAG OZNACENI          
              BROWSE  PARTITION 12+2  REDIT            
              PACK                                     
        └──────────────────────────────────────────── 

 

V podstatě jsme využili znalostí z předchozích kapitol. Příkaz browse jsme ale rozšířili o klausuli, která rozděluje okno browse na dvě části (partition) tak, že dělící čára je za první (klíčovou) položkou. Dělící čára okna se počítá od pravého okraje okna v počtu znaků. Rozměr položky OZNACENI je 12. Musíme ho zvětšit o jeden znak, připadající na dělící čáru (mezipoložkovou, nejde o dělící čáru částí oken). Klausule REDIT zajistí, že pravá strana (right) bude mít zobrazeny všechny položky záznamu. Levá strana umožní snadné a rychlé vyhledávání záznamů.

Program se aktivuje příkazem:

 

                        ┌────COMMAND──── 
                          DO EVID_VOZ   
                        └─────────────── 

 

Aktualizovat lze v obou částech okna. Přepínání mezi okny se provádí klávesami ^H. (Pohodlnější je přepínání myší.)

Poznámka: Obecně lze nastavit dělící čáru okna browse příkazem:

 

BROWSE PARTITION fsize(field(1))+1 + fsize(field(2))+2 ....

 

kde field() je funkce, která vrací jméno položky a fsize() je funkce, která vrací rozměr položky. Tyto funkce nejsou ve skriptech probírány, ale jejich popis najdete v nápovědi systému (klávesa F1) nebo ve vhodném manuálu.

 

Cvičení:

Vytvořte soubor, který bude uvádět nosnost a spotřebu jednotlivých typů vozidel. Soubor doplňujte pomocí tabulky (analogické k tabulce evidence vozidel).

Vzor:

 

 Typ             Praga V3S       
 Nosnost               4.5       
 Spotreba            12.30       
──────────────────────────────── 
 Typ             Tatra 111       
 Nosnost               5.0       
 Spotreba            14.34       
──────────────────────────────── 
 Typ             Tatra 417      
 Nosnost               7.5       
 Spotreba            23.60