předchozí lekce (1.28) | obsah kurzu | následující lekce (1.30) |
Pokud potřebujeme zobrazit z databáze pouze určité záznamy podle zadané podmínky, můžeme nastavit na databázi filtr, se kterým jsme se seznámili v předchozí lekci kurzu. Filtrování databáze je však výhodné pouze při prohlížení databáze v okně. Pokud je ale u rozsáhlé databáze použit filtr, který vybere pouze malou část databáze, může být zobrazování vyhovujících záznamů pomalé. Pokud proto nepožadujete použít filtr pro výběr vyhovujících záznamů v databázovém okně, ale přímo v programu, je výhodnější použít dále popsaného způsobu.
Použijeme zadání úkolu z předchozí lekce, kdy máme zvýšit v ceníku ceny, které
jsou včetně DPH menší než 1000,- Kč. Pro ty z vás, kteří neví co je to DPH bude stačit,
vysvětlení, že se jedná o zvýšení ceny v procentech, jehož hodnota je uvedena v
položce DPH. Jedná se o daň z přidané hodnoty. V programu procházíme databází
záznam po záznamu od jejího počátku a kontrolujeme námi zadanou podmínku.
Pokud záznam vyhovuje, provedeme požadované akce. V našem případě zvýšení ceny.
Unit Dbf_3;
interface
implementation
begin
ConsoleClear;
ConsoleShow;
If DbfUse('CENIK') then {pokud se otevřela databáze}
begin
DbfGoTop; {skok na začátek databáze}
While not DbfEof do {dokud není konec databáze}
begin
If DbfEvalNum('CENA/100*(100+DPH)')<1000 then
begin
Writeln(DbfReadStr('NAZEV'));
{pokud cena s daní menší než 1000 Kč}
DbfWriteNum('CENA',DbfReadNum('CENA')*1.1);
{zvýšení ceny o 10 %}
end;
DbfSkip(1); {skok na další záznam}
end;
DbfUse(''); {databázi uzavřeme}
end else
ShowMessage('Databázi nebylo možné otevřít !');
end;
end;
end.
Jak jistě sami postřehnete, je výše uvedený program je značně neefektivní. Prochází
všechny záznamy v databázi a kontroluje splnění zadané podmínky. Pouze pokud je
splněna, provede zvýšení ceny. Neefektivita vzniká tím, že se prochází sekvenčně
(postupně) všechny záznamy přímo v programu. Mnohem výhodnější je přece ponechat
výběr požadovaných záznamů přímo systému. Berte proto výše uvedené řešení pouze
jako ukázku složitějšího zpracování databáze záznam po záznamu.
K vyhledání záznamu podle zadané podmínky lze výhodně použít volání funkce
DbfLocate. Ta sama prochází databázi a hledá záznam podle zadané podmínky. Hledání
je proto mnohem rychlejší, než výše uvedené sekvenční prohledávání databáze. Pro
hledání dalšího vyhovujícího záznamu se potom používá volání funkce DbfContinue, která
hledá další vyhovující záznam. Ačkoliv obě uvedené funkce vrací přímo číslo nalezeného
záznamu v databázi, používá se častěji indikace nalezení konce databázového souboru.
Unit Dbf_4;
interface
implementation
begin
ConsoleClear;
ConsoleShow;
If DbfUse('CENIK') then {pokud se otevřela databáze}
begin
DbfLocate('(CENA/100*(100+DPH))<1000');
While not DbfEof do {dokud není konec databáze}
begin
DbfWriteNum('CENA',DbfReadNum('CENA')*1.1);
{zvýšení ceny o 10 %}
Writeln(DbfReadStr('NAZEV'));
DbfContinue; {hledání dalšího záznamu}
end;
DbfUse(''); {databázi uzavřeme}
end else
ShowMessage('Databázi nebylo možné otevřít !');
end;
end;
end.
Až dosud jsme pracovali s databází, která byla seřazena podle pořadí zápisu
záznamů do databáze. V následující lekci se seznámíme s možnostmi, jak databázi
seřadit a prohlížet podle zadané položky. To nám následně i umožní rychlé vyhledávání.
předchozí lekce (1.28) | obsah kurzu | následující lekce (1.30) |