将 Query/DataSource 条记录过滤到 cxgrid

Filter Query/DataSource records onto cxgrid

使用 Delphi XE2。

构建一个通过query/datasource连接到数据库的软件包。

我想为 table 中的记录实现一个过滤器选项,因此单击按钮后,cxgrid 将显示与过滤器选择相匹配的记录。

我不太明白该怎么做。任何帮助将不胜感激。

到目前为止有这个,但老实说,如果这接近我想要实现的目标,我还没有。

procedure TFilter.btnClick(Sender: TObject);
begin
with aQry do
begin
  SQL.Clear;
  Close;
  SQL.Text := 'select * from TABLE where record_name like'+QuotedStr(name.Text+'%');
  SQL.Text := 'and record_type like '+QuotedStr(type.Text+'%');
  SQL.Text := 'and record_type2 like '+QuotedStr(type2.Text+'%');
  SQL.Text := 'and record_type3 like '+QuotedStr(type3.Text+'%');
  SQL.Text := 'and record_type4 like '+QuotedStr(type4.Text+'%');
  Open;
end;
end;

在您的代码中,您正在构建一个无效的 SQL 句子,因为每次设置 Text 属性 时,您都会覆盖 SQL 的内容,所以必须用Add的方法来造SQL句。您还必须考虑使用参数。

尝试下一个示例,该示例根据在过滤器中输入的值构建和 运行 参数化 SQL 句子(也许您需要修改源代码才能 运行) .

  AQry.Close;
  AQry.SQL.Clear;
  AQry.SQL.Add('select * from TABLE where 1=1');
  if name.Text<>'' then
   AQry.SQL.Add('and record_name like :record_name');
  if Edittype.Text<>'' then
   AQry.SQL.Add('and record_type like :record_type');
  if type2.Text<>'' then
   AQry.SQL.Add('and record_type2 like :record_type2');
  if type3.Text<>'' then
   AQry.SQL.Add('and record_type3 like :record_type3');
  if type4.Text<>'' then
   AQry.SQL.Add('and record_type4 like :record_type4');

  if name.Text<>'' then
    Aqry.Parameters.ParamByName('record_name').Value :=  name.Text+ '%';
  if Edittype.Text<>'' then
    Aqry.Parameters.ParamByName('record_type').Value :=  Edittype.Text+ '%';
  if type2.Text<>'' then
    Aqry.Parameters.ParamByName('record_type2').Value :=  type2.Text+ '%';
  if type3.Text<>'' then
    Aqry.Parameters.ParamByName('record_type3').Value :=  type3.Text+ '%';
  if type4.Text<>'' then
    Aqry.Parameters.ParamByName('record_type4').Value :=  type4.Text+ '%';

  AQry.Open;

您可以使用查询过滤器属性 做您想做的事。首先,执行查询得到所有可以显示的记录。

aQry.SQL.Text := 'select * from TABLE'; 
aQry.Open;

然后当定义要过滤的值时,定义并激活过滤器

aQry.Filtered := false;
aQry.Filter := 'record_name like'+QuotedStr(name.Text+'%') '+
  'and record_type like '+QuotedStr(type.Text+'%') '+
  'and record_type2 like '+QuotedStr(type2.Text+'%') '+
  'and record_type3 like '+QuotedStr(type3.Text+'%') '+
  'and record_type4 like '+QuotedStr(type4.Text+'%');
aQry.Filtered := true;

如果更改了任何文本值,则必须再次执行上述操作。

这种方法在程序的内存中进行过滤,不会刷新数据库中的数据。如果您希望数据库中的数据在过滤器更改之间发生变化,RRUZ 的方法可能更适合您。

查询过滤器的替代方法是 cxGrid.TableView.DataSource.Filter。在代码中定义它比查询的过滤器稍微复杂一些。但是,如果您使 TableView 的导航器和 Navigator.Filter 可见并启用,则用户无需任何代码即可轻松定义它。