扩展系统自带报表:让你的数据呈现更加个性化原创
金蝶云社区-new_昵称
new_昵称
4人赞赏了该文章 248次浏览 未经作者许可,禁止转载编辑于2023年10月19日 09:25:07
封面

随着企业数据的不断增长,报表成为了我们了解业务状况和决策的重要工具。官方提供自带的报表功能,使我们能够快速生成一些基本的报表。然而,有时候这些系统自带的报表可能无法满足我们的个性化需求。这时,我们就需要学会如何扩展系统自带报表,让报表的呈现更加符合我们的实际需求。


下面我们共同探讨一下如何扩展系统报表:

所谓扩展报表,就是在基于过滤方案中的参数,先由系统生成一张临时表,我们在使用一些关联关系用原临时表+要添加的字段,生成一张新的临时表,最终展示。

1、我们首先要找到原报表使用的插件

1697676795254.png

我们可以看到,该报表使用的是Kingdee.K3.FIN.CB.App.Report.dll 下的 StockInCostDetailRpt

2、新建一个类,引用该插件,然后继承StockInCostDetailRpt

image.png

3、重写BuilderReportSqlAndTempTable方法,获取原临时表信息,并构建自己的关联关系,创建新临时表

public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
        {
            //获取原临时表表名
            Logger.Error("BuilderReportSqlAndTempTable,tableName:", tableName.ToString(), new Exception("BuilderReportSqlAndTempTable,tableName"));
            IDBService dbservice = Kingdee.BOS.App.ServiceHelper.GetService<IDBService>();
            TempTableName = dbservice.CreateTemporaryTableName(this.Context, 1);
            string strTable = TempTableName[0];

            base.BuilderReportSqlAndTempTable(filter, strTable);
            StringBuilder sb = new StringBuilder();
            //向临时表添加字段
            string strSql = string.Format(@"/*dialect*/select * into 新的临时表名 from 原临时表名 as t0 
left join (你的查询sql) as t1 on 关联关系",tableName,strTable);

            DBUtils.ExecuteDynamicObject(this.Context, strSql );
        }

4、有些报表数据是BOS定义的,有些报表数据是插件内定义的

此时需要在过滤框中新增隐藏列,然后通过BOS在报表中添加对应字段,前端刷新看看会不会展示(这一步是为了确定报表字段由哪里控制的)。如果是BOS里定义的请看第七步,如果是插件内定义的,看第五步。

1697677751361.png

5、字段构建是在插件内完成的,需要重写GetReportHeaders方法,添加需要的字段

 public override ReportHeader GetReportHeaders(IRptParams filter)
        {
            ReportHeader header = base.GetReportHeaders(filter);
            //header.AddChild("字段标识", new LocaleValue("前段展示名称")).ColIndex = 99;
            //header.AddChild("字段标识", new LocaleValue("前段展示名称")).ColIndex = 99;
            //header.AddChild("字段标识", new LocaleValue("前段展示名称")).ColIndex = 99;
             return header;
        }

6、最后不要忘记清除临时表哦

        public override void CloseReport()
        {
            for (int i = 0; i < 2; i++)
            {
                if (TempTableName[i].IsNullOrEmptyOrWhiteSpace())
                {
                    return;
                }
                var dbService = Kingdee.K3.SCM.App.ServiceHelper.GetService<IDBService>();
                dbService.DeleteTemporaryTableName(Context, TempTableName);
            }

            base.CloseReport();
        }

7、生成插件,放在安装目录bin目录,在报表中取消原服务器插件,注册新的服务器插件

image.png

现在我们就可以重启IIS后查看最终的效果啦

image.png

附插件全内容

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Report;
using Kingdee.BOS.Core.Report.PlugIn;
using Kingdee.BOS.Core.Report.PlugIn.Args;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Contracts.Report;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Contracts;
using Kingdee.K3.FIN.CB.App.Report;
using Kingdee.K3.FIN.App.Core;
using Kingdee.BOS.Log;
using Kingdee.BOS.Resource;

namespace Kingdee.ZL.FUXIN
{
    [Description("获取自定义信息")]
    public class StockInCostDetailRptSWAP : StockInCostDetailRpt

    {

        private string[] TempTableName;
        /// <summary>
        /// 向报表临时表,插入报表数据
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="tableName"></param>
        public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
        {
            public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
        {
            //获取原临时表表名
            Logger.Error("BuilderReportSqlAndTempTable,tableName:", tableName.ToString(), new Exception("BuilderReportSqlAndTempTable,tableName"));
            IDBService dbservice = Kingdee.BOS.App.ServiceHelper.GetService<IDBService>();
            TempTableName = dbservice.CreateTemporaryTableName(this.Context, 1);
            TempTableName[1] = tableName;
            string strTable = TempTableName[0];

            base.BuilderReportSqlAndTempTable(filter, strTable);
            StringBuilder sb = new StringBuilder();
            //向临时表添加字段
            string strSql = string.Format(@"/*dialect*/select * into 新的临时表名 from 原临时表名 as t0 
left join (你的查询sql) as t1 on 关联关系",tableName,strTable);

            DBUtils.ExecuteDynamicObject(this.Context, strSql );
        }
        }
        public override ReportHeader GetReportHeaders(IRptParams filter)
        {
            ReportHeader header = base.GetReportHeaders(filter);
            //header.AddChild("字段标识", new LocaleValue("前段展示名称")).ColIndex = 99;
            //header.AddChild("字段标识", new LocaleValue("前段展示名称")).ColIndex = 99;
            //header.AddChild("字段标识", new LocaleValue("前段展示名称")).ColIndex = 99;
             return header;
        }
        public override void CloseReport()
        {
            for (int i = 0; i < 2; i++)
            {
                if (TempTableName[i].IsNullOrEmptyOrWhiteSpace())
                {
                    return;
                }
                var dbService = Kingdee.K3.SCM.App.ServiceHelper.GetService<IDBService>();
                dbService.DeleteTemporaryTableName(Context, TempTableName);
            }

            base.CloseReport();
        }
    }
}

通过以上的方法和技巧,我们可以有效地扩展系统自带的报表功能,使其更贴合我们的实际需求。记住,报表不仅仅是数据的展示工具,更是我们了解业务、做出决策的重要依据。因此,定制化和个性化的报表可以帮助我们更好地理解和分析数据,从而推动业务发展。

希望以上的建议对各位开发者有所帮助,能够让您在使用系统自带报表时更加得心应手。


文章内容参照了帖子:https://vip.kingdee.com/article/470258876210820096?productLineId=1

赞 4