Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Suche in Datenbank (TTable) mit Joker am Anfang (https://www.delphipraxis.net/163916-suche-datenbank-ttable-mit-joker-am-anfang.html)

delphin 21. Okt 2011 12:24

Datenbank: Paradox • Version: 7 • Zugriff über: BDE

Suche in Datenbank (TTable) mit Joker am Anfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Datenbänkler,

ich habe mich in das Thema Datenbanken eingearbeitet und versucht das im Netz verfügbare Demo
http://www.delphi-treff.de/tutorials/datenbanken/ nachzuvollziehen.

Nunmehr habe ich eine Datenbank, in der ich
Delphi-Quellcode:
//LESEN über:
Edit1.Text:=Table1.FieldByName('Name').AsString;
und
Delphi-Quellcode:
//SCHREIBEN über
Table1.Edit;
Table1.FieldByName('Name').AsString:=Edit1.Text;
Table1.Post;
kann.

Auch die SUCHE über
Delphi-Quellcode:
//Suche via
Table1.Filtered:=false;
Table1.Filter:='Name=''Mustermann''';
Table1.Filter:='';
bringt mir in meinem mit der Datenbank verküpften DBGrid die entsprechende Filterung.

Selbst die SUCHE mit Jokern am Ende des Stringes
Delphi-Quellcode:
//Suche mit Joker am Ende via
Table1.Filtered:=false;
Table1.Filter:='Name=''Muster*''';
Table1.Filter:='';
funktioniert und listet alle Namen mit Muster* im DBGrid auf.

Suche ich aber mit Joker am Anfang der Art '*mann'
Delphi-Quellcode:
//Suche mit Joker am Anfang via
Table1.Filtered:=false;
Table1.Filter:='Name=''*mann''';
Table1.Filter:='';
bleibt die DBGrid-Liste leer.

Nach nächtlicher Suche habe ich heute morgen einen Kommentar gefunden, dass diese Art Suche nur mit TQuery über SQL gehen soll.http://www.delphipraxis.net/images/s...n_rolleyes.gif

Nun verstehe ich aber nicht, ob ich meine bisherige Datenbank inkl. Quelltext auf SQL umstellen muss oder die Komponente Query(DBTables) von der BDE-Komponente nur einfügen und mit TTable verbinden soll?

Auch die Diskussion "TQuery oder TTable?" http://www.delphipraxis.net/15457-tq...er-ttable.html bringt einen Datenbankanfänger nicht wirklich weiter in der Frage, ob:
1. Suche entweder mit TQuery oder TTable
oder
2. Suche mit TQuery in TTable
gemeint ist.

Natürlich habe ich schon versucht die o.g. Komponenten einzufügen, bei der

Suche via
Delphi-Quellcode:
//Suche mit Joker am Anfang via
with Query1 do
begin Close;
      SQL.Text := 'SELECT * FROM BESTAND WHERE (Name like :suche)';
      ParamByName('suche').asString := '%mann';
      Open;
end;
bleibt des DBGrid aber ungefiltert!

Vielleicht habe ich ja die Komponente TQuery von DBTables auch nur falsch verknüpft? Ich habe da so ein merkwürdiges Fragezeichen, dass ich nicht wegbekomme, aber beim Kompilieren auch keinen Fehler verursacht.
Bin für jede Hilfe dankbar.

Gruß Gerd

Anmerkung: Die Diskussion über Paradox und BDE habe ich bereits in aller Ausführlichkeit gelesen. Hier geht es mir nur um das Verstehen von Datenbaken. Da ich aber zur Erstellung (bzw. Umstellung) auf SQL keine so einfach Anleitung gefunden habe, habe ich die Sache damit begonnen.http://www.delphipraxis.net/images/s.../icon_wink.gif

mkinzler 21. Okt 2011 12:31

AW: Suche in Datenbank (TTable) mit Joker am Anfang
 
Was steht in im Parameter suche? Bei SQL lautet der Joker %

joachimd 21. Okt 2011 12:31

AW: Suche in Datenbank (TTable) mit Joker am Anfang
 
Zitat:

Zitat von delphin (Beitrag 1131695)
Suche ich aber mit Joker am Anfang der Art '*mann'
Delphi-Quellcode:
//Suche mit Joker am Anfang via
Table1.Filtered:=false;
Table1.Filter:='Name=''*mann''';
Table1.Filter:='';
bleibt die DBGrid-Liste leer.

probiere mal den $-Operator stattdessen: (Text $ Feld)
Delphi-Quellcode:
//Suche mit Joker am Anfang via
Table1.Filtered:=false;
Table1.Filter:='''mann'' $ Name';
Table1.Filter:='';
mit SQL musst Du wahrscheinlich beide Seiten betrachten:

Delphi-Quellcode:
//Suche mit Joker am Anfang via
with Query1 do
begin Close;
      SQL.Text := 'SELECT * FROM BESTAND WHERE (Name like :suche)';
      ParamByName('suche').asString := '%mann%';
      Open;
end;

delphin 21. Okt 2011 13:21

AW: Suche in Datenbank (TTable) mit Joker am Anfang
 
Hallo mkinzler,

was meinst Du mit:
Zitat:

Zitat von mkinzler (Beitrag 1131698)
Was steht in im Parameter suche?

Ich dachte, das "suche"..
Delphi-Quellcode:
//Suche mit Joker am Anfang via
with Query1 do
begin Close;
      SQL.Text := 'SELECT * FROM BESTAND WHERE (Name like :suche)';
      ParamByName('suche').asString := '%mann';
      Open;
end;
..die Übergabevariable für den Suchstring ist?

Um alle Klarheit zu beseitigen:
================================
--> "BESTAND.DB" ist meine Paradoxdatenbank
--> "Name" ist mein Spaltenbezeichner
--> "%mann" ist der Suchbegriff, der aus der Spalte alle Namen mit "*mann" auflisten soll.

Was ist eigentlich mit den Fragezeichen bei der TQuery-Definition ?
Und wie verknüpft man TQuery mit einer TTable1 ? (Falls das ja überhaupt geht)

Gruß Gerd

delphin 21. Okt 2011 13:34

AW: Suche in Datenbank (TTable) mit Joker am Anfang
 
Hallo joachimd,

Zitat:

Zitat von joachimd (Beitrag 1131699)
Zitat:

Zitat von delphin (Beitrag 1131695)
Suche ich aber mit Joker am Anfang der Art '*mann'
Delphi-Quellcode:
//Suche mit Joker am Anfang via
Table1.Filtered:=false;
Table1.Filter:='Name=''*mann''';
Table1.Filter:='';
bleibt die DBGrid-Liste leer.

probiere mal den $-Operator stattdessen: (Text $ Feld)
Delphi-Quellcode:
//Suche mit Joker am Anfang via
Table1.Filtered:=false;
Table1.Filter:='''mann'' $ Name';
Table1.Filter:='';

Ist jetzt der Spaltenname und der Suchbegriff nicht vertauscht?

Meine Tabellenspalte heißt ja name und gesucht werden alle Namen mit '*mann*' an irgeneiner Stelle.
So bekomme ich jedenfalls einen Laufzeitfehler:

Und mit der Sucher der Art:
Delphi-Quellcode:
Filtered:=false;
Table1.Filter:='Name=''$mann''';
Filtered:=true;
bleibt mein DBGrid auch leer.

Zitat:

mit SQL musst Du wahrscheinlich beide Seiten betrachten:

Delphi-Quellcode:
//Suche mit Joker am Anfang via
with Query1 do
begin Close;
      SQL.Text := 'SELECT * FROM BESTAND WHERE (Name like :suche)';
      ParamByName('suche').asString := '%mann%';
      Open;
end;

Bei der Suche mit TQuery tritt genau wie mit der Suche '*mann' keinerlei Filterwirkung auf dem DBGrid ein. Ich bekomme alle Einträge der Liste angezeigt.

Ich denke, der Fehler steckt irgendwo in meiner Verknüpfung von TQuery mit TTable bzw. DBGrid.

Trotzdem vielen Dank
Gruß Gerd

joachimd 21. Okt 2011 23:46

AW: Suche in Datenbank (TTable) mit Joker am Anfang
 
Zitat:

Zitat von delphin (Beitrag 1131722)
Ist jetzt der Spaltenname und der Suchbegriff nicht vertauscht?

nein. $ ist kein Joker, sondern ein Operator.

ConnorMcLeod 22. Okt 2011 06:56

AW: Suche in Datenbank (TTable) mit Joker am Anfang
 
Es gibt hier viel zu sagen, was (zumindest auf den ersten Blick) hier falsch verstanden wird, aber die Antwort zu einer schnellen Lösung ist: das TTable-Objekt hat ein Event OnFilterRecord , in dem Du bestimmen kannst, ob ein Datensatz angezeigt werden soll. Da kannst Du mit ganz normalem Delphi-Code herausfinden, ob der DS Deinen Kriterien entspricht. Ist vllt nicht super performant, aber ich schätze, hier genügt es.

Perlsau 23. Okt 2011 19:07

AW: Suche in Datenbank (TTable) mit Joker am Anfang
 
Zitat:

Zitat von delphin (Beitrag 1131695)
Hallo Datenbänkler,

Nun verstehe ich aber nicht, ob ich meine bisherige Datenbank inkl. Quelltext auf SQL umstellen muss oder die Komponente Query(DBTables) von der BDE-Komponente nur einfügen und mit TTable verbinden soll?

TQuery und TDataset ersetzen TTable jeweils vollständig. Für eine ganz einfache Darstellung einer Datenbank-Tabelle ist TTable vollkommen ausreichend. Möchtest du jedoch umfanngreiche Manipulationen an der Datenbank vornehmen wie z.B. Filterung, sind TDataset oder TQuery deine Freunde. Das heißt, du verwendest statt einer TTable-Komponente ein TQuery (da du offenbar mit der völlig veralteten Borland Database Engine [BDE] arbeitest, hast du kein TDataset zur Verfügung).

Setze also dein TQuery auf dein Datenmodul oder deine Form, stelle die im Objektinspektor (OI) Databasename ein und doppelklicke im OI auf das Feld mit der Bezeichnung SQL. Es erscheint ein Stringlisten-Editor, in dem du deinen SQL-String eingibst:
Code:
select * from Tabelle
wobei Tabelle den Namen bezeichnet, den die entsprechende Tabelle in der Datenbank besitzt. Danach schaltest du im OI das Property Active auf true. Dieselbe Vorgehensweise kannst du auch im Code vornehmen. Gehen wir davon aus, dein TQuery heißt Q_Adresse und deine Tabelle Adressen:
Delphi-Quellcode:
Q_Adresse.Active := false;
Q_Adresse.SQL.Clear;
Q_Adresse.SQL.Append('select * from Adressen');
Q_Adresse.Active := true;
Möchtest du deine Tabelle nun filtern, kannst du das entweder im SQL-Feld tun:
Delphi-Quellcode:
Q_Adresse.Active := false;
Q_Adresse.SQL.Clear;
Q_Adresse.SQL.Append('select * from Adressen where Name=Mustermann');
Q_Adresse.Active := true;
oder eben mittels der eingebauten Filterfunktion:
Delphi-Quellcode:
Q_Adresse.Filtered := false;
Q_Adresse.Filter  := 'Name=Mustermann';
Q_Adresse.Filtered := true;
Die zweite Lösung hat die Vorteile, daß du erstens nicht ständig die Verbundung zur Tabelle trennen und wieder herstellen mußt und daß sie zweitens kürzer ist.

Selbstverständlich kannst du dasselbe auch mit der TTable-Komponente erreichen, die ebenfalls über ein Filter-Property verfügt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz