Suche mit TQuery

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Michael19692
Beiträge: 18
Registriert: Mi 14. Mai 2014, 21:08
OS, Lazarus, FPC: Win8 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit

Suche mit TQuery

Beitrag von Michael19692 »

Hallo Forum,

der Nerv wieder, ich weiß. Aber in meinen Büchern, Internet und Youtube finde ich nicht die richtige Antwort. Deshalb hoffe ich auf euer Verständnis.

Es geht um die Suchfunktion in meinem Adressbuch. Ich hab nun ein paar Datensätze drin. Wenn ich nun in dem Suchfeld Name einen Namen eintrage und den Button "Suchen" klicke soll im Grid alles das aufgelistet werden, was mit dem Suchbegriff zu tun hat. Also z.B Ich gebe "Brau" ein, dann soll im Grid nach betätigen des Button "Braun, Brause, Brauste usw..." erscheinen.
Nach langem suchen in Foren komme ich zum Schluss das ich das am besten mit einem TQuery und der SQL Abfrage "SELECT * FROM DBNAME ORDER BY Name" realisiert bekomme.

In meinem Test Projekt funktioniert die Abfrage auch, nur muss ich das ganze ja auf den Wert beschränken den ich im Edit1 Feld eingebe. Ich nehme an, das ich dazu die SELECT Anweisung umbauen muss. Aber wie? Zudem weiß ich nicht was ich bei dem ButtonClick hinterlegen muss, damit die Query aufgerufen wird.

Code: Alles auswählen

 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Query1: TQuery;
    Edit1: TEdit;
    Label1: TLabel;
    ButtonSuche: TButton;
    Button2: TButton;
    procedure Edit1Change(Sender: TObject);
    procedure Button2Click(Sender: TObject);    
    procedure ButtonSucheClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;
 
procedure TForm1.ButtonSucheClick(Sender: TObject);
begin
 
end;
 
end.
 
 
Für eure Hilfe schon mal Danke im voraus.

Gruß
Michael


Soner
Beiträge: 724
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Suche mit TQuery

Beitrag von Soner »

Ich nehme an du hast DataSource1, DBGrid1, Query1, Edit1 richtig verbunden. Dann mußt du noch einfach dass machen, schon läuft es automatisch:

Code: Alles auswählen

 
procedure TForm1.ButtonSucheClick(Sender: TObject);
var aSrcTxt : string;
begin
  aSrcTxt:='';
  if InputQuery('Suchen','Geben Sie Suchwort ein:',aSrcTxt) and (aSrcTxt<>'') then begin
    Query1.Close;
    Query1.Sql.Clear;
	 //Du mußt Tabelle mit dein Tabellenname ersetzen
	 //FieldName1 mußt du mit dem Feld aus der Tabelle Ersetzen 
	 // % bewirken dass da ein Zeichen kommen kann aber nicht muß. 
	 Query1.Sql.Add('SELECT * FROM Tabelle WHERE (FieldName1 LIKE ''%'+aSrcTxt+'%'') ORDER BY Sortierspalte');
	 //Anderes Beispiel hier in der TAbelle Adressen nach mehreren Spalten suchen
	 //Query1.Sql.Add('SELECT * FROM Adresse WHERE (Vorname LIKE ''%'+aSrcTxt+'%'') OR (Nachname LIKE ''%'+aSrcTxt+'%'') ORDER BY Nachname');
 
	 Query1.Open;
	 if Query1.RecordCount=0 then ShowMessage('Nichts gefunden!');	
  end;
 
end;
 
Es wird bei SQLite zwischen Groß- und Kleinschreibung nicht unterschieden, aber bei Firebird schon. Deshalb muß man wenn man Firebird verwendet die Zeichenfelder (Char, Varchar) mit "COLLATE UNICODE_CI" definieren, dann wird bei Firebird auch nicht unterschieden.

Vergiß nicht im Internet nach "SELECT WHERE LIKE" zu suchen damit du verstehst was ich gemacht habe, es gibt nette Leute die alles besser beschreiben als ich es jemals kann.

Michael19692
Beiträge: 18
Registriert: Mi 14. Mai 2014, 21:08
OS, Lazarus, FPC: Win8 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit

Re: Suche mit TQuery

Beitrag von Michael19692 »

Hallo Soner,

Danke für Deine Hilfe. Musste es etwas abändern. Der Quelltext sieht nun so aus:

Code: Alles auswählen

 
var aSrcTxt : string;
begin
   DataSource1.DataSet := Query1;
//  aSrcTxt:='';
  aSrcTxt:= edit1.Text;
//    if InputQuery('Suchen','Geben Sie Suchwort ein:',aSrcTxt) and (aSrcTxt<>'') then begin
    Query1.Close;
    Query1.Sql.Clear;
 
Ich muss nur noch wegen dem "COLLATE UNICODE_CI" schauen. Benutze eine Paradox Tabelle. Dort wird auch Groß und Kleinschreibung unterschieden. :)

Das nächste Problem steht auch schon an. :( Mal schauen ob ich was an Tuturials dazu finde.

Gruß
Michael

Soner
Beiträge: 724
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Suche mit TQuery

Beitrag von Soner »

1. DataSource1.DataSet := Query1;
Man sollte Query mit DataSource nicht im Funktion was öfters aufgerufen verbinden, sondern schon vorher einmalig. Am besten nach dem Erstellen. (z.B. in Objektinspektor)
2. Wenn man eine Variable in SQL-Aufrufen hinzufügt sollte es nicht leer sein sonst gibt's fehler. Am besten nach dem:
aSrcTxt:= edit1.Text;
das hinzufügen:
If aSrcTxt='' then exit;

3. "COLLATE UNICODE_CI" gibt's nur bei Firebird. Für Paradox oder andere Datenbanken kannst du UPPER/LOWER funktionen verwenden, z.B.:

Code: Alles auswählen

 
aSrcTxt:= LowerCase(aSrcTxt); //Suchwort in Kleinbuchstaben konvertieren
Query1.Sql.Add('SELECT * FROM Adresse WHERE (LOWER(Vorname) LIKE ''%'+aSrcTxt+'%'') OR (LOWER(Nachname) LIKE ''%'+aSrcTxt+'%'') ORDER BY Nachname');  //LOWER(feldxyz) konvertiert für Vergleich in Kleinbuchstaben.
 
Die SQL-Funktionen LOWER/UPPER sind bei original Paradox enthalten. Ob sie bei TDbf integriert sind weiss ich nicht.

Michael19692
Beiträge: 18
Registriert: Mi 14. Mai 2014, 21:08
OS, Lazarus, FPC: Win8 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit

Re: Suche mit TQuery

Beitrag von Michael19692 »

Hallo Soner,

danke für Deine TIP's. Bin froh das darüber.
Mit dem DataSource1.DataSet mach ich, da ich auf der FORM1 ein DBGRID habe. Beim Starten Verbindet sich das DATASET mit Table1. Wenn ich die Suche laufen lasse wird in dem DBGRID die Query1 ausgegeben. Bei Abbruch Verbinde ich wieder mit Table1.

Zu 2. Supi jetzt weiß ich endlich wie ich abfragen kann, ob es ein Leersatz ist bzw. müsste ich so ja auch die Pflichtfelder abfragen können.
Zu3. Das werde ich natürlich gleich mal versuchen. :)

Gruß
Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Suche mit TQuery

Beitrag von Christian »

Das was du eigentlich machen wolltest also den Datensatz markieren der das Suchwort enthält, erreichst du mit Locate.

if DataSet.Locate('NAME',eSearch.Text,[loCaseInSensitive]) then
Dhowmessage('gefunden');
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Michael19692
Beiträge: 18
Registriert: Mi 14. Mai 2014, 21:08
OS, Lazarus, FPC: Win8 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit

Re: Suche mit TQuery

Beitrag von Michael19692 »

Hallo Christian,

Danke für die Antwort. Habe es so gelöst.

Code: Alles auswählen

 
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
  Form2.Top := Form1.Top;
  Form2.Left := Form1.Left;
  Form2.Height := Form1.Height;
  Form2.Width := Form1.Width;
  Form1.Hide;
  Form2.Show;
end;
 
In der Form2 sind die DBedit Felder die ich schon nutze für die Eingabe der Daten. Diese ist beim DoppelKlick mit der Maus dann im nur lesen Modus. http://www.lazarusforum.de/viewtopic.php?f=55&t=7825
Soner hat geschrieben:Oder TDataSource.AutoEdit auf false setzen, dann kann man nur bearbeiten falls [bearbeiten]-Button von DBNavigator gelickt ist.
Über den Button "Ändern" wechsel ich in den Edit Modus.

Code: Alles auswählen

 
procedure TForm2.ButtonEditClick(Sender: TObject);
begin
  Form1.Table1.Edit;
  DBEdit7.SetFocus;
  ButtonSpeichern.Enabled := True;
end;
 
und mit dem Button "Speichern" schreibe ich den Datensatz dann in die Datenbank zurück.

Code: Alles auswählen

 
procedure TForm2.ButtonSpeichernClick(Sender: TObject);
begin
   Form1.Table1.Post;Form1.Table1.Refresh;
   ButtonSpeichern.Enabled := False;
end;
 
Wenn ich fertig bin stell ich es mal Online. Dann könnt Ihr sehen bei was Ihr geholfen habt.

Gruß
Michael

Michael19692
Beiträge: 18
Registriert: Mi 14. Mai 2014, 21:08
OS, Lazarus, FPC: Win8 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit

Re: Suche mit TQuery

Beitrag von Michael19692 »

Abend Soner,
funktioniert.

Code: Alles auswählen

 
aSrcTxt:= LowerCase(aSrcTxt); //Suchwort in Kleinbuchstaben konvertieren
Query1.Sql.Add('SELECT * FROM Adresse WHERE (LOWER(Vorname) LIKE ''%'+aSrcTxt+'%'') OR (LOWER(Nachname) LIKE ''%'+aSrcTxt+'%'') ORDER BY Nachname');  //LOWER(feldxyz) konvertiert für Vergleich in Kleinbuchstaben
 
Danke Dir....

Gruß
Michael

Antworten