Lekce 1.30
T°φd∞nφ databßze - indexy


p°edchozφ lekce (1.29) obsah kurzu nßsledujφcφ lekce (1.31)

Databßze je p°i svΘm vytvß°enφ °azena podle po°adφ po°izovßnφ zßznam∙. Po°adφ zßznam∙ je tedy chronologickΘ, dle Φasu po°φzenφ. Pro prßci s databßzi vÜak budete pot°ebovat Φast∞ji °azenφ podle zadan²ch ·daj∙. Proto je mo₧nΘ databßzi indexovat. To nßm umo₧nφ databßzi se°adit vzestupn∞ podle zadanΘho ·daje. Znakovß pole podle abecedy, numerickß pole podle velikosti Φφsel, datumovß pole chronologicky dle data.

P°i indexovßnφ databßze se vytvß°φ tzv. indexov² soubor, ve kterΘm jsou umφst∞ny informace o indexovßnφ databßze. Indexov² soubor je v systΘmu KLONDAIK v₧dy stejnΘho jmΘna, jako mß databßze, mß vÜak pro rozliÜenφ p°φponu souboru *.CDX. Indexov² soubor, pokud existuje, se otevφrß v₧dy automaticky spolu s databßzφ. V jednom indexovΘm souboru mohou b²t p°itom ulo₧eny informace o n∞kolika navzßjem nezßvisl²ch indexech. Jednß se o tzv. vφcenßsobnΘ indexovΘ soubory typu CDX.

Zda je otev°enß databßze indexovßna poznßte snadno v databßzovΘm okn∞, kde je v p°φpad∞ nalezenφ index∙ mo₧no ve v²b∞rovΘm boxu vybrat existujφcφ index. Po v²b∞ru indexu je databßze ihned °azena podle po₧adovanΘho indexu. V takovΘm p°φpad∞ nemusφ souhlasit po°adφ v∞t zobrazovanΘ ve stavovΘm °ßdku databßzovΘho okna. Bude-li n∞kter² index databßze aktivnφ, bude databßze °azena ne podle Φφsla zßznamu, ale vzestupn∞ podle zadanΘho indexu. Pokud zadßte p°echod na zaΦßtek nebo konec databßze, nebude proveden p°echod podle Φφsla zßznamu, ale v₧dy podle zvolenΘho indexu!

Z programu mßte mo₧nost nastavit po₧adovan² index volßnφm funkce DbfSetOrder, kde uvedete jako parametr jmΘno indexu, p°φpadn∞ za pou₧itφ funkce DbfTagName po°adovΘ Φφslo indexu:


DbfSetOrder('NAZEV');
DbfSetOrder(DbfTagArea(2));
Pokud zadßte chybn² nßzev indexu, p°φpadn∞ neexistujφcφ Φφslo indexu, bude databßze °azena podle po°adov²ch Φφsel.

Nov² index m∙₧ete vytvo°it volßnφm funkce DbfIndexTag, ve kterΘ zadßte jmΘno indexu a v²raz, ze kterΘho se index sklßdß. JmΘno indexu m∙₧e mφt maximßln∞ osm znak∙ a je mo₧nΘ si jej libovoln∞ zvolit. NejlΘpe je uvßd∞t jej podle obsahu indexu. V²raz, podle kterΘho je databßze indexovßna m∙₧e obsahovat v²raz v jazyce xBase udßvajφcφ polo₧ky databßze pro indexovßnφ. V nejjednoduÜÜφm p°φpad∞ staΦφ uvΘst pouze nßzev polo₧ky, podle kterΘ mß b²t databßze indexovßna.

NejjednoduÜÜφ je tvorba index∙ pro °et∞zcovΘ polo₧ky, proto₧e systΘm indexuje vnit°n∞ vÜe jako °et∞zce. Nenφ takΘ problΘm p°i po₧adavku na spojenφ n∞kolika polo₧ek do indexu:


DbfIndexTag('NAZ', 'NAZEV');
DbfIndexTag('XXX', 'TYP+NAZEV');
Pokud by polo₧ka NAZEV obsahovala texty s velk²mi i mal²mi pφsmeny, bylo by jejich °azenφ podle v²Üe uvedenΘho indexu na prvnφ pohled trochu nelogickΘ. Zφskali by jsme nap°φklad nßsledujφcφ po°adφ: 'aa', 'aZ', 'AA'. Je to proto, ₧e velkß a malß pφsmena majφ p°i t°φd∞nφ rozdφln² v²znam. Pokud vÜak vytvo°φme index, ve kterΘm p°evedeme vÜechna pφsmena v °et∞zci na stejnou velikost, bude ji₧ vÜe v po°ßdku ('aa', 'AA', 'aZ'). P°i tvorb∞ index∙ m∙₧eme proto pou₧φvat s v²hodou libovolnΘ v²razy v syntaxe jazyk∙ xBase, kterΘ nßm umo₧nφ mnohß kouzla s indexy:

DbfIndexTag('NAZ', 'UPPER(NAZEV)');
Jednoduchß je takΘ tvorba index∙ pro numerickΘ polo₧ky. Pokud vytvß°φme index pouze pro jednu polo₧ku, staΦφ zadat pouze jejφ jmΘno. V p°φpad∞ ₧e budeme chtφt indexovat databßzi podle n∞kolika polo₧ek, musφme pro index vytvo°it za pou₧itφ v²raz∙ v syntaxi xBase pro indexovßnφ °et∞zec:

DbfIndexTag('CENA', 'CENA');
DbfIndexTag('XXX', 'TYP+STR(CENA,10,2)');
Je dokonce mo₧nΘ indexovat tzv. vypoΦtenΘ polo₧ky. To je takovΘ, kterΘ v databßzi ve skuteΦnosti neexistujφ a jejich hodnota je vypoΦtena z existujφcφch polo₧ek. V nßsledujφcφm p°φklad∞ bude cenφk indexovßn podle koneΦnΘ ceny vΦetn∞ DPH:

DbfIndexTag('CENA', 'CENA/100*(100+DPH)');
Trochu slo₧it∞jÜφ je indexovßnφ datumov²ch polo₧ek. Je to proto, ₧e aΦkoliv se tvß°φ jako °et∞zec, vzniknul by jejich prost²m indexovßnφm podobn² problΘm jako u velk²ch a mal²ch pφsmen v °et∞zcφch. Tentokrßt by se datovΘ polo₧ky indexovaly v po°adφ podle dn∙, m∞sφc∙ a rok∙. Proto₧e je ale nutnΘ indexovat nejprve v rßmci roku, potom m∞sφce a nakonec dne, budeme muset pou₧φt op∞t funkci v syntaxi xBase, kterß zajistφ p°evod data do vhodnΘ formy pro indexovßnφ:

DbfIndexTag('DAT', 'DTOS(DATUM)');
Indexy je mo₧nΘ tvo°it bu∩ funkcφ DbfIndexTag, jak bylo v²Üe uvedeno, nebo je mo₧nΘ vyu₧φt dialogovΘho okna, kterΘ vyvolßte z PopUp menu zobrazenΘho po kliknutφ prav²m tlaΦφtkem myÜi na ploÜe databßzovΘho okna. Platφ p°itom stejnΘ zßsady uvedenΘ pro tvorbu index∙ funkcφ DbfIndexTag.

V nßsledujφcφ lekci se seznßmφme s tφm, ₧e krom∞ °azenφ zßznam∙ v databßzi lze indexy pou₧φt i pro velmi rychlΘ vyhledßvßnφ zßznam∙ v databßzi.


p°edchozφ lekce (1.29) obsah kurzu nßsledujφcφ lekce (1.31)

OZOGAN, 1 Mßje 97, 460 01 Liberec
tel.,fax: (048) 52 28 338, e-mail: info@ozogan.cz