e-mail    Debatní kniha    Mapa stránek    Hlavní  
 perličky 
 

FoxPro 2.0 -- inkrementální hledání při zadávání vstupu

Stanislav Dvořák

Situace, že uživatel aplikace zadává identifikační klíč záznamu a k tomuto klíči se v okně Browse vyhledává příslušný záznam nebo záznamy, se musí řešit prakticky v každé aplikaci. Na základě klíče nebo klíčů se musí zpřístupnit příslušný záznam nebo záznamy databázového souboru (případně i záznamy relačně vázaných souborů) pro prohlédnutí nebo i pro další operace; např. pro aktualizační změny.

Jedním -- někdy velmi užitečným -- postupem (malý objem vstupu) pro řešení této situace je tzv. inkrementální vyhledávání. Při něm je nutné, aby se záznam dal vyhledávat už podle po řadě zadávaných znaků v klíči, nikoli až podle celého klíče (odtud název postupu). Příklad možného řešení dále uvedu pro jeden databázový soubor (zde student.dbf), pro který je k dispozici indexový soubor (zde student.idx pro neklesající abecední uspořádání podle příjmení). Klíčem pro inkrementální hledání zde tedy bude příjmení (PRIJMENI).

Pro jednoduchost předpokládejme, že příjmení je v souboru zapsáno bez diakritiky, s prvním písmenem velkým, ostatní jsou malá; v tomto tvaru se pak příjmení musí zadávat.

Protože záznam bude prohledáván podle neúplného klíče, je nezbytné nastavit parametry Near (On) a Exact (Off), aby se k neexistujícímu klíči zobrazil jako vyhledaný záznam první záznam, který za ním ve sledu podle indexového souboru následuje.

Požadavek na vyhledání spojíme např. s funkční klávesou . Při jejím stisku se vstoupí do procedury Proxim (On key label F2 do Proxim). Rozumí se, že se dá použít i jiná vhodná klávesa nebo jejich kombinace. Okno W1 pro Browse se otevře standardním způsobem; pole, která chceme při prohlížení vidět, jsou vyjmenována v části fields.

Vlastní řešení úlohy je v proceduře Proxim. Tam nejprve přečteme další znak a poté:

  • pro stisk a ukončíme operaci Browse (jinak by zde byly operace s určeným záznamem)
  • pro vstup písmene (bez diakritiky) se vstupující znak chr(Z) připojí k již zadané části klíče SKey; takto rozšířený klíč se v souboru zase hledá (Seek SKey)

    Hledání sice proběhne, ale v okně W1 pro Browse by se jeho stav nezobrazil. Abychom dosáhli změny v zobrazení, po hledání příkazem KeyBoard vnutíme čtení znakové kombinace (pro umístění kurzoru Browse na první ze zobrazených polí) a pak (proceduru Proxim tak vyvoláme znovu). Tak se bude vyžadovat vstup dalšího znaku atd.

    Celý tento postup obsahuje připojený program, který má spíše ilustrovat možný postup. Vzhledem k implementačním detailům v konkrétních situacích se nesnažíme o zápis algoritmu ve tvaru procedury, která by se přímo převzala do aplikace. Pro jiný soubor a jinou komunikaci při zadávání klíče se uvedený text snadno upraví.

    * * Příklad inkrementálního hledání * Set Talk Off Set Bell Off Set Near On && nutné nastavit Set Exact Off && nutné nastavit Set Escape Off && <Esc> zde použito v Browse private SKey,A && klíč SKey definován pro Proxim globálně Define window W1 from 1,4 to 20,64 color N/W,W+/N title ' Studenti ' Define window W2 from 24,0 to 24,79 none && komunikační okno Use student.dbf index student.idx && DB soubor a jeho index Set function F2 to '' && akce pro stisk <F2> On key label F2 do Proxim Activate window W2 do while .T. Clear @0,4 say 'F2 ... zadání klíče pro vyhledání' Activate window W1 Skey='' Browse fields PRIJMENI,JMENO,DATNAR,ROCNIK noedit in window W1 Activate window W2 && dotaz na pokračování v okně W2 Clear A='Ano' @0,0 say 'Znovu? ' get A pict '@M Ano,Ne ' read if A='Ne ' Exit endif enddo Release windows On key label F2 Set function F2 to 'SET;' && stand./jiné obnovení F2 Use return * procedure Proxim && procedura inkrementálního vyhledávání private Z,C Activate window W2 Clear @0,4 say 'Klíč: '+SKey C=InKey(0) Activate window W1 if C>0 && kontrola na klávesy Fn Z=chr(C) do case case C=13 or C=27 && pro <Enter> a <Esc> KeyBoard chr(27) && konec Browse * * Zde jen ukončíme prohlížení, ale obecně se budou * volat procedury odpovídající stisku zvolených * řídicích (kombinací) kláves. Následuje akce pro * znaky přípustné v klíči (zde jen písmena): * case Upper(Z)>='A' and Upper(Z)<='Z' SKey=SKey+Z && rozšíření klíče Seek SKey && a vyhledání KeyBoard '{Ctrl+Home}' && nastav. kurzoru Browse KeyBoard '{F2}' && a znovu Proxim, ale z Browse endcase endif return *


  • Pascal - hlavní
    Překladače
    Vlastní články
    Převzaté články
    Věci na stáhnutí
    Odkazy k tématu
    BP7 buglist
    Chyba Run-time 200

    BASIC