0

我正在使用 Delphi 16 和 Fast Reports 4.1。Embarcadero Edidion。

粗略地说,我的问题是:有没有办法强制 frxReport(连接到数据库)在报告生成期间跳过一些表条目?

我的意思可以解释如下:

假设我们有一个来自数据库的大表,其中包含 1000 个条目,并假设我们要生成一个填充了该表中数据的报告,每个条目一页。自然,1000 页的报告处理起来有点多,所以我们需要一种方法来告诉 Fast Report 在准备报告时要使用表格的哪些条目。

要仅选择表中所有条目的子集,我使用 DBGrid,在其中设置 DBGrid.Options.dgMultiselect := True 并通过鼠标单击选择所需的行。然后我将选定的行复制到一个单独的 TClientDataSet(named TempDataSet) 组件中,之后我将当前报告的数据集设置为新创建的 TempDataSet ('frxDataSet1.DataSet := TempDataSet') 并启动准备报告。

这似乎没问题,但在我正在编程的应用程序的上下文中,是不可接受的。所以回到最初的问题:有没有办法控制在“frxReport1.PrepareReport();”时必须访问“frxDBDataset1.DataSet”中的哪些条目?叫做 ?

谢谢

4

2 回答 2

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;
于 2013-04-09T17:35:56.720 回答
1

您可以使用以下任何一种方法:

筛选

您的原始数据集(如果数据集能够过滤)。您通常编写一个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 事件

您还可以TfrxDBDataSet借助通常用于将报表绑定到数据的组件的事件。编写一个OnOpen, OnFirst, OnNext,OnCheckEOF事件处理程序,以防止报告包含所有记录,方法是仅在您感兴趣的记录上“停止”。

例如,如果你想打印每一行,你可以这样写:

procedure TMyForm.fdsEstPagosNext(Sender: TObject);
begin
  MyDataSet.Next; 
  MyDataSet.Next; //advance not one, but two records.
end;
于 2013-04-09T20:34:56.370 回答