Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage per Eingabe (https://www.delphipraxis.net/24203-abfrage-per-eingabe.html)

abi 17. Jun 2004 12:44


Abfrage per Eingabe
 
Hallo
ich habe eine DB und ein Edit Feld.

Jetzt will ich in meinem Editfeld, z.b. einen Namen schreiben und dann soll angezeigt werden ob dieser Datensatz vorhanden ist.

Ich wollte des mit OnKeyUp machen damit ich nach jeden Buchstaben prüfen kann, ob der Datensatz vorhanden ist.

Meine DB sicht vereinfacht so aus.
Nummer
Geber_Bezeichnung
Auflösung
usw.

Jetzt wollte ich z.b. Geber_Bezeichnung suchen.

mfg
abi

Ultimator 17. Jun 2004 12:52

Re: Abfrage per Eingabe
 
Probier das doch mit dem OnChange-Ereignis.

abi 17. Jun 2004 12:58

Re: Abfrage per Eingabe
 
Hallo :hi:
mein Problem ist eh wie schreibe ich des in meinen SQL Text. :wall:

Da kann ich doch keine Variablen rein setzen, oder doch??? :gruebel:

Ansonsten muss ich mal schauen was besser ist.

abi

Stevie 17. Jun 2004 13:04

Re: Abfrage per Eingabe
 
Ich würde es mit einer LIKE-Abfrage machen:
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  DataSet1.Filter := 'Bezeichnung LIKE ''' + Edit1.Text + '%''';
end;

abi 17. Jun 2004 13:15

Re: Abfrage per Eingabe
 
Hallo Stevie
danke für denn Tipp.

Jetzt musst du mir nur noch sagen was DataSet1.Filter ist.

Ich jetzt nur ne qrGeber und dsGeber.

Wie bekomme denn das.

Mercy.
mfg
abi

Stevie 17. Jun 2004 13:26

Re: Abfrage per Eingabe
 
Ich nehme mal anhand der Prefixe an, dass qr für Query und ds für DataSource steht...
Deine Query (welcher Art auch immer) ist von TDataSet abgeleitet (da du sie sonst nicht der DataSource zuweisen könntest)
und verfügt somit über die Eigenschaften Filtered (Boolean) und Filter (String)...

Albi 17. Jun 2004 13:30

Re: Abfrage per Eingabe
 
Hallo,

dataset kannst Du mit der Table kompo vergleichen. Aber da du eh schon alles über Query's macht, kannst Du das auch über ein Query lösen.

Code:
Select * From DB Where Bezeichnung Like ''+Edit1.Text+'%'''
Das ganze in das wie schon gesagt OnChange Ereignis eintragen und schon ist es fertig. Nun wird jedes mal nach dem Du eine Taste gedrückst hast wird dieses Ereignis ausgelöst.

Kleiner Hinweis, soll diese DB über ein Netzwerk laufen, würde ich dir davon abraten. Da ansonsten bei großen Datenmengen es zu Verzögerung kommen kann.

Stevie 17. Jun 2004 13:34

Re: Abfrage per Eingabe
 
Das kommt drauf an. Ich nehme jetzt mal an, dass es nicht zigtausend Datensätze gibt, aber trotzdem würde bei der Eingabe von "Wasweißich" 10mal (!) eine Anfrage an die Datenbank gestellt. Wenn es nicht allzu viel Daten sind, ist es besser, sie erstmal alle abzufragen und dann einzuschränken.

abi 17. Jun 2004 13:40

Re: Abfrage per Eingabe
 
Hallo Albi, Stevie
danke für die Hilfe.

Es sind vielleicht 400 Datensätze.

Und ich wollte auch das er nach jeden Tast druck schaut ob er was hat.

Muss des jetzt aber erst mal testen, melde mich.

Wenn ich mal wieder nicht weiter komme.

ciao

Chrsitian

abi 17. Jun 2004 14:10

Re: Abfrage per Eingabe
 
Hallo Stevie
hab gerade deinen Code ausprobiert.

Leider geht er nicht.

Code:
procedure TForm1.Button9Click(Sender: TObject);
begin

 dsSuchen.DataSet.Filter := 'Geber_Bezeichnung LIKE ''' +Edit1.Text+ '%''';
end;
Ich bekomme dann folgende Fehlermeldung.

Zitat:

Operation nicht anwendbar
Kannst du mir da nochmal helfen.

abi

Stevie 17. Jun 2004 14:25

Re: Abfrage per Eingabe
 
Scheint, dass LIKE hier nicht unterstützt wird, dann nimm mal 'Geber_Bezeichnung = ''' +Edit1.Text+ '*''';

abi 17. Jun 2004 14:33

Re: Abfrage per Eingabe
 
Jetzt bekomme ich zwar keine Fehler meldung, aber es passiert nicht.

Ich muss doch bestimmt meine Tabelle neu aufbauen lassen.

Ich glaub ich steh im Wald.
abi

Albi 17. Jun 2004 14:48

Re: Abfrage per Eingabe
 
Hast Du die Dataset mit der entsprechenden DB verbunden? Und sie auch geöffnet, dann must Du auch noch die entsprechende Datasource mit der Dataset verbinden, wenn ich mich nicht irre, und das Grid oder was auch immer du zum anzeigen verwendest.

Das mit gleich dem schauen ob der Name schon da ist oder nicht, ist genau das was wir meinten. Wenn du ein Wort mit 10 Buchstaben hast, wird deine Abfrage an die DB genau 10 mal gestellt spricht für jeden Buchstaben den du eingibst. Und das % am Ende ist nicht weiter als ein Joker den du einsetzt. Das heißt wenn du z.B. Mü eingibst wird alles in deiner DB herausgesucht was mit Mü beginnt, also Müller, Mütter usw.. Du hast somit eine sehr ungenaue Suche und beansprucht die DB unnötigt.

Wenn ich soetwas verwende, dann suche ich erst, wenn ich das Feld verlasse, somit wird die Abfrage nur einmal an die DB gestellt.

abi 17. Jun 2004 14:58

Re: Abfrage per Eingabe
 
Hallo Albi
das mit dem 10 mal abfragen hab ich schon verstanden, vielleicht mach ich auch die Abfrage nach jedem 3 Buchstabe. Aber des sehe ich ja dann, wies läuft.

In Meine TQuery, heisst qrSuchen, steht folgendes drin
SQL
Code:
 
  SELECT
 G.Nummer,
 G.Geber_Bezeichnung,
 G.Device_Name,
 G.Knotennummer,
 G.BaudrateID,
 B.Baudrate,
 H.Hw_Version As Hardware_Version,
 S.Sw_Version As Software_Version,
 G.Auflösung,
 G.Preset_Wert,
 G.Min_Toleranz,
 G.Max_Toleranz,
 G.Nocken_Position_1,
 G.Nocken_Position_2,
 G.Hysterese_1_Nocken,
 G.Hysterese_2_Nocken,
 G.Cyclic_Zeit,
 G.Seriennummer,
 G.Producer_Heart_Time,
 G.Consumer_Heart_Time,
 G.Datum_Uhrzeit,
 A.Nachname || ' ' || A.Vorname As Arbeiter,
 A.Abteilung,
 G.Bemerkung

 
 
FROM "Geber Datenbank.db" G
LEFT OUTER JOIN Baudrate B
 ON (G.BaudrateID = B.Nummer)
LEFT OUTER JOIN "Hw Version.db" H
 ON ((G.HwVersionID) = H.Nummer)
LEFT OUTER JOIN "Sw Version.db" S
  ON (G.SwVersionID = S.Nummer)
LEFT OUTER JOIN Arbeiter A
 ON (G.ArbeiterID = A.Nummer)
DataSource ist leer, muss da auch noch was rein.

und in meiner DataSource, heisst dsSuchen, steht
für DataSet qrSuchen

Hab des bis jetzt so gemacht.
Diese Query soll nur fürs Suchen sein.

Ich benute auch TGrid um meine Werte anzuzeigen.

abi

Michael80 17. Jun 2004 15:06

Re: Abfrage per Eingabe
 
Hi Abi,

um dein problem mit der suche pro buchstabe zu lösen nimm die on key press funktion von deinem edit feld

Delphi-Quellcode:
procedure TForm2.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  if key = #13 then // key 13 entertaste
  begin // nachfolgend dein suchcode bei mir der anmeldevorgang
        try
                with Datamodule2.ibdatabase1 do
                begin
                Connected                              := false;
                Params.Add('user_name='+Edit1.Text+'');
                Params.Add('password='+Edit2.Text+'');
                Params.Add('lc_ctype=WIN1252');
                SQLDialect                             := 3;
                Connected                              := true;
                end
                except
                on EIBInterBaseError do
                begin
                MessageDlg('Benutzer oder Passwort falsch'#13'bitte neu eingeben oder abbrechen',
                        mtConfirmation,
                        [mbOK],0);
                        exit;
                end;
        end;
        Form1.StatusBar1.Panels[1].Text        := Edit1.Text;
        Form4.StatusBar1.Panels[1].Text        := Edit1.Text;
        close;
        key := #0; // key #0 am schluss, damit das dumme pling nicht kommt beim tastendruck
        end
        else;

end;
das is der code von meinem login fenster für meine datenbank sobald ich enter key #13 drücke führt er den anmeldevorgang aus

ich hab auch nen suchvorgang mal geschrieben, ich such mir das projekt raus und melde mich wieder!

Gruß

michael

Albi 17. Jun 2004 15:07

Re: Abfrage per Eingabe
 
Was verwendest Du nun Query oder Dataset? Also eigentlich sollte es reichen, wenn du einfach diese Abfrage um den Punkt erweiterst den ich oben schon mal gepostet habe.

[sql]Select ... from DB ..deine Joins Where Bezeichnung Like '''+Edit1.Text+'%'''[code]

Wenn Du ein Dataset verwendest, dann mußt du glaub ich das % durch ein * ersetzen. Bin mir da aber nicht ganz sicher.

Michael80 17. Jun 2004 15:20

Re: Abfrage per Eingabe
 
Delphi-Quellcode:
begin
        DataModule2.IBQuery1.Filtered  := false;
        DataModule2.IBQuery1.Close;
        DataModule2.IBQuery1.SQL.Clear;
        DataModule2.IBQuery1.SQL.Add('SELECT * FROM DEINETABELLE WHERE DEINSUCHFELD like ''%'+Edit1.Text+'%'' ');
        DataModule2.IBQuery1.Open;
        DataModule2.IBQuery1.Active    := true;
end;
diese suche arbeitet mit wildcards,

also wenn du Mü eingibst zeigt er dir alles wo irgendwo mü vorkommt.

wenn du es anders willst musst du mit dem ''%' experementieren. das % ist das wildcard,
der rest wird für den sql string benötigt.


ein normaler aufbau sollte sein

DB ---- QUERY --- im query muss unter database die DB stehen

um die daten noch anzuzeigen brauchst noch eine datasource. in dieser muss unter dataset das query stehen. im db grid dann unter datasource die entsprechende datasource.

erzähl uns mal genau was für ne datenbank und was du noch alles in deinem projekt hast!


gruß

michael

Stevie 17. Jun 2004 15:20

Re: Abfrage per Eingabe
 
Der Ansatz ist schon richtig, aber (mein Fehler :oops:):
- deine Datenbank (welche verwendest du?) versteht kein LIKE
- der Trick mit dem * funktioniert scheinbar nur mit ClientDataSets!?

Deshalb mein Vorschlag:
- ClientDataSet benutzen und in diesem die Suche implementieren.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  DataSetProvider1.DataSet := ZQuery1;
  ClientDataSet1.ProviderName := DataSetProvider1.Name;
  ZQuery1.Open;
  ClientDataSet1.Open;
  ClientDataSet1.Data := DataSetProvider1.Data;
  DataSource1.DataSet := ClientDataSet1;
  DBGrid1.DataSource := DataSource1;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  DBGrid1.DataSource.DataSet.Filtered := CheckBox1.Checked;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  DBGrid1.DataSource.DataSet.Filter := 'Bezeichnung = ''' + Edit1.Text + '*''';
end;

Albi 17. Jun 2004 15:23

Re: Abfrage per Eingabe
 
Macht es ihm nicht so schwer. Er arbeitet sich gerade in das Thema ein, wenn es so weiter geht versteht er nur noch Bahnhof. Und weiß gar nicht mehr was er machen soll.

abi 17. Jun 2004 15:25

Re: Abfrage per Eingabe
 
Mercy für die Hilfe
ich hoffe ihr seit mir nicht böse.

Aber irgendwie komme ich mir vor als währe ich irgendwo dagegen gelaufen.

Werde des morgen auf jedenfall mal testen, aber auf den erste Blick sicht gut aus.

Genau des was ich habe wollte.

Wünsch euch noch was.
mfg
abi

Stevie 17. Jun 2004 15:37

Re: Abfrage per Eingabe
 
Zitat:

Zitat von Albi
Macht es ihm nicht so schwer. Er arbeitet sich gerade in das Thema ein, wenn es so weiter geht versteht er nur noch Bahnhof. Und weiß gar nicht mehr was er machen soll.

Deshalb hab ich ja den Code gepostet, alles was er noch machen muss, ist,
die drei Komponenten vom Datenzugriff-Reiter aufs Form zu klatschen.

Das funktioniert also folgendermaßen:
ZQuery ist meine Suchabfrage, die wird dem DataSetProvider zugewiesen. Dieser enthält die Daten aus dem DataSet als Paket. Dieses Datenpaket wird dann dem ClientDataSet zugewiesen und "wupsdich* kann ich mit diesen Daten arbeiten. Zu beachten ist nur, dass diese Daten lokal sind, also veralten können. Aber wenn es nur um eine Suche und Anzeige geht ist das ja nicht so erheblich, eher schon bei Datenbearbeitung.

abi 18. Jun 2004 08:47

Re: Abfrage per Eingabe
 
Hallo an alle
Wo bekomme ich den DataSetProvider und ClientDataSet her.

Könnte ihr mir dann noch mal erklären was die Checkbox macht. Brauch ich denn das.

gruss
abi

abi 18. Jun 2004 09:14

Re: Abfrage per Eingabe
 
Jetzt ist mir noch was aufgefallen.

Das mit dem Eintippen klappt ja wunderbar. Jetzt währe es noch gut wenn man des per Button Click wieder rückgängig machen könnte.

Ich möchte also das wenn man auf den Button klickt. Die Tabelle wieder ganz angezeigt wird.

bin mal gespannt was noch kommt.

abi

Albi 18. Jun 2004 10:39

Re: Abfrage per Eingabe
 
Hallo,

Den DataSetProvider sowie die ClientDataSet findest Du unter Datenzugriff.

Überlege doch mal wenn Du das Ergebnis gefiltert haben willst, dann schreibst Du in deine Abfrage

SQL-Code:
Select ... from DB WHERE Bla Like Bla
Also muß die Abfrage wie lauten, wenn Du alle Einträge haben willst?

Stevie 18. Jun 2004 10:47

Re: Abfrage per Eingabe
 
Zitat:

Zitat von abi
Jetzt währe es noch gut wenn man des per Button Click wieder rückgängig machen könnte.

Wie wäre es, wenn du einfach den Text aus deinem Editfeld löschst? :roll:

abi 18. Jun 2004 10:49

Re: Abfrage per Eingabe
 
Hallo Albi
des hab ich auch gedacht das DataSetProvider und clientDataSet bei Datazugriff ist.

Aber bei mir ist des mal wieder nicht der Fall.

Ich hab gedacht da ich des ja mit DBGrid mache. Muss ich es auch da wieder rückgangig machen und nicht in meiner Query Komponente.

Oder bin ich mal wieder total falsch.

Meine Suche hab ich doch so gemacht.
Code:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
   DbGrid1.DataSource.DataSet.Filtered := TabSheet2.Visible;

end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
 if GeberBezeichnung2.Checked then DBGrid1.DataSource.DataSet.Filter := 'Geber_Bezeichnung = ''' +Edit1.Text+ '*''';
 if DeviceName2.Checked      then DBGrid1.DataSource.DataSet.Filter := 'Device_Name = ''' +Edit1.Text+ '*''';
 if Seriennummer2.Checked    then DBGrid1.DataSource.DataSet.Filter := 'Seriennummer = ''' +Edit1.Text+ '*''';
 if Auflsung2.Checked        then DBGrid1.DataSource.DataSet.Filter := 'Auflösung = ''' +Edit1.Text+ '*''';
 if DatumUhrzeit2.Checked    then DBGrid1.DataSource.DataSet.Filter := 'Datum_Uhrzeit = ''' +Edit1.Text+ '*''';
 if Arbeiter2.Checked        then DBGrid1.DataSource.DataSet.Filter := 'Arbeiter = ''' +Edit1.Text+ '*''';
 if Abteilung2.Checked       then DBGrid1.DataSource.DataSet.Filter := 'Abteilung = ''' +Edit1.Text+ '*''';
 if HardwareVersion2.Checked then DBGrid1.DataSource.DataSet.Filter := 'Hardware_Version = ''' +Edit1.Text+ '*''';
 if SoftwareVersion2.Checked then DBGrid1.DataSource.DataSet.Filter := 'Software_Version = ''' +Edit1.Text+ '*''';
end;
Da kommt mein Query Komponente doch gar nicht vor.

Ich hab schon gedacht ich hätte was verstanden, war doch nicht so.

Schade
abi

abi 18. Jun 2004 10:50

Re: Abfrage per Eingabe
 
Hallo Stevie
des hab ich mir auch gedacht aber da kommt dann nichts.

Leider.

Albi 18. Jun 2004 10:50

Re: Abfrage per Eingabe
 
So gehts natürlich noch einfacher. :dancer:

abi 18. Jun 2004 10:52

Re: Abfrage per Eingabe
 
wie gehts einfacher, ich verstehe mal wieder nichts. :wiejetzt:

Albi 18. Jun 2004 10:57

Re: Abfrage per Eingabe
 
Du sollst nur den Text löschen, in dem Edit Feld wo du den Suchbegiff eingegeben hast.

Ich war zu Langsam. Vergess was ich oben geschrieben habe, du benutzt dort ja keine Query-Kompo also war mein Fehler.

Stevie 18. Jun 2004 10:59

Re: Abfrage per Eingabe
 
Zitat:

Zitat von abi
Hallo Stevie
des hab ich mir auch gedacht aber da kommt dann nichts.

Leider.

Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  // mit Trim werden Leerzeichen gelöscht, wenn also im Edit nix drinsteht, wird der Filter geleert und die Funktion beendet
  if Trim(Edit1.Text) = '' then
  begin
    DBGrid1.DataSource.DataSet.Filter := '';
    Exit;
  end;
  if GeberBezeichnung2.Checked then DBGrid1.DataSource.DataSet.Filter := 'Geber_Bezeichnung = ''' +Edit1.Text+ '*''';
  if DeviceName2.Checked      then DBGrid1.DataSource.DataSet.Filter := 'Device_Name = ''' +Edit1.Text+ '*''';
  if Seriennummer2.Checked    then DBGrid1.DataSource.DataSet.Filter := 'Seriennummer = ''' +Edit1.Text+ '*''';
  if Auflsung2.Checked        then DBGrid1.DataSource.DataSet.Filter := 'Auflösung = ''' +Edit1.Text+ '*''';
  if DatumUhrzeit2.Checked    then DBGrid1.DataSource.DataSet.Filter := 'Datum_Uhrzeit = ''' +Edit1.Text+ '*''';
  if Arbeiter2.Checked        then DBGrid1.DataSource.DataSet.Filter := 'Arbeiter = ''' +Edit1.Text+ '*''';
  if Abteilung2.Checked       then DBGrid1.DataSource.DataSet.Filter := 'Abteilung = ''' +Edit1.Text+ '*''';
  if HardwareVersion2.Checked then DBGrid1.DataSource.DataSet.Filter := 'Hardware_Version = ''' +Edit1.Text+ '*''';
  if SoftwareVersion2.Checked then DBGrid1.DataSource.DataSet.Filter := 'Software_Version = ''' +Edit1.Text+ '*''';
end;
Btw: Dir ist aber schon klar, dass wenn mehrere Checkboxen angehakt sind, die letzte "gewinnt"?

abi 18. Jun 2004 11:02

Re: Abfrage per Eingabe
 
hab ich doch gemacht und es passiert folgendes.

ich sehe einfach überhaupt keine Daten mehr.

Erst wenn ich wieder was eingebe.

abi 18. Jun 2004 11:03

Re: Abfrage per Eingabe
 
Danke Stevie
das mit dem CheckBoxen hab ich so gelöst das immer nur eine Active sein kann.

Deshalb ist des so schon OK.

Danke.

abi

Stevie 18. Jun 2004 11:07

Re: Abfrage per Eingabe
 
Zitat:

Zitat von abi
Danke Stevie
das mit dem CheckBoxen hab ich so gelöst das immer nur eine Active sein kann.

Deshalb ist des so schon OK.

Danke.

abi

Klappt's jetzt also, ja?
Für Selektionen, bei denen nur eine Option auswählbar sein soll benutzt man doch eher ne RadioGroup...

abi 18. Jun 2004 11:07

Re: Abfrage per Eingabe
 
Funktioniert wunderbar.

Mercy nochmal an alle.

abi

abi 18. Jun 2004 11:09

Re: Abfrage per Eingabe
 
Ja da hast du schon recht.

Aber ich hab des einem PopupMenu gemacht.

Vielleicht sollte ich es noch ändern, dann kann wenigstens weniger schieff gehen.

BluesKid 18. Jun 2004 11:11

Re: Abfrage per Eingabe
 
Moin moin

nen bischen off-topic aber:
Delphi-Quellcode:
  'Bezeichnung LIKE ''' + Edit1.Text + '%'''
ist das selbe wie:
Delphi-Quellcode:
  'Bezeichnung LIKE ' + Edit1.Text + '%'

für einfache Anführungszeichen:
Delphi-Quellcode:
  'Bezeichnung LIKE '+ quotedstr(Edit1.Text+'%')

schönen Gruß

Sam

abi 18. Jun 2004 12:15

Re: Abfrage per Eingabe
 
Ich hab doch noch ein Problem.

Jetzt geht alles ausser Auflösung und Datum Uhrzeit.

Dies habe ich in meiner Paradox Tabelle folgender massen deklariert.

Auflösung ist ein Integer wert
und
Datum Uhrzeit ist das @ Zeichen.

Der Rest ist immer A für String.

Muss ich da vielleicht anderes abfragen, oder mein String umwandeln.

abi

Stevie 18. Jun 2004 12:26

Re: Abfrage per Eingabe
 
Mit Paradox kenn ich mich überhaupt nicht aus, aber ich würde sagen, du musst auf jeden Fall die Typen umwandeln.

Albi 18. Jun 2004 12:49

Re: Abfrage per Eingabe
 
Such mal hier nach, also Du kannst über StrToDate(...) deinen String in ein Datumsformat konvertieren. Das mußt Du auch machen, da die DB es ansonsten nicht erkennt.

Zur Sicherheit würd ich aber noch mal hier im Forum suchen, das Thema wurde schon des öffteren Besprochen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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