AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Suche in Datenbank (TTable) mit Joker am Anfang
Thema durchsuchen
Ansicht
Themen-Optionen

Suche in Datenbank (TTable) mit Joker am Anfang

Ein Thema von delphin · begonnen am 21. Okt 2011 · letzter Beitrag vom 23. Okt 2011
Antwort Antwort
delphin

Registriert seit: 21. Aug 2003
Ort: Chemnitz
29 Beiträge
 
Delphi 7 Professional
 
#1

Suche in Datenbank (TTable) mit Joker am Anfang

  Alt 21. Okt 2011, 12:24
Datenbank: Paradox • Version: 7 • Zugriff über: BDE
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
Miniaturansicht angehängter Grafiken
fragezeichen-bei-tquery.jpg  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 21. Okt 2011, 12:31
Was steht in im Parameter suche? Bei SQL lautet der Joker %
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 21. Okt 2011, 12:31
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;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
delphin

Registriert seit: 21. Aug 2003
Ort: Chemnitz
29 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 21. Okt 2011, 13:21
Hallo mkinzler,

was meinst Du mit:
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
  Mit Zitat antworten Zitat
delphin

Registriert seit: 21. Aug 2003
Ort: Chemnitz
29 Beiträge
 
Delphi 7 Professional
 
#5

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

  Alt 21. Okt 2011, 13:34
Hallo joachimd,

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
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 21. Okt 2011, 23:46
Ist jetzt der Spaltenname und der Suchbegriff nicht vertauscht?
nein. $ ist kein Joker, sondern ein Operator.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 22. Okt 2011, 06:56
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.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

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

  Alt 23. Okt 2011, 19:07
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz