找回密码
 立即注册

QQ登录

只需一步,快速开始

ZenosZeng 讲师达人认证 悬赏达人认证

超级版主

300

主题

7876

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
13142

活字格认证圣诞拼拼乐微信认证勋章讲师达人元老葡萄悬赏达人

ZenosZeng 讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-3-1 11:03  /   查看:9323  /  回复:8
首先说明一下“动态报表”究竟指的哪一类报表,顾名思义“动态报表”就是指没有固定报表模板,需要根据实际业务需要动态生成模板的报表。我们以职业技能培训管理系统为例,假设职业技能培训的课程包括以下课程:常规技能、商务礼仪、时间管理、财务税务、采购流程、金融投资、国际贸易、企业管理等课程。此时,公司需要对不同岗位的员工,以及他们以往是否进行过相应课程的培训,从而制定出不同的培训计划,最终的计划如下:


制定好员工的培训计划之后,职业技能培训管理系统需要对每位员工生成相应的培训计划报告,现在头疼的事情来了,每位员工参加的课程完全不一样,而且每一门课程对应的报表内容也不一样,那么如何利用ActiveReports 6.0来生成每位员工的培训计划报告呢。
这里我们就可以使用动态报表的方法来实现该需求,具体可以有两种实现方法,一种是利用子报表动态加载报表模板,一种就是动态组合各个报表内容:
方法一:使用子报表:首先有一个主报表,用于组织各种报表模板,然后在主报表的detail_Format事件中动态添加子报表的模板
  1.     private void detail_Format(object sender, EventArgs e)
  2.     {
  3.         switch ("课程名称")
  4.         {
  5.             case "常规技能":
  6.                 subReport1.Report = new Report常规技能();
  7.                 break;
  8.             case "商务礼仪":
  9.                 subReport1.Report = new Report商务礼仪();
  10.                 break;
  11.             case "时间管理":
  12.                 subReport1.Report = new Report时间管理();
  13.                 break;
  14.             case "财务税务":
  15.                 subReport1.Report = new Report财务税务();
  16.                 break;
  17.             case "采购流程":
  18.                 subReport1.Report = new Report采购流程();
  19.                 break;
  20.             case "金融投资":
  21.                 subReport1.Report = new Report金融投资();
  22.                 break;
  23.             case "国际贸易":
  24.                 subReport1.Report = new Report国际贸易();
  25.                 break;
  26.             case "企业管理":
  27.                 subReport1.Report = new Report企业管理();
  28.                 break;
  29.             default:
  30.                 break;
  31.         }
  32.     }
复制代码
方法二:动态组合报表模板:该方法也是需要动态添加报表模板,不过添加模板的时机与方法一不一样,首先生成一个空的报表,然后动态生成各个报表的内容,并把动态生成的内容合并到空报表中:
  1.     private void Form1_Load(object sender, EventArgs e)
  2.     {
  3.         DataDynamics.ActiveReports.ActiveReport rptSub;
  4.         DataDynamics.ActiveReports.ActiveReport rptMain = new DataDynamics.ActiveReports.ActiveReport();

  5.         foreach (var "课程名称" in "所有课程")
  6.         {
  7.             switch ("课程名称")
  8.             {
  9.                 case "常规技能":
  10.                     rptSub = new Report常规技能();
  11.                     break;
  12.                 case "商务礼仪":
  13.                     rptSub = new Report商务礼仪();
  14.                     break;
  15.                 case "时间管理":
  16.                     rptSub = new Report时间管理();
  17.                     break;
  18.                 case "财务税务":
  19.                     rptSub = new Report财务税务();
  20.                     break;
  21.                 case "采购流程":
  22.                     rptSub = new Report采购流程();
  23.                     break;
  24.                 case "金融投资":
  25.                     rptSub = new Report金融投资();
  26.                     break;
  27.                 case "国际贸易":
  28.                     rptSub = new Report国际贸易();
  29.                     break;
  30.                 case "企业管理":
  31.                     rptSub = new Report企业管理();
  32.                     break;
  33.                 default:
  34.                     break;
  35.             }
  36.             rptSub.Run();
  37.             rptMain.Document.Pages.AddRange(rptSub.Document.Pages);
  38.         }
  39.         this.viewer1.Document = rptMain.Document;
  40.     }
复制代码
以上两种方法看似乎只是使用switch语句的时机不同,但其本质在于是否使用SubReport,在无法使用SubReport的情况下,第二种方法就成为另一种选择。

此外,第二种方法还有一种运用场景,在实际中如果报表数据量比较大(特别是在Web系统中),我们可能将报表拆分为多个小的报表进行显示,然后,我们在导出时又希望将各个小的报表作为一个报表进行导出,此时,也可以利用第二种方法来实现。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

8 个回复

倒序浏览
liutianfeiyun
初级会员   /  发表于:2013-8-16 13:33:00
沙发
这个方法能给一个具体的列子吗?现在很需要这样的功能~尤其是“在实际中如果报表数据量比较大(特别是在Web系统中),我们可能将报表拆分为多个小的报表进行显示,然后,我们在导出时又希望将各个小的报表作为一个报表进行导出,此时,也可以利用第二种方法来实现”
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-8-16 17:55:00
板凳
回复 2楼liutianfeiyun的帖子

好的。我们会制作源程序并且上传,下周一回复。
回复 使用道具 举报
liutianfeiyun
初级会员   /  发表于:2013-8-16 18:55:00
地板
谢谢,期待你们的Demo,希望能解决我的一个报表20多列的问题!!!
一个报表120多列,在web端显示根本无法查看,就需要把他拆分了,然后在导出Excel的时候在合并!
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-8-19 10:14:00
5#
回复 4楼liutianfeiyun的帖子

liutianfeiyun 你好

你看这篇文章中提供的示例是否是你需要的功能,如果与你的需求有不符的地方,能否将你的报表截图发送给我,以便于实现更符合你需求的示例
http://blog.gcpowertools.com.cn/post/2013/08/19/ActiveReports_DynamicReport.aspx
回复 使用道具 举报
liutianfeiyun
初级会员   /  发表于:2013-8-19 14:37:00
6#
版主,您好,真心的觉得你们的效率很好,今天登录论坛就看到了Demo,在此深表感谢!
我看了您的Demo,还有一个疑问就是,做这样的动态列报表就只能采用区域报表?能采用页面报表不呢?区域报表够灵活相对页面报表上手还是有点点难度?
然后我还有一个问题请教一下,就是如果我的一个报表的列达到100多列,在web端显示了但是肯定无法查看,然后我看你们的博客上提到可以采用子报表来分开显示,然后在导出Excel的时候在合并显示,这样能做到不?还请给一个Demo,或者给一个跟详细点的解决方案!
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-8-19 17:50:00
7#
liutianfeiyun 你好

针对你的需求,我这边需要一点时间进行编码实现,预计会在1-2个工作日内给你提供你所需要功能的演示代码。完成之后我会给你回帖。
回复 使用道具 举报
liutianfeiyun
初级会员   /  发表于:2013-8-20 10:12:00
8#
好的,谢谢!
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-8-23 17:56:00
9#
我看了您的Demo,还有一个疑问就是,做这样的动态列报表就只能采用区域报表?能采用页面报表不呢?区域报表够灵活相对页面报表上手还是有点点难度?

区域报表和页面报表很大的一点区别在于区域报表可以通过后台C#/VB.NET代码来实现自定义的动态报表;区域报表的动态体现在用户和报表的交互性上,比如数据排序,页面报表中的动态行列报表时通过矩阵控件Matrix来实现的

报表合并示例程序如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部