Lekce 1.29
Sekvenční prohledávání databáze


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)

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