动态报表实现方法

发布时间:2012/11/15 00:11 发布者:葡萄城产品团队

返回博客中心

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


制定好员工的培训计划之后,职业技能培训管理系统需要对每位员工生成相应的培训计划报告,现在头疼的事情来了,每位员工参加的课程完全不一样,而且每一门课程对应的报表内容也不一样,那么如何利用ActiveReports 6.0来生成每位员工的培训计划报告呢。
这里我们就可以使用动态报表的方法来实现该需求,具体可以有两种实现方法,一种是利用子报表动态加载报表模板,一种就是动态组合各个报表内容:
方法一:使用子报表:首先有一个主报表,用于组织各种报表模板,然后在主报表的detail_Format事件中动态添加子报表的模板

  1.     
    private void detail_Format(object sender, EventArgs e)
        {
            switch ("课程名称")
            {
                case "常规技能":
                    subReport1.Report = new Report常规技能();
                    break;
                case "商务礼仪":
                    subReport1.Report = new Report商务礼仪();
                    break;
                case "时间管理":
                    subReport1.Report = new Report时间管理();
                    break;
                case "财务税务":
                    subReport1.Report = new Report财务税务();
                    break;
                case "采购流程":
                    subReport1.Report = new Report采购流程();
                    break;
                case "金融投资":
                    subReport1.Report = new Report金融投资();
                    break;
                case "国际贸易":
                    subReport1.Report = new Report国际贸易();
                    break;
                case "企业管理":
                    subReport1.Report = new Report企业管理();
                    break;
                default:
                    break;
            }
        }
    复制代码
    方法二:动态组合报表模板:该方法也是需要动态添加报表模板,不过添加模板的时机与方法一不一样,首先生成一个空的报表,然后动态生成各个报表的内容,并把动态生成的内容合并到空报表中:
  1.   
    private void Form1_Load(object sender, EventArgs e)
        {
            DataDynamics.ActiveReports.ActiveReport rptSub;
            DataDynamics.ActiveReports.ActiveReport rptMain = new DataDynamics.ActiveReports.ActiveReport();
    
            foreach (var "课程名称" in "所有课程")
            {
                switch ("课程名称")
                {
                    case "常规技能":
                        rptSub = new Report常规技能();
                        break;
                    case "商务礼仪":
                        rptSub = new Report商务礼仪();
                        break;
                    case "时间管理":
                        rptSub = new Report时间管理();
                        break;
                    case "财务税务":
                        rptSub = new Report财务税务();
                        break;
                    case "采购流程":
                        rptSub = new Report采购流程();
                        break;
                    case "金融投资":
                        rptSub = new Report金融投资();
                        break;
                    case "国际贸易":
                        rptSub = new Report国际贸易();
                        break;
                    case "企业管理":
                        rptSub = new Report企业管理();
                        break;
                    default:
                        break;
                }
                rptSub.Run();
                rptMain.Document.Pages.AddRange(rptSub.Document.Pages);
            }
            this.viewer1.Document = rptMain.Document;
        }
    复制代码
    以上两种方法看似乎只是使用switch语句的时机不同,但其本质在于是否使用SubReport,在无法使用SubReport的情况下,第二种方法就成为另一种选择。

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

关于葡萄城

赋能开发者!葡萄城是专业的集开发工具、商业智能解决方案、低代码开发平台于一身的软件和服务提供商,为超过 75% 的全球财富 500 强企业提供服务。葡萄城专注控件软件领域30年,希望通过模块化的开发控件、灵活的低代码应用开发平台等一系列开发工具、解决方案和服务,帮助开发者快速响应复杂多变的业务需求,最大程度地发挥开发者的才智和潜能,让开发者的 IT 人生更从容更美好。

了解详情,请访问葡萄城官网