![]() |
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 |
Re: Abfrage per Eingabe
Probier das doch mit dem OnChange-Ereignis.
|
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 |
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; |
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 |
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)... |
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:
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.
Select * From DB Where Bezeichnung Like ''+Edit1.Text+'%'''
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. |
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.
|
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 |
Re: Abfrage per Eingabe
Hallo Stevie
hab gerade deinen Code ausprobiert. Leider geht er nicht.
Code:
Ich bekomme dann folgende Fehlermeldung.
procedure TForm1.Button9Click(Sender: TObject);
begin dsSuchen.DataSet.Filter := 'Geber_Bezeichnung LIKE ''' +Edit1.Text+ '%'''; end; Zitat:
abi |
Re: Abfrage per Eingabe
Scheint, dass LIKE hier nicht unterstützt wird, dann nimm mal 'Geber_Bezeichnung = ''' +Edit1.Text+ '*''';
|
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 |
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. |
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:
DataSource ist leer, muss da auch noch was rein.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) 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 |
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:
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
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; ich hab auch nen suchvorgang mal geschrieben, ich such mir das projekt raus und melde mich wieder! Gruß michael |
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. |
Re: Abfrage per Eingabe
Delphi-Quellcode:
diese suche arbeitet mit wildcards,
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; 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 |
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; |
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.
|
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 |
Re: Abfrage per Eingabe
Zitat:
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. |
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 |
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 |
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:
Also muß die Abfrage wie lauten, wenn Du alle Einträge haben willst?
Select ... from DB WHERE Bla Like Bla
|
Re: Abfrage per Eingabe
Zitat:
|
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:
Da kommt mein Query Komponente doch gar nicht vor.
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; Ich hab schon gedacht ich hätte was verstanden, war doch nicht so. Schade abi |
Re: Abfrage per Eingabe
Hallo Stevie
des hab ich mir auch gedacht aber da kommt dann nichts. Leider. |
Re: Abfrage per Eingabe
So gehts natürlich noch einfacher. :dancer:
|
Re: Abfrage per Eingabe
wie gehts einfacher, ich verstehe mal wieder nichts. :wiejetzt:
|
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. |
Re: Abfrage per Eingabe
Zitat:
Delphi-Quellcode:
Btw: Dir ist aber schon klar, dass wenn mehrere Checkboxen angehakt sind, die letzte "gewinnt"?
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; |
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. |
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 |
Re: Abfrage per Eingabe
Zitat:
Für Selektionen, bei denen nur eine Option auswählbar sein soll benutzt man doch eher ne RadioGroup... |
Re: Abfrage per Eingabe
Funktioniert wunderbar.
Mercy nochmal an alle. abi |
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. |
Re: Abfrage per Eingabe
Moin moin
nen bischen off-topic aber:
Delphi-Quellcode:
ist das selbe wie:
'Bezeichnung LIKE ''' + Edit1.Text + '%'''
Delphi-Quellcode:
'Bezeichnung LIKE ' + Edit1.Text + '%'
für einfache Anführungszeichen:
Delphi-Quellcode:
'Bezeichnung LIKE '+ quotedstr(Edit1.Text+'%')
schönen Gruß Sam |
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 |
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.
|
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 18:20 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