我正在使用Delphi 16和Fast Reports 4.1。 Embarcadero Edidion。
粗略地说,我的问题是: 有没有办法强制frxReport(连接到数据库)在报告生成期间跳过一些表条目?
我的意思可以说明如下:
假设我们有一个来自数据库的大表,一个有1000个条目的表,并假设我们想要生成一个填充了该表中数据的报表,每个条目有一个页面。 当然,1000页报告将有点太多无法处理,因此我们需要一种方法来告诉快速报告在准备报告时要使用的表的哪些条目。
要仅选择表的所有条目的子集,我使用DBGrid设置DBGrid.Options.dgMultiselect:= True并使用鼠标单击选择所需的行。然后我将选定的行复制到一个单独的TClientDataSet(名为TempDataSet)组件中,之后我将当前报告的数据集设置为新创建的TempDataSet('frxDataSet1.DataSet:= TempDataSet')并启动准备报告。
这似乎没问题,但在我编程的应用程序的上下文中,是不可接受的。回到最初的问题:有没有办法控制'frxReport1.PrepareReport();'时必须访问'frxDBDataset1.DataSet'中的哪些条目?叫做 ?
谢谢
答案 0 :(得分:1)
我的回答有点偏离主题,参考你的上一条评论,可以使用Adodatasets作为Memorytables
var
I:Integer;
begin
for I := 0 to AdoDataset1.FieldCount - 1 do
begin
Adodataset2.FieldDefs.Add(AdoDataset1.Fields[i].FieldName
,AdoDataset1.Fields[i].Datatype
,AdoDataset1.Fields[i].Size);
end;
Adodataset2.CreateDataSet;
// just as example
While not AdoDataset1.Eof do // here would be you code for inserting selected Rows
begin
AdoDataset2.Append;
for I := 0 to AdoDataset1.FieldCount - 1 do
begin
Adodataset2.Fields[i].Assign(Adodataset1.Fields[i]);
end;
AdoDataset2.Post;
AdoDataset1.Next;
end;
end;
答案 1 :(得分:1)
您可以使用以下任何一种方法:
您的原始DataSet(如果DataSet能够过滤)。您通常会编写 a la SQL 过滤器,如下所示:
MyDataSet.Filter := 'MYCOLUMN in (''a'', ''b'', ''c'')';
MyDataSet.Filtered := True;
或撰写OnFilterRecord
事件以排除/包含您要在报告中显示的记录。
procedure TMyForm.MyDataSetFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
Accept := (DataSet.FieldByName('MYFIELD').AsInteger mod 7 = 0) or
(DataSet.FieldByName('MYOTHERFIELD').AsInteger in MySetOfValues);
end;
您还可以使用通常用于将报表绑定到数据的TfrxDBDataSet
组件的事件。写一个OnOpen
,OnFirst
,OnNext
,OnCheckEOF
事件处理程序,以防止报告包含所有记录"停止"只在您感兴趣的记录上。
例如,如果要打印每一行,可以写下:
procedure TMyForm.fdsEstPagosNext(Sender: TObject);
begin
MyDataSet.Next;
MyDataSet.Next; //advance not one, but two records.
end;