我使用FastReport进行了报告,并且还在DBGrid中提供了数据。我想通过DBGrid报告基于我单击的数据的双击事件。例如,我点击ID为007的数据,它会显示数据ID为007的报告,如何制作过滤器?
答案 0 :(得分:3)
为了解释的目的,我们来看看下面的例子:
DbGrid通过DataSource1连接到数据库 - > MainQuery:TQuery
其中MainQuery.SQL = 'SELECT * FROM TABLE1'
;
要显示在DbGrid中选择的仅一条记录的数据,您可以执行以下操作:
在表单中放置另一个DataSet,例如名为“FilterQuery”的TQuery
组件
将FilterQuery连接到与MainQuery相同的数据源,并将FilterQuery.SQL
属性指定为:
变体1:准备按SQL文本过滤
'SELECT * FROM TABLE1 WHERE ID = 0'
或变体2:准备按参数
过滤'SELECT * FROM TABLE1 WHERE ID = :P'
或变体3:准备通过“过滤”属性进行过滤
'SELECT * FROM TABLE1 WHERE ID'
将FastReport组件frxDBDataset1:TfrxDBDataset连接到FilterQuery。 根据需要准备FastReport模板。
现在我们准备好显示记录了。
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
//prepare the filter according to the selected record
try
//Variant 1:
FilterQuery.SQL := Format('SELECT * FROM TABLE1 WHERE ID = %s',[MainQuery.FieldByName('ID').asString]);
//Variant 2:
FilterQuery.ParamByName('P').Value := MainQuery.FieldByName('ID').Value;
//Variant 3 ( not recomended because here all data will be loaded from database):
FilterQuery.Filter := Format('ID = %s', [MainQuery.FieldByName('ID').asString]);
FilterQuery.Filtered := true;
//open query
FilterQuery.Refresh;
//prepare report
frxReport1.LoadFromFile('MyReportTemplateFile.fr3');
frxReport1.PrepareReport;
//show report
frxReport1.ShowPreparedReport;
finally
FilterQuery.Close;
end;
end;
答案 1 :(得分:0)
感谢 但我改变了一点,它的工作原理
试
ADOQuery1.SQL.Text:='SELECT * from TABLE1 WHERE ID ='+
。ADOQuery2.FieldByName( 'ID')asString;
ADOQuery1.open; frxReport1.LoadFromFile( 'REPORT.fr3');
frxReport1.PrepareReport; frxReport1.ShowPreparedReport; 最后 ADOQuery1.Close; 端;