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