本文概述了报表插件开发的六个关键要素及其应用场景和触发时机,包括初始化、临时表构造、动态表头、报表合计列、合计列计算逻辑和报表标题。初始化时设置账表属性,临时表构造时拼接SQL并取数,动态表头控制表头字段,合计列设置分组汇总信息,合计列计算逻辑处理复杂汇总,报表标题定义报表标题字段。这些要素是报表二次开发的基础,需熟练掌握。
接上篇:账表的服务端插件概述 https://vip.kingdee.com/article/232885037941503744
报表插件开发常用的6个要素:初始化、临时表构造、动态表头、报表合计列、合计列计算逻辑、报表标题,了解了以上报表开发主要事件的使用场景及触发时机,才能在以后的报表二开中得心应手。
1.初始化
触发时机:账表View初始化,开始初始化账表服务取数插件代理对象时
应用场景:此时账表插件基类已完成账表属性对象(ReportProperty)的创建工作
备注:设置账表的类型、设置账表属性替代显示信息、设置字段精度控制等等
/// <summary> /// 初始化 /// </summary> public override void Initialize() { base.Initialize(); }
1.1报表常用参数
在初始化函数中通常需要先对报表的一些基本属性赋值,那咱展开说说几个常用的报表属性?
(1) 指定账表类型:
基本简单账表REPORTTYPE_NORMAL、
ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL;
另外还有两种,分页账表、树形账表。
(2) 报表显示顺序字段
ReportProperty.IdentityFieldName = "FIDENTITYID";
FIDENTITYID字段是从1开始的整数序列,用于报表分页显示,
所以临时表中一定要有FIDENTITYID字段,且不能重复,不能跳号。
如果没有对该字段赋值,或者该字段断号、重复,报表会显示空白。
(3) 标识报表是否调用BuilderReportSqlAndTempTable接口创建临时表
IsCreateTempTableByPlugin = true;
如果此账表插件设置sql数据逻辑由插件完成(this.IsCreateTempTableByPlugin),即调用BuilderReportSqlAndTempTable接口,否则调用以下3个接口, 完成账表取数逻辑的sql指令即:BuilderSelectFieldSQL、BuilderTempTableOrderBySQL、BuilderFormWhereSQL。
(4) 明细报表类型、表单标识、表单Id
ReportProperty.DetailReportType = ReportType.REPORTTYPE_MOVE; ReportProperty.DetailReportFormIdFieldName = "FDetailReportFormID"; ReportProperty.DetailReportId = "STK_StockDetailRpt";
(5) 联查单据时,表单标识、单据内码字段
ReportProperty.BillKeyFieldName = "FID"; ReportProperty.FormIdFieldName = "FFORMID";
构建临时表时,需要有对应字段。
同时在BOS中配置一下列表双击事件,新增联查单据操作
(6) 报表中如果用到小数、金额、单价字段时,用于设置精度控制
List<DecimalControlField> list = new List<DecimalControlField>(); list.Add(new DecimalControlField("FPRICEDECIMAL", "FPRICE")); ReportProperty.DecimalControlFieldList = list;
(7) 是否支持分组汇总
this.ReportProperty.IsGroupSummary = true;
同时需要在BOS中过滤框的汇总页签配置汇总信息;
在GetSummaryColumnInfo方法中添加汇总字段
public override List<SummaryField> GetSummaryColumnInfo(IRptParams filter) { var result = base.GetSummaryColumnInfo(filter); result.Add(new SummaryField("FQTY", Kingdee.BOS.Core.Enums.BOSEnums.Enu_SummaryType.SUM)); result.Add(new SummaryField("FPRICE", Kingdee.BOS.Core.Enums.BOSEnums.Enu_SummaryType.SUM)); return result; }
可参考大佬的帖子 https://vip.kingdee.com/article/221585874872324864
(8) 同时存在多个字段的属性时,可以用某个属性替代,例如把供应商ID替换为供应商名称
ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FSUPPLIERID", "FSUPPLIERNAME");
(9) 报表的列通过插件控制
this.ReportProperty.IsUIDesignerColumns = false;
BOS中拖放字段时(this.ReportProperty.IsUIDesignerColumns = true;),还需要在过滤框的显示隐藏列中对应维护上。
this.ReportProperty.IsUIDesignerColumns不写时,BOS中、GetReportHeaders任一有都可以显示。
如果该属性为true,而BOS中未配置任何字段,就会出现下图中情形。
更详细的说明参考:https://vip.kingdee.com/article/238975765038109184
2.临时表构造
触发时机:正式进入账表取数sql拼接并取数,把账表取数结果放到上一步创建的临时表中
应用场景:开始进行账表sql拼接取数,并把账表取数结果放到上一步创建的临时表中
备注:如果此账表插件设置sql数据逻辑由插件完成(IsCreateTempTableByPlugin),即 调用BuilderReportSqlAndTempTable接口,否则调用以下3个接口,完成账表取数逻辑的sql指令即:BuilderSelectFieldSQL、BuilderTempTableOrderBySQL、BuilderFormWhereSQL
/// <summary> /// 向报表临时表,插入报表数据 /// </summary> /// <param name="filter">过滤信息</param> /// <param name="tableName">临时表名</param> public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName) { base.BuilderReportSqlAndTempTable(filter, tableName); }
(1)在此方法中filter参数,传递进来的是报表过滤框中字段的值,即从此参数中获取用户在过滤中选择的条件。
(2)在此方法中tableName参数,是报表前台展示的临时表名,即报表前台展示的内容为此临时表中内容。二开报表时,可以在此方法中直接对报表数据处理。但是要注意新增、删除行时一定要保持排序字段不能重复,不能跳号,排序默认为FIDENTITYID。
3.动态表头
触发时机:账表取数完成,前台显示表头字段
应用场景:如果账表模型在设计时,没有配置账表单据体字段信息,则通过此方法设置账表列头字段信息
/// <summary> /// 表头字段 /// </summary> /// <param name="filter"></param> /// <returns></returns> public override ReportHeader GetReportHeaders(IRptParams filter) { }
该方法用于控制下图中位置表头字段
当this.ReportProperty.IsUIDesignerColumns 属性为true,或者报表BOS中未配置字段时,
报表的表头字段由此方法控制。该方法中的filter参数,跟BuilderReportSqlAndTempTable方法中filter参数相同,可以根据过滤条件动态显示表头。
4.报表合计列
触发时机:获取账表分组汇总字段信息、汇总类型
应用场景:获取账表分组汇总字段信息,即在账表取数的所有字段中,哪些字段需要进行分组汇总
/// <summary> /// 设置报表合计列 /// </summary> /// <param name="filter"></param> /// <returns></returns> public override List<SummaryField> GetSummaryColumnInfo(IRptParams filter) { }
该方法用于控制下图中位置是否显示汇总
5.合计列计算逻辑
触发时机:获取账表分组汇总字段信息、汇总类型
应用场景:汇总字段计算逻辑,如果不是单纯的sum(xxx),可以在此方法中处理
/// <summary> /// 报表合计列计算逻辑 /// </summary> /// <param name=" summaryFields "></param> /// <returns></returns> protected override string GetSummaryColumsSQL(List<SummaryField> summaryFields) { }
加权平均?汇总数据+100?只汇总前100行?可把你能的不轻,都玩出花来了。实力就是不允许你低调,GetSummaryColumsSQL方法中都可以搞定。
6.报表标题
/// <summary> /// 表头字段 /// </summary> /// <param name="filter"></param> /// <returns></returns> public override ReportTitles GetReportTitles(IRptParams filter) { }
该方法用于赋值下图中报表标题字段