AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Schfunktion für Acess DB in Formularanwendung. Bitte Hilfe!
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von dcgottschling · begonnen am 23. Sep 2008 · letzter Beitrag vom 26. Sep 2008
Antwort Antwort
dcgottschling

Registriert seit: 10. Mai 2007
5 Beiträge
 
#1

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

  Alt 23. Sep 2008, 17:48
Datenbank: Access • Version: 2003 • Zugriff über: ADO, ODBC
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.
  Mit Zitat antworten Zitat
tr909

Registriert seit: 5. Nov 2004
193 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 23. Sep 2008, 18:07
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
  Mit Zitat antworten Zitat
dcgottschling

Registriert seit: 10. Mai 2007
5 Beiträge
 
#3

Re: Schfunktion für Acess DB in Formularanwendung.

  Alt 23. Sep 2008, 19:35
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
  Mit Zitat antworten Zitat
tr909

Registriert seit: 5. Nov 2004
193 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 24. Sep 2008, 05:47
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
Ach, und herzlich willkommen auf DP.
  Mit Zitat antworten Zitat
dcgottschling

Registriert seit: 10. Mai 2007
5 Beiträge
 
#5

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

  Alt 24. Sep 2008, 15:48
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
  Mit Zitat antworten Zitat
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
147 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 25. Sep 2008, 08:57
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:
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.
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay
  Mit Zitat antworten Zitat
dcgottschling

Registriert seit: 10. Mai 2007
5 Beiträge
 
#7

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

  Alt 25. Sep 2008, 20:42
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
  Mit Zitat antworten Zitat
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
147 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 26. Sep 2008, 08:13
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
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay
  Mit Zitat antworten Zitat
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
147 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 26. Sep 2008, 10:04
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.
(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
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05: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