Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Nur gesuchte Datensätze im DBGrid anzeigen (https://www.delphipraxis.net/167534-nur-gesuchte-datensaetze-im-dbgrid-anzeigen.html)

m-werk 4. Apr 2012 09:52

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:
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;
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.

Könnte mir hier jemand behilflich sein?

guinnes 4. Apr 2012 10:10

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

p80286 4. Apr 2012 10:11

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Ich würde in diesem Falle mit einer Query arbeiten
Code:
select wasmanbraucht from Tabelle where Name like '%huber%';
(funktioniert wenn die DB nicht casesensitive ist)

Gruß
K-H

m-werk 4. Apr 2012 10:20

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?

p80286 4. Apr 2012 10:26

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
das sollte ungefähr so aussehen:

Code:
myquery.close;
myquery.sql.text:='select name from tabelle where name like :name';
myquery.sql.parameterbyname('name').asstring:=edit1.text;
myquery.open;
wobei Du die entsprechenden Platzhalter (% _) entweder unterwegs dazu packst oder aber dem Benutzer überlässt.

Gruß
K-H

m-werk 4. Apr 2012 10:43

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?

m-werk 4. Apr 2012 11:09

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
So, nun hab ich folgenden Code mal drinn, leider funktioniert dieser nicht:

Code:
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;
Eskommt die Meldung: Undeklarierter Bezeichner: 'parameterbyname'

mkinzler 4. Apr 2012 11:10

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Ja dort gibst du dann die parametrisierte Abfrage ein
Code:
select name from tabelle where name like :name;
Später z.B. beim Exit des Editfeldes, brauchst du dann nur den Parameter setzen:

Delphi-Quellcode:
AdoQuery1.Parameters.ParamByName('name').Value := EditSearch.Text;
if AdoQuery1.Active then
    AdoQuery1.Refresh
else
    AdoQuery1.Open;

m-werk 4. Apr 2012 11:24

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Code:
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;
Es kommt aber immer noch diese Fehlermeldung bei "parameterbyname" in der Codezeile
Code:
ADOQuery1.SQL.parameterbyname('name').asstring:=EditSearch.Text;

mkinzler 4. Apr 2012 11:26

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Schau dir mal die Zuweisung in meinem Code an

Gollum 4. Apr 2012 11:28

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Hallo,

ändere

Zitat:

Zitat von m-werk (Beitrag 1160125)
Code:
ADOQuery1.SQL.parameterbyname('name').asstring:=EditSearch.Text;

in

Delphi-Quellcode:
AdoQuery1.Parameters.ParamByName('name').Value := EditSearch.Text;
Das hat bereits mkinzler gepostet.

m-werk 4. Apr 2012 11:30

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Ich komm nicht dahinter :(

mkinzler 4. Apr 2012 11:33

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Zitat:

Zitat von m-werk (Beitrag 1160131)
Ich komm nicht dahinter :(

Die Methode heisst ParamByName() und nicht ParameterByName() und ist Teil der Klasse TParameter (Parameter) und nicht Teil der StringListe (SQL)

m-werk 4. Apr 2012 11:35

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;

mkinzler 4. Apr 2012 11:40

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Hast du vorher die parametrisierte Abfrage zugewiesen?

Bummi 4. Apr 2012 11:41

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';

mkinzler 4. Apr 2012 11:42

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Eine einmalige Zuweisung/Vorbereitung sollte aber reichen.

m-werk 4. Apr 2012 12:03

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Gehhh, das kann doch wohl nicht sein.

Das ist jetzt mein Button.
Code:
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;
Wenn ich nun einen Wert in das Feld eingebe und auf suchen klicke, kommt folgende Fehlermeldung:

Im Projekt Projekt1.exe ist eine Exception der Klasse EOleException mit der Meldung 'Syntaxfehler in FROM-Klausel' aufgetreten.
Anhalten - Fortsetzen - Hilfe

m-werk 4. Apr 2012 12:05

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

mkinzler 4. Apr 2012 12:05

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.

guinnes 4. Apr 2012 12:07

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Dann mach das ',' hinter Kundendaten weg, das steht auch bei den Vorschlägen nicht

m-werk 4. Apr 2012 12:10

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?

mkinzler 4. Apr 2012 12:13

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

m-werk 4. Apr 2012 12:16

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Ja schon aber wenn ich dort dies so eingebe

Code:
where nachname like %:name%
funktioniert das ganze nicht

mkinzler 4. Apr 2012 12:19

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
SQL-Code:
where nachname like :name;
Und die Joker im Paramter:
Delphi-Quellcode:
ADOQuery1.Parameters.ParamByName('name').Value := '%'+ EditSearch.Text + '%';

Bummi 4. Apr 2012 12:19

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Delphi-Quellcode:
ADOQuery1.Parameters.ParamByName('name').Value := '%' + EditSearch.Text + '%';

m-werk 4. Apr 2012 12:29

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:
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;
Ein Problem hab ich noch damit.
Es wird, egal was ich suche, immer der 1. Datensatz mitangezeigt.

DeddyH 4. Apr 2012 12:31

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]);

m-werk 4. Apr 2012 12:38

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Das versteh ich jetzt nicht ganz: Wo kommt der Bereich "const" und "var" genau hin?

m-werk 4. Apr 2012 12:40

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!

m-werk 4. Apr 2012 13:01

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!

DeddyH 4. Apr 2012 15:58

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?

p80286 4. Apr 2012 16:06

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Welche Daten stehen denn im 1. Datensatz?

Gruß
K-H

m-werk 10. Apr 2012 10:00

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Hallo, wenn ich in Access dieses Select ausführe:
Code:
SELECT * FROM kundendaten WHERE nachname LIKE 'Huber' OR telefon1 LIKE ''
dann kommen nur die beiden Datensätze, wo der Nachname "Huber" ist.

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;

Valle 10. Apr 2012 10:11

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:
OR telefon1 LIKE '%%'
Und jetzt rate mal welche Datensätze darauf zutreffen.

Du musst also noch eine Abfrage machen, ob in den Edits überhaupt etwas drin steht.

Liebe Grüße,
Valentin

m-werk 10. Apr 2012 10:15

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!

vagtler 10. Apr 2012 10:18

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Zitat:

Zitat von m-werk (Beitrag 1160912)
Hallo, wenn ich in Access dieses Select ausführe:
Code:
SELECT * FROM kundendaten WHERE nachname LIKE 'Huber' OR telefon1 LIKE ''
dann kommen nur die beiden Datensätze, wo der Nachname "Huber" ist. [...]

Und was kommt bei
Code:
SELECT * FROM kundendaten WHERE nachname LIKE '%Huber%' OR telefon1 LIKE '%Huber%'
?

m-werk 10. Apr 2012 10:20

AW: Nur gesuchte Datensätze im DBGrid anzeigen
 
Da kommen im Access auch nur jene beiden Datensätze, welche HUBER heißen,

m-werk 11. Apr 2012 11:19

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

m-werk 11. Apr 2012 13:59

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:02 Uhr.
Seite 1 von 2  1 2      

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