随着企业数据的不断增长,报表成为了我们了解业务状况和决策的重要工具。官方提供自带的报表功能,使我们能够快速生成一些基本的报表。然而,有时候这些系统自带的报表可能无法满足我们的个性化需求。这时,我们就需要学会如何扩展系统自带报表,让报表的呈现更加符合我们的实际需求。
下面我们共同探讨一下如何扩展系统报表:
所谓扩展报表,就是在基于过滤方案中的参数,先由系统生成一张临时表,我们在使用一些关联关系用原临时表+要添加的字段,生成一张新的临时表,最终展示。
1、我们首先要找到原报表使用的插件
我们可以看到,该报表使用的是Kingdee.K3.FIN.CB.App.Report.dll 下的 StockInCostDetailRpt
2、新建一个类,引用该插件,然后继承StockInCostDetailRpt
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里定义的请看第七步,如果是插件内定义的,看第五步。
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目录,在报表中取消原服务器插件,注册新的服务器插件
现在我们就可以重启IIS后查看最终的效果啦
附插件全内容
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