报表增加显示二开字段的一些方法
金蝶云社区-战斗车
战斗车
7人赞赏了该文章 7092次浏览 未经作者许可,禁止转载编辑于2017年11月21日 18:58:06

总体来说,系统标准的报表已经形成一个完整的业务逻辑闭环,想要添加显示自定义字段并不容易。
但事实上,如果充分理解系统报表的展示原理,则还是有途径可以实现在系统标准的报表中添加显示一些自定义字段。总结起来大概有以下方法:

1、添加基础资料属性字段
这个应该是最多客户表达的需求,因为单据和动态表单都能方便的添加基础资料属性,绑定引用属性后天然能够显示。
对于这种场景,要分两部分来讨论:
1.1、标准报表的字段不是在BOS中画出来的,而是报表服务器插件中创建出来的,这种报表只要在过滤界面的显示隐藏列页签加上基础资料属性字段就可以显示,当然有个前提是该报表过滤界面显示隐藏列那里有基础资料字段,如MRP运算结果表。

1.1.1、该表在BOS中并未体现出报表字段:

1.1.2、扩展该表对应的过滤界面元数据,添加基础资料属性:

1.1.3、前端即可见该自定义字段显示:

1.2、标准报表的字段是在BOS中画出来的,这种报表就要在1.1.1图中对应的步骤中也添加字段名(见下图1.2.1),其余的步骤与1.1.2和1.1.3一致(图略)。如生产订单执明细表。

1.2.1、该表的字段是在BOS中画出来的,因此二开字段也在拖进去:


2、添加普通字段
除基础资料属性外,报表可能还会有添加其他普通字段的需求,这种场景也需要分情况讨论,分为修改配置支持和增加服务器插件支持。约定经过上一步的添加基础资料属性字段环节,在BOS添加拖画字段这些操作已经掌握。
2.1、标准报表的SQL脚本有配置值,这样的报表是允许通过修改这个配置添加显示二开字段的。如生产订单执行明细表。

2.1.1、修改标准报表配置的SQL脚本,添加要显示的字段:

2.1.2、然后再在该报表中添加文本字段FPPBOMBILLNO(图略),并且在过滤界面元数据的显示隐藏列中也添加文本字段FPPBOMBILLNO(图略),即可在前端界面看到报表展示出新增的字段用料清单编号:

2.2、标准报表的SQL脚本未配置值,这样的报表则不允许通过修改这个配置添加显示二开字段。这时要对该报表添加二开字段,则稍显复杂,需要充分理解报表展示原理,进而写服务器插件代码来实现。正常情况下不建议配置报表服务器插件来增加自定义字段,相对细节较多较麻烦。
2.2.1、编写报表二开的服务器插件,本贴提供如下经验证OK的示例,留意示例代码中的注释以帮助理解:
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Contracts.Report;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace Kingdee.K3.MFG.PRD.App.ReportPlugIn.MOExecute
{
[Description("生产订单执行明细表服务端Test插件")]
public class MOExecuteDetailRptTest : MOExecuteDetailRpt
{
public override void BuilderReportSqlAndTempTable(BOS.Core.Report.IRptParams filter, string tableName)
{
base.BuilderReportSqlAndTempTable(filter, tableName);

//对报表的系统临时表增加字段FPPBOMBILLNO
string sql = string.Format(@"ALTER TABLE {0} ADD FPPBOMBILLNO NVARCHAR(100) NULL", tableName);
DBUtils.Execute(this.Context, sql);

//给新增的字段赋值,注意到报表系统临时表的主键固定是FIDENTITYID
//为便于SQL和ORA通用,下面更新功能使用merge into来实现
//注意merge into语句里面的u2代码块,需要与u1一一对应,因此u2块用了group by
sql = string.Format(@"
MERGE INTO {0} U1 USING (
SELECT MAX(T0.FBILLNO) AS FPPBOMBILLNO, T1.FIDENTITYID
FROM T_PRD_PPBOM T0
INNER JOIN {0} T1 ON T1.FMOENTRYID=T0.FMOENTRYID
GROUP BY T1.FIDENTITYID
) U2 ON U2.FIDENTITYID=U1.FIDENTITYID
WHEN MATCHED THEN UPDATE
SET FPPBOMBILLNO=U2.FPPBOMBILLNO
", tableName);
DBUtils.Execute(this.Context, sql);
}
}
}

2.2.2、理应留意到的是,2.2.1示例测试插件继承的是原报表注册的标准插件,这个很重要,因为报表服务器插件只支持注册一个,因此二开插件必须继承原来的标准插件,并且注册上去之后,取消启用原标准插件,如下图:

2.2.3、同样,需要在该报表中添加文本字段FPPBOMBILLNO(图略),并且在过滤界面元数据的显示隐藏列中也添加文本字段FPPBOMBILLNO(图略),然后即可运行出形同2.1.2图那种效果。

综上,报表添加自定义字段的主要方式大概就是这些,欢迎小伙伴们去尝试,有疑问欢迎跟帖讨论。