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.


'program DBF_3.BPR
ConsoleClear
ConsoleShow
If DbfUse("CENIK") then       'pokud se otevřela databáze
   DbfGoTop                   'skok na začátek databáze
   Do Until DbfEof            'dokud není konec databáze
      If DbfEvalNum("CENA/100*(100+DPH))<1000") then
         Writeln(DbfReadStr("NAZEV"))
         'pokud cena s daní menší než 1000 Kč
         Call DbfWriteNum("CENA",DbfReadNum("CENA")*1.1)
         'zvýšení ceny o 10 %
      End If
      DbfSkip(1)             'skok na další záznam
   Loop
Else
   ShowMessage("Databázi 'CENIK.DBF' nebylo možné‚ otevřít !")
End If
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.


'program DBF_4.BPR

ConsoleClear
ConsoleShow

If DbfUse("CENIK") then    'pokud se otevřela databáze
   DbfLocate("(CENA/100*(100+DPH))<1000")
   Do Until DbfEof         'dokud není konec databáze
      Call DbfWriteNum("CENA", DbfReadNum("CENA")*1.1)
      'zvýšení ceny o 10 %
      Writeln(DbfReadStr("NAZEV"))
      DbfContinue         'hledání dalšího záznamu
   Loop
Else
   ShowMessage("Databázi 'CENIK.DBF' nebylo možné otevřít !")
End If
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