Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Schfunktion für Acess DB in Formularanwendung. Bitte Hilfe! (https://www.delphipraxis.net/121182-schfunktion-fuer-acess-db-formularanwendung-bitte-hilfe.html)

dcgottschling 23. Sep 2008 17:48

Datenbank: Access • Version: 2003 • Zugriff über: ADO, ODBC

Schfunktion für Acess DB in Formularanwendung. Bitte Hilfe!
 
Hallo Leute,

ich würde gerne eine Suchfunktion für eine Access DB in eien Formularanwendung (VCL für Win32) integrierern. Die Verbindung zur Datenbank konnte ich einrichten, wobei der Inhalt im DBGrid schon angezeigt wird.

Es ist mir bekannt, dass ich für die Suchfunktion ein Text-Eingabefeld und einen Button benötige. Ich habe leider überhaupt keine Ahnung wie die Verbindung zwischen Text-Eingabefeld (Suchbegriff), Such-Button und Access-Datenbank einzurichten ist.

Bitte, Bitte um Hilfe! Bin fast am resignieren.

tr909 23. Sep 2008 18:07

Re: Schfunktion für Acess DB in Formularanwendung. Bitte Hil
 
Die Suche kannst du z.B: über ein ADODataSet bewerkstelligen.

ein ganz einfaches beispiel.

ADODataSet1.Close;
ADODataSet1.CommandText := 'SELECT * FROM tabelle WHERE feld = "'+edit1.text+'"';
ADODataSet1.Open;

Damit bekommst du halt alle Datensätze in denen im feld "feld" das drin steht was du im edit1 hast

ADODataSet1.CommandText := 'SELECT * FROM tabelle WHERE feld like "*'+edit1.text+'*"';
würde die alle Datensätze ausgeben, in denen das feld "feld" den Inhalt von edit1 enthält.

Wenn du SQL kennst sollte die Abfragen wür weiteres ja kein Problem sein. Fals nicht zur kurzen Erläuterung die Anführungszeichen bei feld = "..." müssen da stehen, wenn das feld vom typ text ist, bei zahlen must du sie weglassen.

Eleganter geht es natürlich wenn du das ganze mit Parametern machst. Dazu findest du hier genug Beitröge.

Gruß
tr909

dcgottschling 23. Sep 2008 19:35

Re: Schfunktion für Acess DB in Formularanwendung.
 
Vielen Dank für die Antwort. Habe allerdings nicht verstanden, was ich als CODE für den "Button-Click" eingeben muss um Such-Textfeld und Datenbank anzusteuern. Als Datensteuernugs-Tool wollte ich TDBEdit (mein "Such-Textfeld") verwenden und TButton aus der Standard-Toolpalette (mein "Such-Button").
Gilt der genannta CODE

"ADODataSet1.Close;
ADODataSet1.CommandText := 'SELECT * FROM tabelle WHERE feld = "'+edit1.text+'"';
ADODataSet1.Open;"

für den "Button_Click" - oder das Textfeld "TDBEdit"?

Tut mir leid, wenn ich erfahrene Programmierer mit solch einfachen Dingen nerve. Wenn möglich, bitte helft mir.

Gruß,
dcgottschling

tr909 24. Sep 2008 05:47

Re: Schfunktion für Acess DB in Formularanwendung. Bitte Hil
 
in meinem Beispiel wird für das Suchfeld ein TEdit benutzt. der Code gehört in das OnClick_Ereigniss vom Button. Schließlich soll er ja ausgeführt werden wenn man auf den Button Clickt ;)

Wie holst du denn die Daten aus der Datenbank? TADOTable? TADODataSet? Der Beispielcode setz TADODataSet vorraus.

Gruß
tr909

Zitat:

Tut mir leid, wenn ich erfahrene Programmierer mit solch einfachen Dingen nerve. Wenn möglich, bitte helft mir.
Jeder hat ja mal angefangen. Mittlerweile gibts ja zum Glück das Internet, wo man meist recht schnell Hilfe, bzw. passende Tutorials findet :D
Ach, und herzlich willkommen auf DP.

dcgottschling 24. Sep 2008 15:48

Re: Schfunktion für Acess DB in Formularanwendung. Bitte Hil
 
Hallo und vielen Dank für die schnelle Antwort.

Die Verbindung zu meiner ACCESS Datenbank besteht durch ein TADODataSet. Obwohl ich erst seit etwa 1 Woche so zu sagen "programmiere", verstehe ich langsam wozu einzelne Delphi-Komponenten (Turbo Delphi) gut sind. Den "by_click" Befehl für den Button habe ich nun verstanden.
Muss das Suchfeld "TEdit" nicht ebenfalls mit dem DataSet bzw. Datenbank verbunden sein?
Oder ist etwa die Bezeichnung "'+edit1.text+'" aus deinem Abfrage-Beispiel dafür gedacht? In den Objektinspektor (Eigenschaftsliste) von TEdit gibt es bezüglich Datenbanken überhaupt keine Option (oder zumindest keine, die ich als solche interpretiere).

Gruß,

dcgottschling

alphaflight83 25. Sep 2008 08:57

Re: Schfunktion für Acess DB in Formularanwendung. Bitte Hil
 
Das +edit1.text+ fügt lediglich den String deines Edit Feldes in den SQL String ein.
dazu muss das Edit Feld nicht mit der Datenbank verknüpft sein, da die Verbindung erst hergestellt wird, wenn du dein Query ausführst, bzw. das DBGrid Daten empfangen soll.

Bin im Moment an einem ganz ähnlichen Problem.
Die Durchführung per Select ist für mich dabei nur begrenzt sinnvoll. Wenn zum Beispiel eine Funktion benötigt wird, die die Anzeige eines DBGrids durchsucht, sprich den Cursor im Grid auf den Datensatz verschiebt und nicht den Inhalt lediglich auf den gesuchten Datensatz beschränkt.

Eine Möglichkeit hierfür wäre Pos oder auch Locate

Mit Pos kann die OkayClick Funktion beispielsweise so aussehen:

Delphi-Quellcode:
(* Setze den Edit Text als Suchwort *)
SearchTerm := Edit_Search.Text;
(* Beschränke die Felder um Probleme mit Strings in Integerfeldern zu vermeiden *)
if RadioButton_Field1 .Checked then SearchField := 'ZuDurchsuchendesFeld1';
if RadioButton_Field2 .Checked then SearchField := 'ZuDurchsuchendesFeld2';

(* Stelle die Controls des Grids aus, damit das Grid nicht bei jeder Zeile aktualisiert wird *)
DBGrid.DataSource.Dataset.DisableControls;
(* Suche bei jedem Click einen Datensatz weiter, alternativ kann eine If Bedingung für eine Abfrage vom Begin mit First gesetzt werden *)
DBGrid.DataSource.Dataset.Next;
(* Der momentane Datensatz enthält nicht das gesuchte Feld nicht dem*)
while (Pos(SearchTerm, DBGrid.DataSource.Dataset.FieldByName (SearchField).AsString) = 0)
(* Und das Dateiende ist noch nicht erreicht*)
and not (DBGrid.DataSource.Dataset.Eof) do begin
  (* Also zum nächsten Datensatz*)
  DBGrid.DataSource.Dataset.Next;
end;

(* Wurde eine Übereinstimmung gefunden wird die while Schleife verlassen und die Anzeige aktualisiert *)
DBGrid.DataSource.Dataset.EnableControls;

(* Wenn keine Übereinstimmung gefunden wurde und das Dateiende erreicht wurde wird eine Fehlermeldung ausgegeben*)
if (Pos(SearchTerm, DBGrid.DataSource.Dataset.FieldByName (SearchField).AsString) = 0)
and (DBGrid.DataSource.Dataset.Eof) then begin
  MessageBox(Handle, pChar('Suche erfolglos'), pChar('Aus is'), MB_ICONHAND and MB_APPLMODAL);
end;
Das funktioniert soweit, wie gesagt, man kann noch einen zweiten Button erstellen und über Sender dann abfragen ob von Oben oder einfach weitergesucht werden soll.
Delphi-Quellcode:
if Sender = Button_FromTop then FromTop := True;
if FromTop then begin (* Liste von Oben durchsuchen *)
  DBGrid.DataSource.Dataset.DisableControls;
  DBGrid.DataSource.Dataset.First;
... usw
Die Fehlermeldung ist nur ein Beispiel. Da müssten noch Abfragen rein.
(wird immer ausgegeben, wenn das Dateiende erreicht wurde, auch wenn vorher Datensätze gefunden wurden)

Die Felder werden wie gesagt deshalb ausgewählt, um eine Abfrage mit einem String in einem Integer zu vermeiden.
Ist natürlich blöd wenn man auch in Integerfeldern suchen will ;)

Jetzt kommt die Frage von mir:
Ich suche grade nach ner Möglichkeit auf die Characters abzufgragen und dann je nach feld als Integer oder String zu suchen.
Sprich, Wenn die Chars nur aus 0-9 bestehen darf in allen Feldern gesucht werden, falls auch Buchstaben dabei sind nur in den Stringfeldern.
Um die Reihenfolge im Grid zu wahren, müsste man wahrscheinlich für jedes feld eine Einzelne Abfrage machen, und die hintereinander in der While-Schleife aufrufen, nicht das die Position dann rumspringt.
... Oder aber man sucht mit Value statt AsString und AsInteger, dann braucht man da nicht unterscheiden ...

Und gleich noch eine:
Kann man mit Locate auch weitersuchen? Mein Versuch mit Locate sucht immer vom Tabellenbeginn:
Delphi-Quellcode:
DBGrid.DataSource.Dataset.Locate('Feld1;Feld2;Feld3',SearchTerm,[loCaseInsensitive, loPartialKey]);
Die Integer String Problematik bringt das dabei auch noch mit.

Gruß, alphaflight

PS: Würde mich über Vorschläge freuen, natürlich auch (oder gerade wenn) das Geschriebene alles viel zu umständlich ist und schneller gehen würde.

dcgottschling 25. Sep 2008 20:42

Re: Schfunktion für Acess DB in Formularanwendung. Bitte Hil
 
Hallo,

danke sehr für den Tipp! Bezüglich der Gleichbehandlung der String und Integer Chars während der Suche würde ich eine "GoToData" Anweisung (Bsp. GoTo Nearest) über einen TADOTable und TDAtaSource empfehlen (mit einer ACCESS DB). Die gesamte DB kann aber so nicht gleichzeitig durchsucht werden. Die Daten aus den einzelnen Feldern können jedoch einfach z.B. über eine ComboBox jeweils abgefragt werden, sobald Du den Suchbegriff in ein TEdit eingibst. Weiterführende Infos findest Du unter http://delphi.about.com/od/database/l/aa121499a.htm.

Ich befasse mich erst seit kurzer Zeit mit dem Programmieren. Deshalb tut es mir wirklich leid nicht besser Helfen zu können.

Grüße,
dcgottschling

alphaflight83 26. Sep 2008 08:13

Re: Schfunktion für Acess DB in Formularanwendung. Bitte Hil
 
Ich weiß nicht ob ich dich jetzt richtig verstanden habe, aber genau von der CheckBox/Combobox Lösung möchte ich gerne wegkommen.
Momentan wähle ich die einzelnen zu durchsuchenden Felder über eine Combobox aus, das funktioniert alles auch mit dem Quellcode von oben wunderbar zusammen. Nur möchte ich eben, dass nicht mehr feldspezifisch gesucht wird, sondern über alle Felder der Tabelle.
Eben so wie man in einem Texteditor suchen würde.

Gruß, alphaflight

alphaflight83 26. Sep 2008 10:04

Re: Schfunktion für Acess DB in Formularanwendung. Bitte Hil
 
Hab die Lösung gerade selbst gefunden:
Pos sucht nach Stringteilen innerhalb eines Strings.
Wenn man die Integerfelder mit .AsString ansteuert bzw. ausgibt, also z.B.
Delphi-Quellcode:
(Pos(SearchTerm, DBGrid.DataSource.Dataset.FieldByName ('Feld').AsString)
kann man ganz einfach über jede Art von Feld suchen.

... Man kann sichs wirklich unnötig schwer machen :roll:


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