1

我想以网格格式在 FastReport 中显示表格(列:- ID)中的数据,如下所示。假设表中有 22 条记录,那么它会以以下方式在 FastReport 的 3 * 3 网格中显示相同的记录。

在此处输入图像描述

我在 MasterData1 带内的主页上使用子报表。在子报表 MasterData 带如下

MasterData1 带

TfrxReportPage1 - 列 2

在此处输入图像描述

子报表 - MasterData2 属性 Columns 3 , RowCount 9

在此处输入图像描述

但是当我预览快速报告时,它只是在页面上的每个网格中重复相同的数据,如下所示

在此处输入图像描述

我正在使用 frxDBDataSet1 来显示数据(记录数 9)。总共有 28 条记录,因此预计在页面上显示 4 个 3*3 网格,具有 27 个 ID。而是在每个 3*3 网格中重复前 9 个 ID,如上所示。

如果我在 frxDBDataSet1 设置 Number Of Records 0 那么它将显示如下所示它没有形成 3 * 3 网格但显示数据连续 在此处输入图像描述

4

2 回答 2

1

编辑,因为以前的*答案不适用于较新的版本

将子报表的主数据带的行数设置为 9。
在您的主报表中,复制包含子报表的主数据带并将其插入两次。
将属性 StartNewPage 设置为 true 的 masterband 之间放置一个 headerband。
将 OnBeforePrint 事件添加到第二个和第三个子报表以更改数据集的过滤器。

procedure Subreport2OnBeforePrint(Sender: TfrxComponent);
begin
  TfrxDBDataSet(Report.GetDataset('frxDBDataset1')).Dataset.Filter := 'ID>9';  
  TfrxDBDataSet(Report.GetDataset('frxDBDataset1')).Dataset.Filtered := true;                                          
end;

procedure Subreport3OnBeforePrint(Sender: TfrxComponent);
begin
  TfrxDBDataSet(Report.GetDataset('frxDBDataset1')).Dataset.Filter := 'ID>18';  
  TfrxDBDataSet(Report.GetDataset('frxDBDataset1')).Dataset.Filtered := true;  
end;

在此处输入图像描述

(*) 对于较旧的报告版本,您可以使用其他方法,该方法在 4.10.01 和 4.12.14 版本之间停止工作。

在子报表的备忘录中添加OnAfterPrint事件。打印 9“行”后将属性StartNewPage设置为 true,Masterband 的 Rowcount 必须设置为 1。

procedure YourMemoFromTheSubReportToRepeat9TimesPerPageOnAfterPrint(Sender: TfrxComponent);
begin
    MasterDataBandFromSubReport.StartNewPage := <Line#>  mod 9 = 0  
end;

在此处输入图像描述

于 2013-10-30T07:22:08.597 回答
0

公共变量声明

  public
    i: integer;
    myid: Array Of Integer;
    mydesc: Array Of String;
    k: Integer;
    rowcount: Integer;

FormCreate 事件中的代码

begin
    i := 0;
    k := 0;
    UniTable1.SQL.Text := 'Select * from userplays';
    UniTable1.Execute;
    rowcount := UniTable1.RecordCount;
    SetLength(myid, rowcount);
    SetLength(mydesc, rowcount);

      while not UniTable1.Eof do
      begin
         myid[k] := UniTable1.FieldByName('id').Value;
         mydesc[k] := UniTable1.FieldByName('description').Value;
         UniTable1.Next;
         inc(k);
      end;
end.

frxReport 的 OnGetValue 事件中的代码

var
  j: Integer;

begin
 j := i div 2;
 if j < rowcount then
   begin

     if (VarName = 'ID1') then
       Value :=  myid[j];

     if (VarName = 'DESC1') then
       Value :=  mydesc[j];

   end
 inc(i);

上面的 ID1 和 DESC1 是在 frxReport 备忘录中声明的两个变量,在全局数组 myid 和 mydesc 的帮助下,在 OnGetValue 事件中分配给它的值。全局数组 myid 和 mydesc 在 FormCreate 事件中填充数据库字段值。

于 2013-11-21T06:48:35.413 回答