2009-08-11 4 views
1

ich mit adodb/dbGo Programmierung und versuchen, diesen Code zu verwenden:Filtern von Daten auf DBGrid auf DBEdit keypress

procedure TfrMain.dbeNoMejaKeyPress(Sender: TObject; var Key: Char); 
begin 
    dmWarbam.TblTrans_temp.Filtered := False; 
    dmWarbam.TblTrans_temp.Filter := 'ID_ITEM = ' + QuotedStr(dbeNoMeja.Text); 
    dmWarbam.TblTrans_temp.Filtered := True; 
end;

und

procedure TfrMain.dbeNoMejaChange(Sender: TObject); 
begin 
    dmWarbam.TblTrans_temp.Filtered := False; 
    dmWarbam.TblTrans_temp.Filter := 'ID_ITEM = ' + QuotedStr(dbeNoMeja.Text); 
    dmWarbam.TblTrans_temp.Filtered := True; 
end;

Aber keiner kann über Arbeit, wenn i-Taste drücken auf dbeNoMeja hat es nicht gefiltert, sondern stattdessen den Datensatz gebrochen/unvollständige Daten in die Datenbank einfügen.

Kann mir jemand einige Beispiel geben, dass die Arbeit (Voll Code)

+0

Welche Version von Delphi sind Sie arbeiten in? –

+0

Delphi 7 Pro & Turbo Delphi Explorer 2006 – Dels

Antwort

3

Wenn die DBEdit an einen Tisch verbunden ist, wie die, die Sie Sie filtern möchten habe ein Problem, weil die Tabelle in den dsEdit-Status übergeht, sobald Sie beginnen, Text einzugeben.

Verwenden Sie einen normalen TEdit, und fügen Sie einen Platzhalter (*) auf die Zeichenfolge im Filter

dmWarbam.TblTrans_temp.Filter := 'ID_ITEM = ' + QuotedStr(edtNoMeja.Text+'*'); 
+0

wow danke für das Zeigen von mir, also muss ich TEdit statt TDBEdit verwenden, ich denke, das könnte das Problem lösen – Dels

1

Codebeispiel aus Delphi-Neftalí angepasst. Schön und einfach!

procedure TForm1.Edit1Change(Sender: TObject); 
begin 

    // incremental search 
    ClientDataSet1.Locate('FirstName', Edit1.Text, [loCaseInsensitive, loPartialKey]); 
    Exit; 

    // actual data filtering 
    if (Edit1.Text = '') then begin 
    ClientDataSet1.Filtered := False; 
    ClientDataSet1.Filter := ''; 
    end 
    else begin 
    ClientDataSet1.Filter := 'FirstName >= ' + QuotedStr(Edit1.Text); 
    ClientDataSet1.Filtered := True; 
    end; 

end; 

Einstellung ClientDataSet des Anbieters zu ADO DB (in Ihrem Fall):

Path := ExtractFilePath(Application.ExeName) + 'Data.MDB'; 
    // Exist the MDB? 
    if FileExists(path) then begin 
    ClientDataSet1.ProviderName := 'DSProvider'; 
    ADOQ.Open; 
    ClientDataSet1.Active := True; 
    ADOQ.Close; 
    ClientDataSet1.ProviderName := ''; 
    lbldata.Caption := ExtractFileName(path); 
    Exit; 
    end; 
+0

ich nie, dass wir clientdataset in ADO-Programmierung verwenden, jede andere Lösung, die keine Verwendung von clientdataset benötigen? – Dels

1

ich eine gute Lösung in Expertenbörse gefunden,

unit dbg_filter_u; 

interface 

uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
    Grids, DBGrids, DBTables, Db, StdCtrls; 

type 
    TForm1 = class(TForm) 
    Table1: TTable; 
    DataSource1: TDataSource; 
    Query1: TQuery; 
    DBGrid1: TDBGrid; 
    cbFilterBox: TComboBox;  //a hidden combobox (Style = csDropDownList) 
    procedure Table1AfterOpen(DataSet: TDataSet); 
    procedure Table1AfterPost(DataSet: TDataSet); 
    procedure DBGrid1TitleClick(Column: TColumn); 
    procedure cbFilterBoxChange(Sender: TObject); 
    procedure cbFilterBoxClick(Sender: TObject); 
    procedure cbFilterBoxExit(Sender: TObject); 
    private 
    Procedure FillPickLists(ADBGrid : TDBGrid); 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.DFM} 

//For Accessing some Protected Methods 
type TCDBGrid = class(TCustomDBGrid); 

//Storing the Values into the Picklist-Propertys of the asscociated Columns, 
//this may cost time depending on the amount of the dataset 
Procedure TForm1.FillPickLists(ADBGrid : TDBGrid); 
const 
    SQL_Text = 'Select Distinct %s From %s'; 
var 
    q : TQuery; 
    i : integer; 
Begin 
    If (Assigned(ADBGrid)) and 
    (Assigned(ADBGrid.Datasource)) and 
    (Assigned(ADBGrid.Datasource.DataSet)) Then 
    Begin 
    If (ADBGrid.Datasource.DataSet is ttable) Then 
    begin 
     q := TQuery.Create(self); 
     try 
     try 
      q.DatabaseName := TTable(ADBGrid.Datasource.DataSet).DataBaseName; 
      for i := 0 to ADBGrid.Columns.Count - 1 do //for each column 
      begin 
      if ADBGrid.Columns[i].Field.FieldKind = fkData then //only physical fields 
      begin 
       ADBGrid.Columns[i].ButtonStyle := cbsNone; //avoid button-showing 
       ADBGrid.Columns[i].PickList.Clear; 
       q.Close; 
       q.SQL.text := Format(SQL_Text,[ADBGrid.Columns[i].Field.FieldName,TTable(ADBGrid.Datasource.DataSet).TableName]); 
       q.Open; 
       While not q.eof do 
       begin 
       ADBGrid.Columns[i].PickList.Add(q.Fields[0].AsString); 
       q.next; 
       end; 
       q.close; 
      end; 
      end; 
     finally 
      q.free; 
     end; 
     except 
     raise; 
     end; 
    end else 
     Raise exception.Create('This Version works only for TTables'); 
    end else 
    Raise Exception.Create('Grid not properly Assigned'); 
end; 

//Initial-Fill 
procedure TForm1.Table1AfterOpen(DataSet: TDataSet); 
begin 
    FillPickLists(DBGrid1); 
end; 

//Refill after a change 
procedure TForm1.Table1AfterPost(DataSet: TDataSet); 
begin 
    FillPickLists(DBGrid1); 
end; 


//Show a Dropdownbox for selecting, instead the title on Titleclick 
procedure TForm1.DBGrid1TitleClick(Column: TColumn); 
var 
    ARect : Trect; 
    DummyTC : TColumn; 
begin 
    If column.PickList.Count > 0 then 
    begin 
    cbFilterbox.Items.Assign(column.PickList); 
    ARect := TCDBGrid(Column.Grid).CalcTitleRect(Column,0,DummyTC); 
    cbfilterBox.top := Column.Grid.Top+1; 
    cbfilterBox.left := Column.Grid.left+Arect.Left+1; 
    cbFilterbox.Width := Column.Width; 
    cbFilterBox.Tag := Integer(Column); //Store the columnPointer 
    cbFilterBox.Show; 
    cbFilterBox.BringToFront; 
    cbFilterBox.DroppedDown := True; 
    end; 
end; 

//Build up the Filter 
procedure TForm1.cbFilterBoxChange(Sender: TObject); 
begin 
    cbFilterBox.Hide; 
    if cbFilterBox.Text <> TColumn(cbFilterBox.Tag).Title.Caption then 
    begin 
    Case TColumn(cbFilterBox.Tag).Field.DataType of 
     //Some Fieldtypes 
     ftstring : 
       TTable(TDBGrid(TColumn(cbFilterBox.Tag).Grid).Datasource.Dataset).Filter := 
        TColumn(cbFilterBox.Tag).Field.FieldName+' = '+QuotedStr(cbFilterBox.Text); 

     ftInteger, 
     ftFloat : 
       TTable(TDBGrid(TColumn(cbFilterBox.Tag).Grid).Datasource.Dataset).Filter := 
        TColumn(cbFilterBox.Tag).Field.FieldName+' = '+cbFilterBox.Text; 
    end; 
    TTable(TDBGrid(TColumn(cbFilterBox.Tag).Grid).Datasource.Dataset).Filtered := True; 
    end; 
end; 

//some Hiding-events 
procedure TForm1.cbFilterBoxClick(Sender: TObject); 
begin 
    cbFilterBox.Hide; 
end; 

procedure TForm1.cbFilterBoxExit(Sender: TObject); 
begin 
    cbFilterBox.Hide; 
end; 

end. 
+0

Sorry, diese "Lösung" basiert auf BDE-Datensätzen (TTables und TQuerys). Die BDE ist seit über 15 Jahren obsolet und wird am besten vermieden. – MartynA

+0

Ich versuche auch, für ADO-Tabellen neu zu codieren und Ihnen so schnell wie möglich zu senden –