将 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 可见并启用,则用户无需任何代码即可轻松定义它。
使用 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 可见并启用,则用户无需任何代码即可轻松定义它。