如何以3 * 3网格格式在快速报告中显示数据?

时间:2013-10-28 13:00:41

标签: delphi delphi-xe3 fastreport

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

enter image description here

我在MasterData1频段内的主页面上使用子报表。子报告MasterData波段如下

MasterData1乐队

TfrxReportPage1 - 第2列

enter image description here

子报表 - MasterData2属性第3列,RowCount 9

enter image description here

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

enter image description here

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

如果我在frxDBDataSet1设置了记录数0,那么它将显示如下所示的内容 它不是形成3 * 3网格,而是连续显示数据 enter image description here

2 个答案:

答案 0 :(得分:1)

编辑,因为上一个*答案不适用于较新版本

为子报告的masterdata band设置rowcount为9 在主报表中,复制包含子报表的masterdata band并将其插入两次 在主带之间放置一个标题带,并将属性StartNewPage设置为true 将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;

enter image description here

(*)对于较旧的报告版本,您可以使用其他方法,该方法在版本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;

enter image description here

答案 1 :(得分: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备忘录中声明的两个变量,在Global Array myid&amp;帮助下在OnGetValue事件中分配给它的值。 mydesc。全球数组myid&amp; mydesc在FormCreate事件中填充了数据库字段值。