标准账表二开案例分享原创
金蝶云社区-树海帆
树海帆
8人赞赏了该文章 257次浏览 未经作者许可,禁止转载编辑于2023年12月28日 11:54:04

初学者分享,借鉴社区上前辈们的经验成功在标准账表上添加了字段,但是还没有实现在高级过滤里的功能,目前只是默认显示这个字段,后面实现了再来更新。

所添加字段为GMP

image.png

字段是添加在资产卡片的基本信息中的

image.png


代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Kingdee.BOS.App.Data;

using Kingdee.BOS.Contracts;

using Kingdee.BOS.Util;

using Kingdee.K3.FIN.FA.App.Report;

using System.ComponentModel;

using Kingdee.BOS.Core.Report;


namespace LX.K3.FIN.FA.App.Report//这里不能使用kingdee.XXXXXX的格式命名,会导致下面的kingdee.bos的方法冲突

{

    //[Description("GMP字段"),HotUpdate]//Description("插件名称"),HotUpdate启用热更新

    //CustomAssetFinEdit 是自定义的类名称,根据实际情况修改

    //AssetObjectListService 是标准产品的插件类名称,根据实际情况修改

    public class CustomAssetFinEdit:AssetObjectListService// 继承标准产品报表插件

    {


        string[] tempTableNames;//声明一个字符串数组,在后面会用,但是语句的意思我还没搞懂

        /// <summary>

        /// 重写基类临时表,增加自定义的字段

        /// </summary>

        /// <param name="filter">默认的就行不用改</param>

        /// <param name="tableName">默认的就行不用改</param>

        public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)

        {

            //创建临时表,用于存放自己的数据

            IDBService dbservice = Kingdee.BOS.App.ServiceHelper.GetService<IDBService>();//这句照抄就行了,具体意思我也没懂

            this.tempTableNames = dbservice.CreateTemporaryTableName(this.Context, 1);//这句也是照抄

            string strTable = this.tempTableNames[0];//照抄

            //调用基类方法,获取初步的查询结果到临时表

            //(意思就是调用标准账表的插件,先运行一遍,这样后面就能在标准账表的结果上再增加内容了)

            base.BuilderReportSqlAndTempTable(filter, strTable);//照抄

            //对初步查询结果进行处理,然后写回基类默认的存放查询结果的临时表

            StringBuilder sb = new StringBuilder();//实例化一个StringBuilder类,据说是运算效率会比string快

            //编写SQL脚本,我在这里迷糊了半天,其实就是把标准账表的查询结果当做一个独立的表来看待,然后再

            //加上自己要增加的表和字段就行了

            //SELECT 标准账表名(T1).*,新加的表名(A1).新加的字段(F_GMP) INTO 临时表名 FROM 标准账表名

            //LEFT JOIN 新加的表名 ON 新表与标准账表的匹配条件

            string strSql = "/*dialect*/SELECT T1.*,A1.F_GMP INTO {0} FROM {1} T1 " +

                "LEFT JOIN t_fa_card A1 ON T1.FNUMBER = A1.FNUMBER";

            sb.AppendFormat(strSql, tableName, strTable);//把上面的SQL,放到前面实例化的对象里

            DBUtils.Execute(this.Context, sb.ToString());//执行这段SQL

        }

        /// <summary>

        /// 添加表头字段,否则显示不出来

        /// </summary>

        /// <param name="filter">默认就行不用改</param>

        /// <returns></returns>

        public override ReportHeader GetReportHeaders(IRptParams filter)

        {

            //先把标准账表的表头内容,获取到header的变量里,后面再进行增加,跟SQL的意思差不多

            ReportHeader header = base.GetReportHeaders(filter);

            //添加表头字段("字段名", new一个Kingdee.BOS.LocaleValue对("显示到表头的名称"),后面还有一个非必填的参数,忘了是啥了)

            header.AddChild("F_GMP",new Kingdee.BOS.LocaleValue("GMP"));

            return header;//返回这个增加了内容的表头变量

        }


        /// <summary>

        /// 最后要删除临时表,这一步也都是照抄就行了

        /// </summary>

        public override void CloseReport()

        {

            //删除临时表

            if (tempTableNames.IsNullOrEmptyOrWhiteSpace())

            {

                return;

            }

            IDBService dBService = Kingdee.BOS.App.ServiceHelper.GetService<Kingdee.BOS.Contracts.IDBService>();

            dBService.DeleteTemporaryTableName(this.Context, tempTableNames);

            base.CloseReport();

        }

    }

}

以上插件编写完成后,还需要扩展标准账表的过滤插件,在显示隐藏列中,增加前面添加的字段标识和名称,否则还是会显示不出来的

参考1:https://vip.kingdee.com/article/149770?productLineId=1

参考2:https://vip.kingdee.com/article/1011?productLineId=1

赞 8