使用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;
答案 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可见并启用,则可以很容易地由用户定义而无需任何代码。