Nur gesuchte Datensätze im DBGrid anzeigen
Hallo Leute!
So, nach knapp 10 Jahren bin ich wieder zurück. Ich bin gerade dabei ein kleines Kundenverwaltungsprogramm zu erstellen. Hat etwas gedauert bis ich wieder drinn bin. Hab jetzt aber ein kleines Problem noch mit meinem Programm. Soweit funktioniert alles. Ich möchte mein Programm nur etwas verbessern. Mit folgendem Code kann ich nach Datensätzen suchen und diese werden mir auch in der DBGrind markiert angezeigt.
Code:
Es wird, wenn ich nach "Huber" suche, der 1. Huber makiert und angezeigt. Das ist schon richtig so, aber ich möchte NUR alle Huber bzw. alle Personen im DBGrid sehen, die Huber heißen bzw. wo "huber" im Nachnamen vorkommt.
procedure TForm1.BtnSearchClick(Sender: TObject);
begin ADOTable1.First; while NOT ADOTable1.Eof do begin if ADOTable1Nachname.Text = EditSearch.Text then break else ADOTable1.Next; end; end; Könnte mir hier jemand behilflich sein? |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
1. Möglichkeit : Nimm anstelle der ADOTable eine ADOQuery
2. Möglichkeit : Tables haben die Eigenschaft Filter und Filtered |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ich würde in diesem Falle mit einer Query arbeiten
Code:
(funktioniert wenn die DB nicht casesensitive ist)
select wasmanbraucht from Tabelle where Name like '%huber%';
Gruß K-H |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ok, danke mal für die Antworten.
Wenn ich den select befehl für die Query eingebe, was muss ich als Value eingeben, so dass die Werte vom Feld "EditSearch" herangezogen werden? |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
das sollte ungefähr so aussehen:
Code:
wobei Du die entsprechenden Platzhalter (% _) entweder unterwegs dazu packst oder aber dem Benutzer überlässt.
myquery.close;
myquery.sql.text:='select name from tabelle where name like :name'; myquery.sql.parameterbyname('name').asstring:=edit1.text; myquery.open; Gruß K-H |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ich hab es mal so eingebaut.
Ich habe eine neue ADOQuery1 eingebaut und mit meiner ADOConnection1 verbunden. Unter DataSource habe ich meine DataSource1 eingegeben. Weiters hab ich noch eine DataSource2 eingebaut und mein DBGrid mit dieser Verbunden. Diese DataSource2 hab ich dann auch mit der ADOQuery1 verbunden. So, dein Code oben leuchtet mir ein, nur wie baue ich diesen in den Quelltext genau ein? Wenn ich im ADOQuery1 unter Eigenschaften auf SQL klicke, kann ich doch nur den SQL-Code eingeben, oder? |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
So, nun hab ich folgenden Code mal drinn, leider funktioniert dieser nicht:
Code:
Eskommt die Meldung: Undeklarierter Bezeichner: 'parameterbyname'
procedure TForm1.BtnSearchClick(Sender: TObject);
begin ADOQuery1.Close; ADOQuery1.SQL.Text:='select * from kundendaten, where nachname like :name'; ADOQuery1.SQL.parameterbyname('name').asstring:=EditSearch.Text; ADOQuery1.Open; end; |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ja dort gibst du dann die parametrisierte Abfrage ein
Code:
Später z.B. beim Exit des Editfeldes, brauchst du dann nur den Parameter setzen:
select name from tabelle where name like :name;
Delphi-Quellcode:
AdoQuery1.Parameters.ParamByName('name').Value := EditSearch.Text;
if AdoQuery1.Active then AdoQuery1.Refresh else AdoQuery1.Open; |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Code:
Es kommt aber immer noch diese Fehlermeldung bei "parameterbyname" in der Codezeile
procedure TForm1.EditSearchExit(Sender: TObject);
begin ADOQuery1.Parameters.ParamByName('name').Value := EditSearch.Text; if ADOQuery1.Active then ADOQuery1.Refresh else ADOQuery1.Open; end; procedure TForm1.BtnSearchClick(Sender: TObject); begin ADOQuery1.Close; ADOQuery1.SQL.Text:='select * from kundendaten, where nachname like :name'; ADOQuery1.SQL.parameterbyname('name').asstring:=EditSearch.Text; ADOQuery1.Open; end;
Code:
ADOQuery1.SQL.parameterbyname('name').asstring:=EditSearch.Text;
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Schau dir mal die Zuweisung in meinem Code an
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Hallo,
ändere Zitat:
Delphi-Quellcode:
Das hat bereits mkinzler gepostet.
AdoQuery1.Parameters.ParamByName('name').Value := EditSearch.Text;
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ich komm nicht dahinter :(
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Zitat:
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Diese änderung hab ich schon gemacht, aber es kommt jetzt trotzdem eine Fehlermeldung:
Exception-Klasse EDatabaseError mit Meldung "ADOQuery1: Parameter 'name' nicht gefunden". Diese Fehlermeldung tritt hier in der ADOQuery1.Parameters..... auf.
Code:
procedure TForm1.EditSearchExit(Sender: TObject);
begin ADOQuery1.Parameters.ParamByName('name').Value := EditSearch.Text; if ADOQuery1.Active then ADOQuery1.Refresh else ADOQuery1.Open; end; |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Hast du vorher die parametrisierte Abfrage zugewiesen?
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Delphi-Quellcode:
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select * from kundendaten where nachname like :name'; ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text,true); ADOQuery1.Parameters.parambyname('name').Value:='test'; |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Eine einmalige Zuweisung/Vorbereitung sollte aber reichen.
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Gehhh, das kann doch wohl nicht sein.
Das ist jetzt mein Button.
Code:
Wenn ich nun einen Wert in das Feld eingebe und auf suchen klicke, kommt folgende Fehlermeldung:
procedure TForm1.BtnSearchClick(Sender: TObject);
begin ADOQuery1.Close; ADOQuery1.SQL.Text:='select * from kundendaten, where nachname like :name'; ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text,true); ADOQuery1.Parameters.ParamByName('name').Value := EditSearch.Text; ADOQuery1.Open; if ADOQuery1.Active then ADOQuery1.Refresh else ADOQuery1.Open; end; Im Projekt Projekt1.exe ist eine Exception der Klasse EOleException mit der Meldung 'Syntaxfehler in FROM-Klausel' aufgetreten. Anhalten - Fortsetzen - Hilfe |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
SORRY, ich nehme alles zurück.
Hab den Fehler entdeckt! war ein , drinn Jetzt funktioniert die suche wie sie soll. DANKE FÜR DIE HILFE |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Da ist auch ein Komma zu viel.
Zudem Reicht es die Abfarge einmal zuzuweisen und später nur den Parameter neu zu setzen. |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Dann mach das ',' hinter Kundendaten weg, das steht auch bei den Vorschlägen nicht
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ok, hab ich gemacht.
Eine Sache wäre noch: Das mit den Platzhalter vor und dannach. Wo werden die denn eingebaut? |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
An die Stelle an der sonst der Wert steht
Statt
SQL-Code:
Name like '%Müller'
SQL-Code:
Name like :name
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ja schon aber wenn ich dort dies so eingebe
Code:
funktioniert das ganze nicht
where nachname like %:name%
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
SQL-Code:
Und die Joker im Paramter:
where nachname like :name;
Delphi-Quellcode:
ADOQuery1.Parameters.ParamByName('name').Value := '%'+ EditSearch.Text + '%';
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Delphi-Quellcode:
ADOQuery1.Parameters.ParamByName('name').Value := '%' + EditSearch.Text + '%';
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Mensch, eh so einfach. Wo ich überall dies versucht hab....
So, die Suche funktioniert FAST. Ich hab diese jetzt noch um 3 weitere Felder erweitert:
Code:
Ein Problem hab ich noch damit.
procedure TForm1.BtnSearchClick(Sender: TObject);
begin ADOQuery1.Close; ADOQuery1.SQL.Text:='SELECT * FROM kundendaten WHERE nachname LIKE :name OR telefon1 LIKE :telefon1 OR telefon2 LIKE :telefon2'; ADOQuery1.Parameters.ParamByName('name').Value := '%' + EditSearch.Text + '%'; ADOQuery1.Parameters.ParamByName('telefon1').Value := '%' + EditSearch.Text + '%'; ADOQuery1.Parameters.ParamByName('telefon2').Value := '%' + EditSearch.Text + '%'; ADOQuery1.Open; if ADOQuery1.Active then ADOQuery1.Refresh else ADOQuery1.Open; end; Es wird, egal was ich suche, immer der 1. Datensatz mitangezeigt. |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Das lässt sich auch noch ausbauen:
Delphi-Quellcode:
type
TTextSearchType = (stBeginsWith, stEndsWith, stContains); ... const SEARCHSTRINGS: array[TTextSearchType] of string = ('%%%s', '%s%%', '%%%s%%'); ... var TextSearchType: TTextSearchType; ... ADOQuery1.Parameters.ParamByName('name').Value := Format(SEARCHSTRINGS[TextSearchType], [EditSearch.Text]); |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Das versteh ich jetzt nicht ganz: Wo kommt der Bereich "const" und "var" genau hin?
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ok habs kappiert, aber trotzdem bekomme ich immer noch den 1. Datensatz im DBGrind nach der suche mitangezeigt!
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
So, wenn ich beim Select nur einen Wert hernehme, also wenn ich alle OR weglasse, dann funktionierts.
Sobald ich aber mehrere Spalten abfragen möchte, dann kommt immer der 1. Datensazt mitangezeigt im DBGrid! |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Was passiert denn, wenn Du das Statement mal direkt per SQL-Editor (welcher, hängt vom verwendeten DBMS ab) auf die DB loslässt?
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Welche Daten stehen denn im 1. Datensatz?
Gruß K-H |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Hallo, wenn ich in Access dieses Select ausführe:
Code:
dann kommen nur die beiden Datensätze, wo der Nachname "Huber" ist.
SELECT * FROM kundendaten WHERE nachname LIKE 'Huber' OR telefon1 LIKE ''
In Delphi kommt aber zusätzlich noch der 1. Datensatz. Der Innhalt ist aber ein ganz ein anderer.
Code:
begin
ADOQuery1.Close; ADOQuery1.SQL.Text:='SELECT * FROM kundendaten WHERE nachname LIKE :name OR telefon1 LIKE :telefon1'; // OR telefon2 LIKE :telefon2'; ADOQuery1.Parameters.ParamByName('name').Value := '%' + EditSearch.Text + '%'; ADOQuery1.Parameters.ParamByName('telefon1').Value := '%' + EditSearch.Text + '%'; ADOQuery1.Open; if ADOQuery1.Active then ADOQuery1.Refresh else ADOQuery1.Open; end; |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Das ist aber nicht das Query, welches von deinem Programm generiert wird. Dein Programm macht daraus
Code:
Und jetzt rate mal welche Datensätze darauf zutreffen.
OR telefon1 LIKE '%%'
Du musst also noch eine Abfrage machen, ob in den Edits überhaupt etwas drin steht. Liebe Grüße, Valentin |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ja, aber es gibt NUR ein Edit-Feld. Dort wird entweder der Nachname oder die Telefonnummer eingetragen.
Also steht im Edit eigentlich IMMER was drinn! |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Zitat:
Code:
?
SELECT * FROM kundendaten WHERE nachname LIKE '%Huber%' OR telefon1 LIKE '%Huber%'
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Da kommen im Access auch nur jene beiden Datensätze, welche HUBER heißen,
|
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Komisch, heute hab ich es nochmal probiert und nun funktioniert es, ohne dass der 1. Datensatz auch erscheint.
Danke für die Hilfe |
AW: Nur gesuchte Datensätze im DBGrid anzeigen
Ha, eine Frage hätte ich noch.
Ich hab versucht, eine MessageBox einzubauen, so dass diese Erscheint, wenn KEIN Kunde gefunden wurde. Leider schlug mein Versuch fehl, Da diese Messagebox immer wieder erscheint, obwohl ein Kunde gefunden wurde. Ich weiss nicht, wo ich meine Box hinsetzen muss!
Code:
procedure TForm1.BtnSearchClick(Sender: TObject);
begin ADOQuery1.Close; ADOQuery1.SQL.Text:='SELECT * FROM kundendaten WHERE nachname LIKE :name OR telefon1 LIKE :telefon1 OR telefon2 LIKE :telefon2'; ADOQuery1.Parameters.ParamByName('name').Value := '%' + EditSearch.Text + '%'; ADOQuery1.Parameters.ParamByName('telefon1').Value := '%' + EditSearch.Text + '%'; ADOQuery1.Parameters.ParamByName('telefon2').Value := '%' + EditSearch.Text + '%'; ADOQuery1.Open; if ADOQuery1.Active then ADOQuery1.Refresh else ADOQuery1.Open; MessageDlg('Der Kunde "' + EditSearch.Text + '" wurde leider nicht gefunden!', mtInformation, [mbOK],0); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 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