Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Suche in der Datenban und Ausgabe im DBGrid??? (https://www.delphipraxis.net/52850-suche-der-datenban-und-ausgabe-im-dbgrid.html)

romber 5. Sep 2005 13:45

Datenbank: MSSQL Server • Version: 2000 • Zugriff über: ADO

Suche in der Datenban und Ausgabe im DBGrid???
 
Hallo!

Ich habe einen DBGrid, der über ADOTable mit der Datenbank auf dem MSSQL Server verbunden ist. Im DBGrid werden alle Spalten und alle Datensätze angezeigt. Ich möchte jetzt so eine Filter-Funktion einbauen, die alle Spalter aller Datensätze nach einem Suchbegriff durchsucht und die Treffer in demselben DBGrid anzeigt. Mit "Treffer" sind die Datensätze gemeint, in den der Suchbegriff gefunden wurde. Wie mache ich das?

Bernhard Geyer 5. Sep 2005 13:47

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Du nimmst TADODataset und arbeitest mit Queries:

Delphi-Quellcode:
ADODataset.CommandText := 'SELECT * FROM MeineTabelle where MyFeld = :MyFeld';
ADODataset.ParamByName('MyFeld').AsString := 'xyz';

romber 5. Sep 2005 16:30

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Danke für schnelle Antwort!

Ich habe in einem anderen Beispiel die Lösung gefunden:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var s: String;
begin
  with ADOQuery1 do
  begin
    active := false;
    sql.clear;
    s := '%' + Edit1.Text + '%';
    sql.add('SELECT * FROM KUNDEN WHERE LOWER(kn) LIKE :suche');
    ParamCheck := true;
    Parameters.ParamByName('suche').Value := LowerCase(s);
    active := true;
    open;
  end;
end;
Ich möchte aber nicht nur die Spalte "kn" durchsuchen, sondern auch einige anderen Spalten. Wie soll in diesem Fall meine WHERE aussehen?

Mr_G 5. Sep 2005 16:45

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Ich bin mir nicht sicher aber könnte man das dann nicht mit OR verknüpfen?
Etwa so:
SQL-Code:
SELECT * FROM KUNDEN WHERE (LOWER(kn) LIKE :suche) OR (LOWER(xy) LIKE :suche)

romber 5. Sep 2005 17:49

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Zitat:

Zitat von Mr_G
Ich bin mir nicht sicher aber könnte man das dann nicht mit OR verknüpfen?
Etwa so:
SQL-Code:
SELECT * FROM KUNDEN WHERE (LOWER(kn) LIKE :suche) OR (LOWER(xy) LIKE :suche)

Wäre logisch. Ich habe es auch versucht, SQL meldet zwar kein Fehler, es wird trotzdem nur die erste Bedingung erfüllt. Noch Ideen?

Sharky 5. Sep 2005 17:55

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Hai romber,

hast Du einmal versucht für die zweite "Like-Abfrage" einen eigenen Parameter anzugeben (:suche2)?
Nicht das da etwas bei der Parameter Zuweisung falsch läuft.

romber 5. Sep 2005 18:05

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Nee, geht auch nicht :(

marabu 5. Sep 2005 19:01

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Hi romber,

ob es das gewünschte Ergebnis bringt, steht auf einem anderen Blatt, aber funktionieren sollte das hier:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  i: Integer;
begin
  with ADOQuery1 do
  begin
    s := '%' + AnsiLowercase(Edit1.Text) + '%';
    sql.Clear;
    sql.Add('SELECT * FROM KUNDEN WHERE LOWER(kn) LIKE :suche ');
    sql.Add('OR LOWER(xy) LIKE :suche ');
    sql.Add('OR LOWER(yz) LIKE :suche ');
//  for i := 0 to ParamCount - 1 do // Danke Sharky für deine Korrektur
    for i := 0 to Parameters.Count - 1 do
      Parameters.Items[i].Value := s;
    open;
  end;
end;
Grüße vom marabu

romber 5. Sep 2005 19:10

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Zitat:

Zitat von marabu
Hi romber,

ob es das gewünschte Ergebnis bringt, steht auf einem anderen Blatt, aber funktionieren sollte das hier:

Tut es aber nicht :(

Mr_G 5. Sep 2005 19:14

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Ich weiß ja nicht was rauskommen soll aber kann es sein das LIKE vielleicht nicht das ist was du brauchst? Soweit ich weiß bringt das nämlich nur was bei minnimalen Abweichungen vom Original. Vielleicht suchst du einfach nochmal in die Richtung.

marabu 5. Sep 2005 19:15

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Der Fehler liegt dann aber nicht an diesem Code. Kannst du mal beschreiben was nicht tut?

marabu

romber 5. Sep 2005 19:24

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Ich habe in einer Tabelle fünf Spalten:

kn
name
vorname
plz
ort

Dann ist ein Edit-Feld auf der Form. Ich möchte, dass alle funf Spalten auf den Inhalt dieses Edit-Feldes durchgesucht werden und die Treffer im DBGrid landen, wobei das zweite kein Problem ist. Bis jetzt, egal wie ich die WHERE-Teil aufbaue und wieviele SQL.Add() ich da einfüge, wird nur die Spalte "kn" durchgesucht, obwohl SQL-Syntax

SQL-Code:
...WHERE (LOWER(kn) LIKE :suche) OR (LOWER(name) LIKE :suche) OR (LOWER(vorname) LIKE :suche)...
schon richtig sein sollte. Was denn nun?

marabu 5. Sep 2005 19:27

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Dein SELECT Statement interessiert mich weniger, zeige mal den Code, mit dem du momentan testest.

marabu

romber 5. Sep 2005 19:30

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Delphi-Quellcode:
with ADOQuery1 do
  begin
    active := false;
    sql.clear;
    s := '%' + Edit1.Text + '%';
    sql.add('SELECT * FROM KUNDEN WHERE (LOWER(kn) LIKE :suche) OR (LOWER(name) LIKE :suche)');
    ParamCheck := true;
    Parameters.ParamByName('suche').Value := LowerCase(s);
    active := true;
    open;
  end;

Mr_G 5. Sep 2005 19:37

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Da du ja alle Felder auf ein und den selben Inhalt durchsuchst und die ja vom Inhalt ziemlich verschieden sind würde ich statt LIKE mal IN nehmen.

romber 5. Sep 2005 19:38

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Zitat:

Zitat von Mr_G
Da du ja alle Felder auf ein und den selben Inhalt durchsuchst und die ja vom Inhalt ziemlich verschieden sind würde ich statt LIKE mal IN nehmen.

Wie würde es dann aussehen?

marabu 5. Sep 2005 19:44

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Hi romber,

dein Code enthält nicht die Änderungen, die ich dir empfohlen habe - bist du beratungs-resistent? Durch die mehrfache Verwendung des Parameters :suche kannst du den nicht mehr über den Namen ansprechen, denn jeder Parameter wird in der parameters collection instanziiert. Deshalb mache ich das in einer Schleife. Und entscheide dich für Active True/False oder Open/Close, beides zusammen bringt nix.

marabu

Mr_G 5. Sep 2005 19:48

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Zitat:

Zitat von romber
Zitat:

Zitat von Mr_G
Da du ja alle Felder auf ein und den selben Inhalt durchsuchst und die ja vom Inhalt ziemlich verschieden sind würde ich statt LIKE mal IN nehmen.

Wie würde es dann aussehen?

Ich denke so:
SQL-Code:
...WHERE (LOWER(kn) IN :suche) OR (LOWER(name) IN :suche) OR (LOWER(vorname) IN :suche)...
Aber marabu hat glaube ich Recht. Setz erstmal den Vorschlag von marabu um und wenn dann noch nicht das gewünschte Ergebnis kommt versuche es mit dem IN...

romber 5. Sep 2005 19:51

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Zitat:

Zitat von marabu
..bist du beratungs-resistent?...

@marabu
Ich bin nicht beratungsresistent, ich freue mich sogar sehr, wenn die erfahrene Progger mir helfen. Ich habe dein Kode getestet und es wird sogar die Spalte "kn" nicht mehr durchgesucht. Auf jeden Fall, egal was ich in den Edit1 eingeben, wird nichts gefunden. Sicher hast du irgendwo ein kleines Fehlerchen :)

marabu 5. Sep 2005 19:52

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Hi Jan,

das meinst du nicht wirklich - schau nochmal in die SQL reference.

Das hier wäre eine korrrekte Verwendung des IN Operators:

SQL-Code:
SELECT * FROM table WHERE icol IN (2,3,5,7,11,13)
Und das hier wäre noch eine:

SQL-Code:
SELECT * FROM kinder WHERE muetter_id IN (
  SELECT id FROM muetter WHERE haarfarbe = 'blond'
)
Freundliche Grüße vom marabu

Mr_G 5. Sep 2005 19:58

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
:wall: :wall: :wall:
Verdammt... Dann muss ich mich verlesen haben. Aber wäre ja auch unlogisch wo man ja mit * arbeiten kann.

@ romber: :oops: Sry... Ist wohl schon zu spät für mich.

Sharky 5. Sep 2005 20:42

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Zitat:

Zitat von Sharky
.. hast Du einmal versucht für die zweite "Like-Abfrage" einen eigenen Parameter anzugeben

Zitat:

Zitat von romber
Nee, geht auch nicht

Hai romber,
ich habe es jetzt einmal getestet. Wenn ich nur einen Parameter verwende wird dieser auch nur beim ersten vorkommen in der SQL-Abfrage gesetzt. Darum habe ich einen zweiten genommen und blubb es geht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  with ADOQuery1 do
  begin
    Close;
    sql.Clear;
    s := '%' + Edit1.Text + '%';
    sql.Text := 'SELECT * FROM test1 ' + #10 +
      'WHERE ((LOWER(kn) LIKE :suche1)' + #10 +
      'OR (LOWER(name) LIKE :suche2))';
    ParamCheck := True;
    Parameters.ParamByName('suche1').Value := LowerCase(s);
    Parameters.ParamByName('suche2').Value := LowerCase(s);
    Open;
  end;
end;

romber 5. Sep 2005 23:13

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Hehe! Danke! Geht wunderbar! :thumb:
Würde mich aber noch interessieren, warum es mit dem selben Paramete nicht geht...

Mr_G 6. Sep 2005 06:46

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Ich nehme mal an das wenn er den Parameter ein mal gefunden und erstezt hat, er die Anfrage nicht weiter durchgeht...

Sharky 6. Sep 2005 07:14

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Hai,

ich habe mir das jetzt einmal angesehen.
Das Problem bei der sache ist, wie schon angedeutet wurde, das Delphi-Referenz durchsuchen.ParamByName. Diese Funktion sucht in der Parameterliste nach dem übergebenen Parametername. Beim ersten Auffinden wird das Value gesetzt und dann die Funktion verlassen. Daher das Problem das folgende Parameter mit der gleichen Bezeichnung nicht mit Werten gefüllt werden.

marabu hatte dafür eine "Lösung" gepostet in dem er auf ParamByName verzichtet und die Paramterliste einfach durchgeht und jedem das selbe Value zuweisst.

Allerdings hat der Schlingel einen Fehler in gemacht ;-)
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  i: Integer;
begin
  with ADOQuery1 do
  begin
    Close; // muss sein
    s := '%' + AnsiLowercase(Edit1.Text) + '%';
    sql.Clear;
    sql.Add('SELECT * FROM KUNDEN WHERE LOWER(kn) LIKE :suche ');
    sql.Add('OR LOWER(xy) LIKE :suche ');
    sql.Add('OR LOWER(yz) LIKE :suche ');
    for i := 0 to [b][color=red]ParamCount[/color][/b] - 1 do
      Parameters.Items[i].Value := s;
    open;
  end;
end;
ParamCount liefert nämlich nicht die Anzahl der Parameter in der Parameterliste des Querys sondern die Anzahl der Parameter welche dem Programm übergeben wurden (zB: Programm.exe /1 /2 /3 ).
In diesem Fall müsste der Code so aussehen um das gewünschte Ergebniss zu bekommen:
Code:
.
    for i := 0 to [b][color=red]Parameters.Count[/color][/b] - 1 do
      Parameters.Items[i].Value := s;
.

marabu 6. Sep 2005 09:29

Re: Suche in der Datenban und Ausgabe im DBGrid???
 
Hi Sharky,

Zitat:

Zitat von Sharky
Allerdings hat der Schlingel einen Fehler gemacht

das kommt davon, wenn ich meinen Code in den Beitragseditor schreibe und nebenher für die Firma DESDO arbeite...

Fröhliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 21: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-2025 by Thomas Breitkreuz