Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#4

AW: Suchfunktion in einem DBGrid

  Alt 7. Sep 2015, 12:13
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.
Da gibt es mehrere Möglichkeiten. Daß du nicht im DBGrid, sondern im zugrundeliegenden Dataset/Query/Table suchen mußt, wurde bereits mitgeteilt.
  1. Du kannst die Filterfunktion deines Datasets verwenden und dort den Filter eingeben.
  2. Du kannst das SQL-Property deines Datasets verwenden und den Select-Befehl um eine entsprechende Where-Klausel erweitern
  3. Wenn ich – entgegen deiner Anforderung – nur zum gesuchten Datensatz im DBGrid springen will, realisiere ich das mit eine Tastaturabfrage im DBGrid:

Delphi-Quellcode:
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;
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.

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;
// Email
// 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.
Miniaturansicht angehängter Grafiken
suchmaske.jpg  
  Mit Zitat antworten Zitat