![]() |
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? |
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'; |
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:
Ich möchte aber nicht nur die Spalte "kn" durchsuchen, sondern auch einige anderen Spalten. Wie soll in diesem Fall meine WHERE aussehen?
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; |
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)
|
Re: Suche in der Datenban und Ausgabe im DBGrid???
Zitat:
|
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. |
Re: Suche in der Datenban und Ausgabe im DBGrid???
Nee, geht auch nicht :(
|
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:
Grüße vom marabu
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; |
Re: Suche in der Datenban und Ausgabe im DBGrid???
Zitat:
|
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.
|
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 |
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:
schon richtig sein sollte. Was denn nun?
...WHERE (LOWER(kn) LIKE :suche) OR (LOWER(name) LIKE :suche) OR (LOWER(vorname) LIKE :suche)...
|
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 |
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; |
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.
|
Re: Suche in der Datenban und Ausgabe im DBGrid???
Zitat:
|
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 |
Re: Suche in der Datenban und Ausgabe im DBGrid???
Zitat:
SQL-Code:
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...
...WHERE (LOWER(kn) IN :suche) OR (LOWER(name) IN :suche) OR (LOWER(vorname) IN :suche)...
|
Re: Suche in der Datenban und Ausgabe im DBGrid???
Zitat:
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 :) |
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:
Und das hier wäre noch eine:
SELECT * FROM table WHERE icol IN (2,3,5,7,11,13)
SQL-Code:
Freundliche Grüße vom marabu
SELECT * FROM kinder WHERE muetter_id IN (
SELECT id FROM muetter WHERE haarfarbe = 'blond' ) |
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. |
Re: Suche in der Datenban und Ausgabe im DBGrid???
Zitat:
Zitat:
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; |
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... |
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...
|
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 ![]() 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:
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 ).
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; 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; . |
Re: Suche in der Datenban und Ausgabe im DBGrid???
Hi Sharky,
Zitat:
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