![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: TSQL
Suchfunktion in einem DBGrid
Hallo DP-Gemeinde
ich hoffe ihr könnt mir helfen bei meinem problem. Ich habe eine DBGrid mit folgenden spalten : Name Telefon Email Ort Straße Das DBGrid ist mit einer DatenBank verbunden und die Daten kann ich schon rein ziehen in das DBGrid. Jedoch wollte ich per Button und Edit FEld in meinem DBGRid etwas suchen und falls bei gefundenen eintrag, sollte nur dieser eintrag im DBGRid angezeigt werden. Ich weis leider aber nicht wie ich es realisieren soll. Danke im Vorraus für jede Hilfe :) |
AW: Suchfunktion in einem DBGrid
Du suchst in dem angebundenen DataSet und erhältst dadurch automatisch den fraglichen Datensatz im Grid markiert - sofern du den Rowindicator (ich glaube so heisst das) anzeigst.
Sherlock |
AW: Suchfunktion in einem DBGrid
Mit <DataSet>.Locate() kannst Du die Datenmenge durchsuchen und der 1. gefundene Datensatz wird dann zum aktiven im DataSet.
|
AW: Suchfunktion in einem DBGrid
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
Falls du den Code nicht gleich verstehst: Die Variable GLD.URec.Praxen_SuchText enthält den Suchtext, der durch die ESC-Taste gelöscht wird.
Procedure TFormMain.DbGrid_ViewKeyPress(Sender: TObject; var Key: Char);
Var C : Integer; begin C := Ord(Key); Case C Of 27 : DatMod.EintragFinden_View(Key); // Esc 32 : DatMod.EintragFinden_View(Key); // Space 45 : DatMod.EintragFinden_View(Key); // - 46 : DatMod.EintragFinden_View(Key); // . 48..57 : DatMod.EintragFinden_View(Key); // 0-9 65..90 : DatMod.EintragFinden_View(Key); // A-Z 97..122 : DatMod.EintragFinden_View(Key); // a-z 129 : DatMod.EintragFinden_View(Key); // ü 132 : DatMod.EintragFinden_View(Key); // ä 148 : DatMod.EintragFinden_View(Key); // ö End; end; Procedure TDatMod.EintragFinden_View(Const Taste: Char); Var Spalte : String; begin If Taste = #27 Then GLD.URec.Praxen_SuchText := '' Else Begin GLD.URec.Praxen_SuchText := GLD.URec.Praxen_SuchText + Taste; Case GLd.URec.Praxen_SortId Of 0 : Spalte := 'PRAXIS'; 1 : Spalte := 'STRASSE'; 2 : Spalte := 'HNR'; 3 : Spalte := 'PLZ'; 4 : Spalte := 'ORT'; 5 : Spalte := 'HOME'; 6 : Spalte := 'MAIL'; 7 : Spalte := 'TELEFON'; 8 : Spalte := 'ANWEND'; End; If GLd.URec.Praxen_SortId < 9 Then DatMod.View_Praxis.Locate(Spalte, GLD.URec.Praxen_SuchText, [loCaseInsensitive,loPartialKey]); End; If Assigned(fUpdateStatusbar) Then fUpdateStatusbar; end; Für die genaue Suche in mehreren Feldern gleichzeitig ist natürlich etwas mehr Aufwand notwendig. Hier verwende ich eine spezielle Suchmaske und werte beim Klick auf den Suchen-Button die einzelnen Felder und Checkboxen aus:
Delphi-Quellcode:
UNIT UnitSuchPrax;
INTERFACE USES Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.CheckLst, Vcl.ExtCtrls, Vcl.ComCtrls, JvExComCtrls, JvDateTimePicker; TYPE TFormSuchPrax = CLASS(TForm) Panel_Such : TPanel; Ed_Praxisname : TEdit; Ed_Strasse : TEdit; Ed_PLZ : TEdit; Ed_Ort : TEdit; Ed_Homepage : TEdit; Ed_Email : TEdit; Ed_Telefon : TEdit; Check_Anfrage : TCheckBox; Check_Antwort : TCheckBox; Lbl_Praxisname : TLabel; Lbl_Strasse : TLabel; Lbl_PLZ : TLabel; Lbl_Ort : TLabel; Lbl_Homepage : TLabel; Lbl_Email : TLabel; Lbl_Telefon : TLabel; Check_SuchResAktiv : TCheckBox; CheckList_SuchPrax : TCheckListBox; Check_GrossKlein : TCheckBox; Check_Exakt : TCheckBox; Panel_SuchTool : TPanel; Btn_Such : TButton; Btn_Clear : TButton; Btn_Close : TButton; Memo_Anleit : TMemo; Procedure FormShow(Sender : TObject); Procedure FormClose(Sender : TObject; var Action: TCloseAction); Procedure CheckList_SuchPraxClickCheck(Sender : TObject); Procedure Ed_PraxisnameKeyPress(Sender : TObject; var Key: Char); Procedure Btn_ClearClick(Sender : TObject); Procedure Btn_CloseClick(Sender : TObject); Procedure Btn_SuchClick(Sender : TObject); PRIVATE { Private-Deklarationen } Const MemoText1 = 'Gesucht wird nur nach jenen Feldern, die in der Liste rechts markiert sind.'; MemoText2 = ' Für das Feld "Praxisname" gilt zusätzlich, daß auch ein Suchtext im Eingabefeld stehen muß,'; MemoText3 = ' denn in der Datenbank darf der Praxisname nicht leer sein.'; MemoText4 = ' In den anderen Feldern kann somit auch danach gesucht werden, ob sie leer sind.'; Procedure EinstellungenLesen; Procedure EinstellungenSchreiben; Procedure SuchSQLerzeugen; Procedure SucheStarten; PUBLIC { Public-Deklarationen } END; VAR FormSuchPrax: TFormSuchPrax; IMPLEMENTATION {$R *.dfm} { TFormSuchPrax } Uses UnitData, GLD; // ##### PRIVATE METHODEN ############################################################################################################### // ---------- Einstellungen lesen ------------------------------------------------------------------------------------------------ Privat Procedure TFormSuchPrax.EinstellungenLesen; Var SCheck : String; i : Integer; begin Self.Left := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_LEFT').AsInteger; Self.Top := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_TOP').AsInteger; Self.Width := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_WIDTH').AsInteger; Self.Height := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_HEIGHT').AsInteger; Check_SuchResAktiv.Checked := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_SUCHRESAKTIV').AsBoolean; Check_GrossKlein.Checked := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_GROSSKLEIN').AsBoolean; Check_Exakt.Checked := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_EXAKT').AsBoolean; Ed_Praxisname.Text := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_PRAXIS').AsString; Ed_Strasse.Text := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_STRASSE').AsString; Ed_PLZ.Text := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_PLZ').AsString; Ed_Ort.Text := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_ORT').AsString; Ed_Homepage.Text := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_HOME').AsString; Ed_Email.Text := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_EMAIL').AsString; Ed_Telefon.Text := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_TELEFON').AsString; Check_Anfrage.Checked := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_GEMAILT').AsBoolean; Check_Antwort.Checked := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_GEANTWORTET').AsBoolean; SCheck := DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_CHECKLIST').AsString; If SCheck <> '' Then Begin i := 0; Repeat Inc(i); CheckList_SuchPrax.Checked[i-1] := SCheck[i] = '1'; Until (i = CheckList_SuchPrax.Count) Or (i = Length(SCheck)); End; Memo_Anleit.Lines.Text := MemoText1+MemoText2+MemoText3+MemoText4; end; // ---------- Einstellungen schreiben -------------------------------------------------------------------------------------------- Privat Procedure TFormSuchPrax.EinstellungenSchreiben; Var SCheck : String; i : Integer; begin SCheck := ''; For i := 0 To CheckList_SuchPrax.Count -1 Do If CheckList_SuchPrax.Checked[i] Then SCheck := SCheck + '1' Else SCheck := SCheck + '0'; DatMod.Qset_Benutzer.Edit; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_LEFT').AsInteger := Self.Left; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_TOP').AsInteger := Self.Top; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_WIDTH').AsInteger := Self.Width; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_HEIGHT').AsInteger := Self.Height; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_SUCHRESAKTIV').AsBoolean := Check_SuchResAktiv.Checked; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_GROSSKLEIN').AsBoolean := Check_GrossKlein.Checked; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_EXAKT').AsBoolean := Check_Exakt.Checked; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_PRAXIS').AsString := Ed_Praxisname.Text; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_STRASSE').AsString := Ed_Strasse.Text; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_PLZ').AsString := Ed_PLZ.Text; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_ORT').AsString := Ed_Ort.Text; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_HOME').AsString := Ed_Homepage.Text; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_EMAIL').AsString := Ed_Email.Text; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_TELEFON').AsString := Ed_Telefon.Text; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_GEMAILT').AsBoolean := Check_Anfrage.Checked; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_GEANTWORTET').AsBoolean := Check_Antwort.Checked; DatMod.Qset_Benutzer.FieldByName('SUCHPRAX_CHECKLIST').AsString := SCheck; DatMod.Qset_Benutzer.Post; end; // ---------- Suchstring erzeugen ------------------------------------------------------------------------------------------------ Privat Procedure TFormSuchPrax.SuchSQLerzeugen; Const SqlW = ' where '; SqlA = ' and '; Var Aus : String; W : Integer; begin GLD.URec.Praxen_SQL := GLD.PraxenDefaultSQL; // Praxisname If CheckList_SuchPrax.Checked[0] And (Ed_Praxisname.Text <> '') Then Begin If Check_Exakt.Checked Then Aus := SqlW + 'PRAXIS = ' + QuotedStr(Ed_Praxisname.Text) Else Aus := SqlW + 'PRAXIS like ' + QuotedStr('%' + Ed_Praxisname.Text + '%'); GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + Aus; End; // Straße // If CheckList_SuchPrax.Checked[1] And (Ed_Strasse.Text <> '') Then If CheckList_SuchPrax.Checked[1] Then Begin If GLD.URec.Praxen_SQL = GLD.PraxenDefaultSQL Then GLD.URec.Praxen_SQL := GLD.PraxenDefaultSQL + SqlW Else GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + SqlA; If Check_Exakt.Checked Then Aus := 'STRASSE = ' + QuotedStr(Ed_Strasse.Text) Else Aus := 'STRASSE like ' + QuotedStr('%' + Ed_Strasse.Text + '%'); GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + Aus; End; // PLZ // If CheckList_SuchPrax.Checked[2] And (Ed_PLZ.Text <> '') Then If CheckList_SuchPrax.Checked[2] Then Begin If GLD.URec.Praxen_SQL = GLD.PraxenDefaultSQL Then GLD.URec.Praxen_SQL := GLD.PraxenDefaultSQL + SqlW Else GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + SqlA; If Check_Exakt.Checked Then Aus := 'PLZ = ' + QuotedStr(Ed_PLZ.Text) Else Aus := 'PLZ like ' + QuotedStr('%' + Ed_PLZ.Text + '%'); GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + Aus; End; // Ort // If CheckList_SuchPrax.Checked[3] And (Ed_Ort.Text <> '') Then If CheckList_SuchPrax.Checked[3] Then Begin If GLD.URec.Praxen_SQL = GLD.PraxenDefaultSQL Then GLD.URec.Praxen_SQL := GLD.PraxenDefaultSQL + SqlW Else GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + SqlA; If Check_Exakt.Checked Then Aus := 'ORT = ' + QuotedStr(Ed_Ort.Text) Else Aus := 'ORT like ' + QuotedStr('%' + Ed_Ort.Text + '%'); GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + Aus; End; // Homepage // If CheckList_SuchPrax.Checked[4] And (Ed_Homepage.Text <> '') Then If CheckList_SuchPrax.Checked[4] Then Begin If GLD.URec.Praxen_SQL = GLD.PraxenDefaultSQL Then GLD.URec.Praxen_SQL := GLD.PraxenDefaultSQL + SqlW Else GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + SqlA; If Check_Exakt.Checked Then Aus := 'HOME = ' + QuotedStr(Ed_Homepage.Text) Else Aus := 'HOME like ' + QuotedStr('%' + Ed_Homepage.Text + '%'); GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + Aus; End; // If CheckList_SuchPrax.Checked[5] And (Ed_Email.Text <> '') Then If CheckList_SuchPrax.Checked[5] Then Begin If GLD.URec.Praxen_SQL = GLD.PraxenDefaultSQL Then GLD.URec.Praxen_SQL := GLD.PraxenDefaultSQL + SqlW Else GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + SqlA; If Check_Exakt.Checked Then Aus := 'MAIL = ' + QuotedStr(Ed_Email.Text) Else Aus := 'MAIL like ' + QuotedStr('%' + Ed_Email.Text + '%'); GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + Aus; End; // Telefon // If CheckList_SuchPrax.Checked[6] And (Ed_Telefon.Text <> '') Then If CheckList_SuchPrax.Checked[6] Then Begin If GLD.URec.Praxen_SQL = GLD.PraxenDefaultSQL Then GLD.URec.Praxen_SQL := GLD.PraxenDefaultSQL + SqlW Else GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + SqlA; If Check_Exakt.Checked Then Aus := 'TELEFON = ' + QuotedStr(Ed_Telefon.Text) Else Aus := 'TELEFON like ' + QuotedStr('%' + Ed_Telefon.Text + '%'); GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + Aus; End; // Wurde bereits eine Anfrage verschickt? If CheckList_SuchPrax.Checked[7] And Check_Anfrage.Checked Then Begin If GLD.URec.Praxen_SQL = GLD.PraxenDefaultSQL Then GLD.URec.Praxen_SQL := GLD.PraxenDefaultSQL + SqlW Else GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + SqlA; If Check_Anfrage.Checked Then W := 1 Else W := 0; Aus := 'GEMAILT = ' + IntToStr(W); GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + Aus; End; // Wurde die Anfrage bereits beantwortet? If CheckList_SuchPrax.Checked[8] And Check_Antwort.Checked Then Begin If GLD.URec.Praxen_SQL = GLD.PraxenDefaultSQL Then GLD.URec.Praxen_SQL := GLD.PraxenDefaultSQL + SqlW Else GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + SqlA; If Check_Antwort.Checked Then W := 1 Else W := 0; Aus := 'ANTWORT = ' + IntToStr(W); GLD.URec.Praxen_SQL := GLD.URec.Praxen_SQL + Aus; End; end; // ---------- Suche starten ------------------------------------------------------------------------------------------------------ Privat Procedure TFormSuchPrax.SucheStarten; Var i : Integer; begin SuchSQLerzeugen; If Check_SuchResAktiv.Checked Then Begin i := GLD.URec.Praxen_Id; DatMod.View_Praxis.Active := False; DatMod.View_Praxis.SQL.Text := GLD.URec.Praxen_SQL; DatMod.View_Praxis.Open; DatMod.View_Praxis.Locate('ID',i,[]); End; ModalResult := mrOk; end; // ##### PUBLIC METHODEN ################################################################################################################ // ---------- -------------------------------------------------------------------------------------------------------------------- Public // ##### EREIGNISSE ##################################################################################################################### // ---------- On Show -------------------------------------------------------------------------------------------------------- Ereignisse Procedure TFormSuchPrax.FormShow(Sender: TObject); begin EinstellungenLesen; Ed_Praxisname.SetFocus; end; // ---------- On Close ------------------------------------------------------------------------------------------------------- Ereignisse Procedure TFormSuchPrax.FormClose(Sender: TObject; var Action: TCloseAction); begin EinstellungenSchreiben; end; // ---------- Status eines Kontrollkästchens geändert ------------------------------------------------------------------------ Ereignisse Procedure TFormSuchPrax.CheckList_SuchPraxClickCheck(Sender: TObject); Var i : Integer; begin If CheckList_SuchPrax.Checked[9] Then For i := 0 To CheckList_SuchPrax.Count-1 Do CheckList_SuchPrax.Checked[i] := False; end; // ---------- On KeyPress Editfelder ----------------------------------------------------------------------------------------- Ereignisse Procedure TFormSuchPrax.Ed_PraxisnameKeyPress(Sender: TObject; var Key: Char); begin If Key = #13 Then Begin Key := #0; SucheStarten; End; end; // ---------- Button Suche starten gedrückt ---------------------------------------------------------------------------------- Ereignisse Procedure TFormSuchPrax.Btn_SuchClick(Sender: TObject); begin SucheStarten; end; // ---------- Edits leeren --------------------------------------------------------------------------------------------------- Ereignisse Procedure TFormSuchPrax.Btn_ClearClick(Sender: TObject); begin Ed_Praxisname.Clear; Ed_Strasse.Clear; Ed_PLZ.Clear; Ed_Ort.Clear; Ed_Homepage.Clear; Ed_Email.Clear; Ed_Telefon.Clear; Check_Anfrage.Checked := False; Check_Antwort.Checked := False; end; // ---------- Suchfenster schließen ------------------------------------------------------------------------------------------ Ereignisse Procedure TFormSuchPrax.Btn_CloseClick(Sender: TObject); begin ModalResult := mrCancel; end; end. |
AW: Suchfunktion in einem DBGrid
Danke für die ausführlichen Hilfen!
ich werde es mir jetzt in ruhe angucken :) |
AW: Suchfunktion in einem DBGrid
Wird gerne vergessen geht aber auch sehr schön
![]() |
AW: Suchfunktion in einem DBGrid
Hi,
oder man nimmt: ![]() Da kann man oben im Grid eine "Suchzeile" einblenden. Gruß Sigi |
AW: Suchfunktion in einem DBGrid
danke nochmals für die guten vorschläge
hab diese auch verwendet jedoch ohne gutes ergebnis jetzt bin ich total planlos könnte mir vllt jemand ein beispiel geben mit code, wie ich in meiner anwendung auf meine datenbank zugreife und somit eine abfrage stellen kann? |
AW: Suchfunktion in einem DBGrid
Zitat:
Es wurde dir massig Code gezeigt von Perlsau. Klar, dass das nicht so 100% zu deiner Anwendung passt, wie auch? Wir wissen nicht was du an Code bisher hast, wie sollen wir dir da zu einem Plan verhelfen? |
AW: Suchfunktion in einem DBGrid
Es kommt auch darauf an, ob Du das Ergebnis nur lokal filtern, im Grid zu einem bestimmten DS spingen oder eine neue Abfrage starten möchtest.
|
AW: Suchfunktion in einem DBGrid
Zitat:
Zitat:
Zitat:
![]() Im Grunde sagst du hier ja nur eines: "Egal was ihr mir hier erzählt, ich blick das alles nicht." Wenn das so richtig interpretiert ist, dann empfiehlt es sich, erst einmal mit leichteren Aufgaben zu beginnen und später, wenn die Grundlagen soweit erarbeitet und gefestigt wurden, schwierigere Themen wie Datenbankentwicklung anzugehen. |
AW: Suchfunktion in einem DBGrid
Suchst Du sowas in der Art?
Delphi-Quellcode:
oder eher eine neue Abfrage für die Datenbank?
procedure Tform1.ButtonSuchmalwasClick(Sender: TObject);
var sSuchbegriff : String; begin // Wenn es eine separate Eingabe sein soll: sSuchbegriff := InputBox('Nach Namen suchen','zu suchender Name:',''); if sSuchbegriff <> '' then begin tabelle.Locate('Name',sSuchbegriff,[loCaseInsensitive,loPartialKey]); end; end; procedure Tform1.ButtonSuchmalwasClick(Sender: TObject); begin // Suchen, was im Editfeld steht: if Editfeld.Text <> '' then begin tabelle.Locate('Name',Editfeld.Text,[loCaseInsensitive,loPartialKey]); end; end; procedure Tform1.ButtonSuchmalwasClick(Sender: TObject); begin // Nur die Sätze anzeigen, bei denen der Name mit der Eingabe im Editfeld übereinstimmt. tabelle.Filtered := False; tabelle.Filter := Format('Name = %s ',[QuotedStr(Editfeld.Text]); tabelle.Filtered := True; end;
Delphi-Quellcode:
procedure Tform1.ButtonSuchmalwasClick(Sender: TObject);
begin qry.Close; qry.SQL.Text := Format('select * from Tabelle where name like %s',[QuotedStr(Editfeld.text]); qry.Open; end; |
AW: Suchfunktion in einem DBGrid
Zitat:
SQL-Code:
select
<Feldliste> from Tabelle where (suchbegriff = '') or (name like :suchbegriff);
Delphi-Quellcode:
if Trim(sSuchbegriff) <> '' then begin
qry.ParamByName('suchbegriff').Value := '%'+Trim(sSuchBegriff)+'%'; else qry.ParamByName('suchbegriff').Value := ''; qry.Refresh; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 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 by Thomas Breitkreuz