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ů).
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.
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
└───────────────
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