将Query / DataSource记录过滤到cxgrid上

时间:2015-03-06 16:28:25

标签: delphi delphi-xe2

使用Delphi XE2。

构建一个通过查询/数据源连接到数据库的软件包。

我想为表中的记录实现过滤器选项,因此只需单击一个按钮,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;

2 个答案:

答案 0 :(得分:3)

在您的代码中,您正在构建一个无效的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;

答案 1 :(得分:0)

您可以使用Query的Filter属性执行所需操作。首先,执行查询以获取可以显示的所有记录。

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的方法可能会更好。

Query的Filter的替代方法是cxGrid.TableView.DataSource.Filter。在代码中定义它比Query的Filter更复杂一些。但如果您使TableView的Navigator和Navigator.Filter可见并启用,则可以很容易地由用户定义而无需任何代码。

相关问题