2009-08-11 84 views
1

我ADODB/dbgo編程,並嘗試使用此代碼:過濾數據

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;

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;

但這些都不以上即可工作,當我按下鍵dbeNoMeja它沒有過濾,而是將破損/不完整的數據插入數據庫。

有人可以給我一些例子工作(全碼)

+0

什麼版本的Delphi是你在工作? – 2009-08-11 05:17:50

+0

Delphi 7 Pro&Turbo Delphi Explorer 2006 – Dels 2009-08-11 08:43:47

回答

3

如果dbedit連接到同一個表作爲一個要過濾的你有一個問題,因爲一旦你開始輸入文本,表格就會進入dsEdit狀態。

使用普通TEDIT,並在過濾器

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

哇感謝指向我,所以我必須使用TEdit,而不是TDBEdit,我想這可以解決這個問題 – Dels 2009-08-12 01:31:05

1

代碼示例改編自Delphi-Neftalí。好而簡單!

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; 

設置的ClientDataSet的提供者ADO DB(你的情況)

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

我從來不認爲我們會在ado編程中使用clientdataset,任何其他不需要使用clientdataset的解決方案? – Dels 2009-08-11 08:45:18

1

我發現在專家交流一個很好的解決方案附加一個通配符(*)的字符串,

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

對不起,這個「解決方案」是基於BDE數據集(TTables和Tquerys)。 BDE已經過時了15年,最好避免。 – MartynA 2016-06-16 09:50:07

+0

我很好地嘗試爲ADO表重新編碼並儘快發送給您 – 2016-06-16 17:18:06