Einzelnen Beitrag anzeigen

Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
148 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 25. Sep 2008, 09: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