报表插件开发主要事件的使用场景及触发时机原创
金蝶云社区-拿了你的糖身份
拿了你的糖
33人赞赏了该文章 4333次浏览 未经作者许可,禁止转载编辑于2022年10月25日 09:12:05

接上篇:账表的服务端插件概述 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;

另外还有两种,分页账表、树形账表。

image.png


(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";

image.png构建临时表时,需要有对应字段。

同时在BOS中配置一下列表双击事件,新增联查单据操作

image.png

 

(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;),还需要在过滤框的显示隐藏列中对应维护上。

image.png

        this.ReportProperty.IsUIDesignerColumns不写时,BOS中、GetReportHeaders任一有都可以显示。

如果该属性为true,而BOS中未配置任何字段,就会出现下图中情形。

image.png

更详细的说明参考:https://vip.kingdee.com/article/238975765038109184


2.临时表构造

触发时机:正式进入账表取数sql拼接并取数,把账表取数结果放到上一步创建的临时表中 

应用场景:开始进行账表sql拼接取数,并把账表取数结果放到上一步创建的临时表中

备注:如果此账表插件设置sql数据逻辑由插件完成(IsCreateTempTableByPlugin),即 调用BuilderReportSqlAndTempTable接口,否则调用以下3个接口,完成账表取数逻辑的sql指令即:BuilderSelectFieldSQLBuilderTempTableOrderBySQLBuilderFormWhereSQL

 

        /// <summary>
        /// 向报表临时表,插入报表数据
        /// </summary>
        /// <param name="filter">过滤信息</param>
        /// <param name="tableName">临时表名</param>
        public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
        {
            base.BuilderReportSqlAndTempTable(filter, tableName);
        }

(1)在此方法中filter参数,传递进来的是报表过滤框中字段的值,即从此参数中获取用户在过滤中选择的条件。

image.png

(2)在此方法中tableName参数,是报表前台展示的临时表名,即报表前台展示的内容为此临时表中内容。二开报表时,可以在此方法中直接对报表数据处理。但是要注意新增、删除行时一定要保持排序字段不能重复,不能跳号,排序默认为FIDENTITYID。

3.动态表头

触发时机:账表取数完成,前台显示表头字段 

应用场景:如果账表模型在设计时,没有配置账表单据体字段信息,则通过此方法设置账表列头字段信息

 

        /// <summary>
        /// 表头字段
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public override ReportHeader GetReportHeaders(IRptParams filter)
        {
          
        }

该方法用于控制下图中位置表头字段

image.png

当this.ReportProperty.IsUIDesignerColumns 属性为true,或者报表BOS中未配置字段时,

image.png

报表的表头字段由此方法控制。该方法中的filter参数,跟BuilderReportSqlAndTempTable方法中filter参数相同,可以根据过滤条件动态显示表头。

4.报表合计列

触发时机:获取账表分组汇总字段信息、汇总类型 

应用场景:获取账表分组汇总字段信息,即在账表取数的所有字段中,哪些字段需要进行分组汇总

 

        /// <summary>
        /// 设置报表合计列
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public override List<SummaryField> GetSummaryColumnInfo(IRptParams filter)
        {
          
        }

该方法用于控制下图中位置是否显示汇总

image.png


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)
        {
 
        }

该方法用于赋值下图中报表标题字段

image.png

 总目录

赞 33