Szűrés adatok Delphi, számítógép dokumentációjában tól Z-ig

Szűrés adatok Delphi

Azt akarom mondani, hogy néhány hasznos módja az adatok szűrésére lehet alkalmazni, hogy a hatás eléréséhez a szűrési adatok, ahogy írja be a keresett szöveget. Például a tábla olyan oszloppal „Vezetéknév”, a felhasználó belép a keresőmezőbe következetesen alakú levelek és az adatok szűrjük (kiesnek) - a felhasználó lépett az első bukovku és megjeleníti az összes nevet, hogy kezdődik az első betű, akkor csak azokat, amelyek kezdődik az első és a második, és így tovább. d. amíg nem talál. valami hasznos vagy semmi sem fog. Ie szűrés következik be nem teljes véletlen részeként egy string input a felhasználó által. Amint azt bemutatjuk több módon szűréssel mezőket.

Egy kis elmélet.

Fő előnye a szűrők a keresés, hogy akkor lehet alkalmazni, a szűrő nélkül előkészítő intézkedés egy adathalmazt, mint a szűrők ne használjon indexet. Egy mínusz - a szűrést végeznek lassabb, mint a keresési index alapján.

Két lehetőség van, amellyel beállíthatja a szűrő állapotát. Használhatja őket külön-külön vagy egyszerre mindkettőt.
Az első - a karakterlánc értékét az ingatlan Filter.
A második - ez a feltétel leírt eseménykezelő OnFilterRecord.
Szűrés kezdődik, amint az ingatlan szűrjük. Úgy True.

Az ingatlan Filter.

Először leírom kínált lehetőségek Filter tulajdon, és a második része a fejezet elmagyarázza, hogyan lehet használni OnFilterRecord esemény. Ez a tulajdonság szűrőt kell használni elsődlegesen Ez ad egy jelentős teljesítménynövekedés feldolgozása során nagy adathalmazok térfogat (szemben OnFilterRecord esemény). Ez különösen észrevehető, ha egy nagy rekordok száma a táblázatban (

több mint 100.000), és persze sok múlik a kapacitás a gép. Egy kis mennyiségű adatot kell feldolgozni, a különbség nem észrevehető sebesség.

Nos kezdeni. Tegyük fel, hogy van egy tábla a mezőket, Utónév, Középső név. Kell szűrni az adatokat az egyik mező (választott), azaz A felhasználónak meg kell választani, hogy mely mezők szűrni az adatokat. Azok számára, akik az „mező” és a „oszlop” a tartályban - lásd ugyanezt.
A feladat az, hogy kiszűrje az ilyen adatok beírás a keresési karakterláncot az Edit.

Dobd alkatrészek formájában Combobox és Edit. Combobox fogják használni, hogy válassza ki az oszlopot, és a keresési szó szerepel a szerkesztése. Töltsük fel a tételek a vagyon Combobox oszlop nevét. Tedd a stílus tulajdona Combobox egyenlő csDropDownList (úgy, hogy a hit nem adták). Aztán az eseménykezelő Edit1Change írni a következő:

eljárás TForm1.Edit1Change (Sender: TObject);
kezdődik
Ha a length (Edit1.Text)> 0, akkor
kezdődik
ADOTable1.Filtered: = false;
ADOTable1.Filter: = Combobox1.Text + 'hasonló' + # 39 + Edit1.Text + '%' + # 39;
ADOTable1.Filtered: = true;
vég
mást ADOTable1.Filtered: = false;
végén;

F9 - íme. Mint látható, ez elég egyszerű. Code tiszta és egyszerű. Mindenesetre, lefordítom magyarra - ha szerkesztése nem üres (üres fly hiba), tiltsa le a szűrőt, alkotó szűrő húr, indítsa el a szűrést, ha az üres szerkesztése - disable szűrés.

A legegyszerűbb esetben, ha nem adja meg a lehetőséget, hogy válasszon egy adott oszlopban, és a szűrő egy adott területen (pl „name”), a szűrőt húr a következők lennének:

ADOTable1Fil.Filter: = 'nevet, mint' + # 39 + Edit1.Text + '%' + # 39;

A string-szűrő mellett a következőket jelenti -, hogy kiválasszuk azokat a bejegyzéseket az oszlop „NAME” kezdetű azonos karaktereket beírt Edit1.Text.
Fordítson különös figyelmet a hiányosságokat - „elveszett” a tér - nem fog működni.

Kulcsszó, mint teszi ki egy sablont összehasonlítani szálakat. Tehát szükség van tudni, hogy a következő:
szimbólum „_” (aláhúzás) - minden karakterhez illeszkedik
A karakter a „%” (százalék) - helyettesít bármilyen karaktersor.

Badge # 39 - számát jelzi karakter (aposztróf) ASCII kódtábla. Az a tény, hogy az érték a szűrés kell megadni aposztrófok, valamint az aposztróf jelet használnak húrok Delphi korlátozások az, hogy egy-egy idézet szöveg, meg kell tenni kétszer. Design # 39 + Edit1.Text + '%' + # 39 azonos a '' '' + Edit1.Text + '%' + '' ''. Ha az első lehetőség nem igaz egyszer poponyatnee. Ön is használja különleges. funkció QuotedStr, amely visszaadja a karakterlánc által határolt aposztróf jelet.
Általában a következő három lehetőség alkotó vonalak pontosan ugyanazt a munkát, és melyik verzió könnyebb használni, döntsd el magad.

ADOTable1.Filter: = 'nevet, mint' + '' '' + Edit1.Text + '%' + '' '';
ADOTable1.Filter: = 'nevet, mint' + QuotedStr (edit1.Text + '%');
ADOTable1Fil.Filter: = 'nevet, mint' + # 39 + Edit1.Text + '%' + # 39;

Menj előre. Ha például, hogy vizsgálja meg az esetleges előfordulása a keresési karakterláncot a nyilvántartásban, és nem az első karakter, a szűrő húr a következők lennének:

ADOTable1.Filter: = 'nevet, mint' + # 39 + '%' + Edit1.Text + '%' + # 39;

Észrevettük, a '%' előtt Edit1.Text? Fordításban - választják ki azokat a bejegyzéseket az oszlop „NAME”, ami egy karaktersor, amely beírt Edit1.Text.

Mindez rendben van, de gyakran kell szűrni a több oszlop. Akkor kell alkalmazni egy kicsit mások. Design.
Adjunk hozzá két további komponenseket az Edit formában. Combobox nem fogja használni, akkor törölheti azt, ahogyan mi minden területen (Edit) feladata lesz a bemeneti információk egy adott oszlopban. Még hozzá egy gombot, akkor elindul a szűrés. Úgy tűnt, hogy a következő építési működik megfelelően:

eljárás TForm1.Button1Click (Sender: TObject);
kezdődik
ADOTable1.Filtered: = false;
ADOTable1.Filter: = 'nevet, mint' + # 39 + Edit2.Text + '%' + # 39 + 'és' + 'nevet, mint' + # 39 + Edit3.Text + '%' + # 39 + 'és' + 'apai MINT' + # 39 + Edit4.Text + '%' + # 39;
ADOTable1.Filtered: = true;
végén;

Dolgozik, de csak akkor, ha az adat szerepel mindhárom területen. Ha az egyik beviteli mezők (Edit) - üres hiba veszi „Az érvek a rossz típus”.
Azonban van egy módja annak, hogy foglalkozni vele. Először is, a kód:

eljárás TForm1.Button1Click (Sender: TObject);
var filtr, // kialakított szűrő húr
add: string;
kezdődik
ADOTable1.filtered: = false;
filtr: = '';
Ha a length (edit2.text)> 0, akkor
filtr: = 'nevet, mint' + # 39 + Edit2.Text + '%' + # 39;

Ha a length (edit3.text)> 0, akkor
kezdődik
Ha a length (filtr)> 0, akkor hozzá: = 'és' mást hozzá: = '';
filtr: = filtr + Add + 'nevet, mint' + # 39 + Edit3.Text + '%' + # 39;
végén;

Ha a length (edit4.text)> 0, akkor
kezdődik
Ha a length (filtr)> 0, akkor hozzá: = 'és' mást hozzá: = '';
filtr: = filtr + Add + 'patroním MINT' + # 39 + Edit4.Text + '%' + # 39;
végén;

Ha a length (filtr)> 0, akkor
kezdődik
ADOTable1.Filter: = filtr;
ADOTable1.filtered: = true;
vég
mást ShowMessage (Minden mező üres! ');

Ennek a jelentősége, hogy ellenőrizni kell az üres beviteli mező, vagy sem, majd alkotó szűrő húr. Sőt, mivel a második beviteli mezőt, és annak szükségességét, hogy ellenőrizze a szűrő vonalat. Szükséges, hogy a megfelelő képződését a következő sorban.
Például, ha Edit2 mező (utolsó) üres, és ennek megfelelően a szűrő lesz üres string (filtr: = „”). és például, Edit3 mező (NAME) van töltve, ez azt jelenti, a szűrő karakterlánc formájában 'nevet, mint' + # 39 + Edit3.Text + '%' + # 39.
helyett 'és' + 'nevet, mint' + # 39 + Edit3.Text + '%' + # 39. (Azaz anélkül, „és” első).
A következő kódrészlet és végrehajtja:


Ha a length (edit3.text)> 0, akkor
kezdődik
Ha a length (filtr)> 0, akkor hozzá: = 'és' mást hozzá: = '';
filtr: = filtr + Add + 'nevet, mint' + # 39 + Edit3.Text + '%' + # 39;
végén;
.

Ismét lefordítani - Edit3 ha nem üres, akkor ellenőrizze a szűrőt vonal (szűréshez, por), ha nem üres, majd hozzáadjuk a szűrő STORKE „és” + „nevet, mint” + # 39 + Edit3.Text + „%” + # 39, ha üres akkor egyszerűen 'nevet, mint' + # 39 + Edit3.Text + '%' + # 39.

Minden. Kiosztása után kialakult string (szűréshez, por) ADOTable1.Filter tulajdon és szűrés futni.


Ha a length (filtr)> 0, akkor
kezdődik
ADOTable1.Filter: = filtr;
ADOTable1.filtered: = true;
vég
mást ShowMessage (Minden mező üres! ');
.

Ennek megfelelően, ha ebben a szakaszban filtr = „”, akkor sem a mezők nem töltött, mint és kimenetre egy megfelelő felirattal.

A magyarázat egy kicsit zavaros, de érdemes egy közelebbi pillantást a kódot, és minden világossá válik. Ami a jövőt illeti, azt fogja mondani, hogy ha az esemény OnFilterRecord, hogy meg kell vizsgálni a jelenlétét karaktereket a beviteli mezőbe eltűnik (vagyis. Ez sokkal kényelmesebb és könnyebben használható), de ha esik filtrációs ráta. De az is megfigyelhető, csak a feldolgozása a nagy mennyiségű adathalmazok. Végül azt mondom, kivéve működés és fel lehet használni, és más logikai műveleteket, vagy sem, xor. kialakításakor szűrő-line körülmények között több oszlop, bár egy ilyen igény felmerül ritkán.
Nem lehet skachatrabochy például a szűrés alapján tulajdonságait Filter.

Foglalkozunk esemény OnFilterRecod.
Nézzük meg az eljárást fejléc

eljárás TForm1.Table1FilterRecord (DataSet: TDataSet; var elfogadás: logikai érték);

DataSet - szűrt adathalmaz nevét. Fogadja logikai típusú, ami azt jelenti, lehet, hogy két érték igaz -, hogy a felvétel hamis - elutasítja. Akik nem barátok az angol fordítás: elfogadja -Adopts, hogy egyetértenek.
Az alapelv az, hogy - a OnFilterRecord felvezető végigmegy az összes rekordot az egy adott területen (mezők) a táblázat adatai megfelelnek a szűrési feltételeket.
Az egyértelműség kedvéért, néhány példa:
Hadd emlékeztessem önöket, hogy ismét a Accept - logikai változó, ami azt jelenti, logikai műveletek (= <>, <,>, <=,>=, És, vagy, nem) hozzárendelni valamilyen értéket.
Tegyük fel, hogy a táblázat mezőt év és hó amelyek egész típusú, és tartalmazza az év, hónap születési valaki mást.

TForm1.Table1FilterRecord (DataSet: TDataSet; var elfogadás: logikai érték);
kezdődik
Elfogadás: = (DataSet [ 'ÉV']> 1973);
végén;
Valahol a programban
...
Table1.Filtered: = true;
...

Ennek eredményeként DBGrid kijelző rekordok, ahol a mező értéke évente több mint 1973.
Ha írsz egy felvezető ezt a sort:

Elfogadás: = (DataSet [ 'ÉV']> 1973) és ((DataSet [ 'HÓNAP']> 5) és (DataSet [ 'HÓNAP'] <9));

A megjelenített bejegyzések azok az emberek, akik azt követően születtek, 1973 nyarán.
Azt hiszem, minden világos - DataSet [ „oszlop_neve”] „húzza” a következő érték a megadott oszlop bejegyzést, majd elfogadás: = nekotoroe_logicheskoe_uslovie;
Annak érdekében, a kísérlet beállításakor elfogadás: = true; és hogy az összes rekordot, ha Accept: = false; - nincs.

Ha valamilyen okból szeretne fellebbezni a DataSet nem a oszlop nevét, és annak számát, akkor DataSet.Fields tervezés [oszlop_száma] .AsString DataSet helyett [ „oszlop_neve”].

Az elmélet befejeződött, lépni a gyakorlatban.

Mondjuk a tábla NÉV mezőt (string típusú) és egy bemenet keresési karakterláncot - Edit1.
Azt kell, hogy amikor belépett a következő karakter egy szűrési (először az első karakter, akkor az első és a második, és így tovább). Más szóval, meg kell adnia egy olyan állapot, OnFilterRecord és eseménykezelő futtatásához OnEdit1Change szűrés - Table1. Szűrt: = true;.
Így kezdődik szobrászat OnFilterRecord.

Továbbra is csak a fokozzák a felvezető, ahogy azt már említettük OnEdit1Change ilyen esemény:

eljárás TForm1.Edit1Change (Sender: TObject);
kezdődik
table1.Filtered: = false;
table1.Filtered: = true;
végén;

Ez minden. Majdnem. Van egy másik módja annak, hogy „karakterenként” szűrés, de működik egy kicsit, mint az előző példában. Először a kód:

eljárás TForm1.Table1FilterRecord (DataSet: TDataSet; var elfogadás: logikai érték);
kezdődik
elfogadja: = pos (Edit1.Text, DataSet [ 'name'])<>0);
végén;

Pos keres részstringjének funkciója belépő a húr, ha azt a rész megtalálható visszatér a helyzet előfordulása a megadott karaktersorozatot a megadott karakterlánc, de nem vagyunk érdekeltek, ez érdekes, hogy ha a megadott string nem egy adott karaktersorozatot, akkor a függvény nulla. Azaz, ha bárhol a sort, amely a nevét (nem csak az első betű, és ez a különbség) megtalálható a kívánt szimbólumok kombinációja, a bejegyzés elfogadott.
Ha a szűrést kell a kis- és nagybetűket betűk a sor a következőképpen néz ki:

Ja, és néha meg kell tudni, hogy hány rekord szűrjük a DataSet, akkor használja a RecordCount tulajdonság. Visszaadja az aktuális rekordok száma az adatbázisba. Például, akkor használja az alábbi szerkezetet:

Ebben az esetben meg lehet helyezni a kimeneti OnEdit1Change esemény után azonnal aktiválja a szűrési eljárás.
Itt lehet letölteni egy működő példa a szűrés alapján OnFilterRecord eseményeket.

PS. Mind a módszerek megvannak a maga előnyei és hátrányai. Szűrés ingatlan ad jelentős nyereséget feldolgozási sebesség és OnFilterRecord esemény sokkal „rugalmas” és könnyebben használható. Szűrőkezelési ingatlan azokban az esetekben, ha meg tudod csinálni anélkül, hogy a használat OnFilterRecord.
Ha mindkét módszert, érdemes megjegyezni, hogy az eseménykezelő kiegészíti, nem pedig helyettesíti a Filter tulajdonság, vagyis ha szűrés engedélyezve és a St-szűrő tartalmaz egy szűrőt érték, egy eseménykezelő OnFilterRecord és szűrőt (Filter) kapcsolódó logikai összefüggés " ÉS „(mindkettő).


Könyvjelző hozzáadása az anyagot:

Kapcsolódó cikkek