锐浪报表 Grid++Report 子报表 Delphi

    锐浪报表 Grid++Report 是国内较好的报表控件,本人一直使用它,做出很多特色的报表。可以说你的报表设计出来,它基本上能做出来。

    但是它帮助文件上,说的不深,近期因为要做一个有关社工的报表,大表中,嵌套2个子表。可以说,一个表到三个数据集,分别打印。

    在认真看了帮助的基础上,网上探索,基本无此类,特别是Delphi的帮助,几乎为零。经二天摸索,做出来了。

    一、设计思路

    1、大表和二个小表,可以设计为三个表,分别使用三个GridppReport控件,取名GridppReport1,GridppReport_sub1,GridppReport_sub2。

    2、设计报表打印模板

   (1)常规设计大表的模板

   (2)在需要小表的地方,使用ReportHeader或ReportFooter作为容器,通过插入“子报表“,默认名称SubReport1,实际上它是IGridppReport对象。

   (3)在报表模板编辑内,通过双击SubReport1,打开子报表进行编辑。

    注意:对于子报表,有二种编辑方式,一是上面讲的,通过 双击SubReport1,打开子报表进行编辑。二是另外设计一个报表模板,作为子报表模板,在SubReport1的“报表模板文件”属性中加入,即可。二种方式效果一样。

    3、三个数据集的导入

     数据的导入,主要有多种方式:

  (1)通过ADOQuery导入

  (2)通过XML或JSON导入

  (3)通过ClientDataset内在表中的现有数据,这种就是人们具有编程主导权的数据导入方式,最适合各种上表格的设计使用。

    因为,ClientDataset,已经在客户端的内存中,对于三层数据或云端数据来说,就近,最快速,最准确地打印,效果好,经测试在  B/S 程序中,打印也就很好的,可以通过  Grid++Report的插件方式打印,效果很好。

    本人最爱用此方式。这是,打印即时报表的最佳方式,如打印收据、发票等等。

    问题来了,这种方式,要通过  DetailGrid.Recordset 的Append方法加入一行数据,它需要在FetchRecord事件中执行。
       4、关联子报表对象

     子报表的对象是IGridppReport对象,实例的对象是TGridppRepor,二者是从属关系 ,找到他们的关系,可以关联的部位,很重要。

var SubReport1,SubReport2:IGridppReport;
begin
//关联子报表部件框的报表对象
  SubReport1:=GridppReport1.ControlByName('SubReport1').AsSubReport.Report;
  SubReport2:=GridppReport1.ControlByName('SubReport2').AsSubReport.Report;

     下一步最重要,就是让实例,即GridppReport_sub1与SubReport1关联:

//子报表部件框的报表对象关联一个外部报表对象,以便响应报表事件
   GridppReport1.ControlByName('SubReport1').AsSubReport.Report := GridppReport_Sub1.DefaultInterface;

    这样,我们就可以通过对GridppReport_Sub1的相关事件中,对子报表进行报表进行初始化和数据对接打印了。

   二、相关代码

    1、主报表

procedure TGroup_2_Frm.GridppReport1Initialize(Sender: TObject);
var H1,H2,N:Double;
    i:integer;
begin
  GridppReport1.LoadFromFile( ReportPath+'社工_小组_工作计划.grf' );
  H1:=StrToFloat(Edit1.text);
  H2:=StrToFloat(Edit2.text);
  GridppReport1.DesignTopMargin:=H1;
  GridppReport1.DesignBottomMargin:=H2;

  GP[0]:=GridppReport1.AddParameter('A1',grptString);
  GridppReport1.ParameterByName('A1').AsString:=DBEdit4.Text;
  GP[1]:=GridppReport1.AddParameter('A2',grptString);
  GridppReport1.ParameterByName('A2').AsString:=DBEdit5.Text;
  GP[2]:=GridppReport1.AddParameter('A3',grptString);
  GridppReport1.ParameterByName('A3').AsString:=DBEdit6.Text;
  GP[4]:=GridppReport1.AddParameter('A4',grptString);
  GridppReport1.ParameterByName('A4').AsString:=DBEdit8.Text;
  GP[5]:=GridppReport1.AddParameter('A5',grptString);
  GridppReport1.ParameterByName('A5').AsString:=DBEdit1.Text+DBEdit2.Text;
  GP[6]:=GridppReport1.AddParameter('A6',grptString);
  GridppReport1.ParameterByName('A6').AsString:=DBEdit3.Text;
  GP[7]:=GridppReport1.AddParameter('A7',grptString);
  GridppReport1.ParameterByName('A7').AsString:=DBEdit7.Text;
  GP[8]:=GridppReport1.AddParameter('A8',grptString);
  GridppReport1.ParameterByName('A8').AsString:=DBEdit9.Text;
  GP[9]:=GridppReport1.AddParameter('A9',grptString);
  GridppReport1.ParameterByName('A9').AsString:=DBMemo1.Text;

  GP[10]:=GridppReport1.AddParameter('A10',grptString);
  GridppReport1.ParameterByName('A10').AsString:=DBRichedit1.Text;
  GP[11]:=GridppReport1.AddParameter('A11',grptString);
  GridppReport1.ParameterByName('A11').AsString:=DBRichedit2.Text;
  GP[12]:=GridppReport1.AddParameter('A12',grptString);
  GridppReport1.ParameterByName('A12').AsString:=DBRichedit3.Text;
  GP[13]:=GridppReport1.AddParameter('A13',grptString);
  GridppReport1.ParameterByName('A13').AsString:=DBRichedit4.Text;
  GP[14]:=GridppReport1.AddParameter('A14',grptString);
  GridppReport1.ParameterByName('A14').AsString:=DBRichedit5.Text;
  GP[15]:=GridppReport1.AddParameter('A15',grptString);
  GridppReport1.ParameterByName('A15').AsString:=DBRichedit6.Text;

  GP[16]:=GridppReport1.AddParameter('A16',grptString);
  GridppReport1.ParameterByName('A16').AsString:=DBRichedit7.Text;
  GP[17]:=GridppReport1.AddParameter('A17',grptString);
  GridppReport1.ParameterByName('A17').AsString:=DBRichedit8.Text;
  GP[18]:=GridppReport1.AddParameter('A18',grptString);
  GridppReport1.ParameterByName('A18').AsString:=DBRichedit9.Text;
  with ClientDataset4 do
  begin
    N:=0;
    while Not Eof do
    begin
      N:=N+FieldByName('金额').AsCurrency;
      Next;
    end
  end;
  GP[19]:=GridppReport1.AddParameter('A19',grptString);
  GridppReport1.ParameterByName('A19').AsString:='申请经费总计: '+FloattoStr(N)+'(元)';
end;

procedure TGroup_2_Frm.GridppReport1FetchRecord(Sender: TObject);
var SubReport1,SubReport2:IGridppReport;
begin
//关联子报表部件框的报表对象
  SubReport1:=GridppReport1.ControlByName('SubReport1').AsSubReport.Report;
  SubReport2:=GridppReport1.ControlByName('SubReport2').AsSubReport.Report;

//子报表部件框的报表对象关联一个外部报表对象,以便响应报表事件
   GridppReport1.ControlByName('SubReport1').AsSubReport.Report := GridppReport_Sub1.DefaultInterface;
   GridppReport1.ControlByName('SubReport2').AsSubReport.Report := GridppReport_Sub2.DefaultInterface;

end;

    2、GridppReport_Sub1

procedure TGroup_2_Frm.GridppReport_Sub1Initialize(Sender: TObject);
begin
  GridppReport_Sub1.LoadFromFile(ReportPath+'社工_小组_1.grf');
  GR[0]:=GridppReport_Sub1.FieldByName('单元');
  GR[1]:=GridppReport_Sub1.FieldByName('单元名称');
  GR[2]:=GridppReport_Sub1.FieldByName('单元目标');
  GR[3]:=GridppReport_Sub1.FieldByName('内容方式');
  GR[4]:=GridppReport_Sub1.FieldByName('时间配置');
  GR[5]:=GridppReport_Sub1.FieldByName('工作人员');
end;


procedure TGroup_2_Frm.GridppReport_Sub1FetchRecord(Sender: TObject);
begin
  if not ClientDataSet3.Active then Exit;
  with ClientDataSet3 do
  Begin
    First;
    While Not Eof do
    begin
      GridppReport_Sub1.DetailGrid.Recordset.Append;
      GR[0].Value:=FieldByName('单元').AsString;
      GR[1].Value:=FieldByName('名称').AsString;
      GR[2].Value:=FieldByName('目标').AsString;
      GR[3].Value:=FieldByName('内容方式').AsString;
      GR[4].Value:=FieldByName('时长').AsString;
      GR[5].Value:=FieldByName('工作人员').AsString;
      GridppReport_Sub1.DetailGrid.Recordset.Post;
      Next;
    end;
    First;
  end;
end;

    3、GridppReport_Sub1

procedure TGroup_2_Frm.GridppReport_Sub2Initialize(Sender: TObject);
begin
  GridppReport_Sub1.LoadFromFile(ReportPath+'社工_小组_2.grf');
  GR[0]:=GridppReport_Sub2.FieldByName('序号');
  GR[1]:=GridppReport_Sub2.FieldByName('项目');
  GR[2]:=GridppReport_Sub2.FieldByName('单价');
  GR[3]:=GridppReport_Sub2.FieldByName('数量');
  GR[4]:=GridppReport_Sub2.FieldByName('金额');
  GR[5]:=GridppReport_Sub2.FieldByName('来源');
end;

procedure TGroup_2_Frm.GridppReport_Sub2FetchRecord(Sender: TObject);
begin
  if not ClientDataSet4.Active then Exit;
  with ClientDataSet4 do
  Begin
    First;
    While Not Eof do
    begin
      GridppReport_Sub2.DetailGrid.Recordset.Append;
      GR[0].Value:=FieldByName('单元').AsString;
      GR[1].Value:=FieldByName('项目').AsString;
      GR[2].Value:=FieldByName('单价').AsString;
      GR[3].Value:=FieldByName('数量').AsString;
      GR[4].Value:=FieldByName('金额').AsString;
      GR[5].Value:=FieldByName('经费来源').AsString;
      GridppReport_Sub2.DetailGrid.Recordset.Post;
      Next;
    end;
    First;
  end;
end;

    三、打印效果

锐浪报表 Grid++Report 子报表 Delphi_第1张图片

   上图窗口,下图打印效果,数据随意填写。

 锐浪报表 Grid++Report 子报表 Delphi_第2张图片

     上述观点,仅为个人笔记。

你可能感兴趣的:(Grid++Report,个人开发,开发语言,Grid++Report,delphi)