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