当前位置: 首页 > news >正文

金蝶报表二开

本案例描述:

折旧明细报表中加入字段:存放地点、成本中心部门、使用人组织三个字段。

参考社区案例:报表二次开发添加自定义字段的指导方案

步骤:

1、加入报表插件

继承原报表的类。重写BuilderReportSqlAndTempTable、GetReportHeaders、CloseReport三个方法。

customRptTempTableNames:实现在原报表的临时表中加入新的字段数据

GetReportHeaders:实现把新加的字段加在界面中展示

CloseReport:实现用完后删掉临时表

[Description("折旧明细表")]
    public class CarDetailReport : DeprDetailListService
    {
        private string[] customRptTempTableNames;
        /// <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>();
            customRptTempTableNames = dbservice.CreateTemporaryTableName(this.Context, 1);
            // 获取临时表名称
            string strTable = customRptTempTableNames[0];

            // 把刚刚获得的临时表放进基类的方法,获取报表原始的数据
            base.BuilderReportSqlAndTempTable(filter, strTable);

            StringBuilder sb = new StringBuilder();
            sb.AppendFormat(@"select t1.*,B.F_LSLOCATION,
	                                D.FFULLNAME F_LSCostDept,
	                                E.FNAME F_LS_UserOrg 
                                into {0} -- 原有临时表
                                from {1} t1-- 临时表
	                            LEFT JOIN T_FA_CARDDETAIL B ON t1.FALTERID = B.FALTERID 
	                            AND t1.FNUMBER = B.FASSETNO
	                            LEFT JOIN t_fa_allocation C ON t1.FALTERID = C.FALTERID 
	                            AND t1.FNUMBER = C.FASSETNO
	                            LEFT JOIN T_BD_DEPARTMENT_L D ON C.F_LSCOSTDEPT = D.FDEPTID 
	                            LEFT JOIN T_ORG_ORGANIZATIONS_L E ON C.F_LS_USERORG = E.FORGID ", tableName, strTable);
            DBUtils.Execute(this.Context, sb.ToString());
        }

        /// <summary>
        /// 这里加上对应新加的字段,不然不会在界面显示
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public override ReportHeader GetReportHeaders(IRptParams filter)
        {
            ReportHeader header = base.GetReportHeaders(filter);
            // TODO: 添加新增字段
            header.AddChild("F_LS_UserOrg", new LocaleValue("使用人组织"));
            header.AddChild("F_LSCostDept", new LocaleValue("成本中心部门"));
            header.AddChild("F_LSLOCATION", new LocaleValue("存放地点"));
            return header;
        }

        /// <summary>
        /// 调用完后删除临时表
        /// </summary>
        public override void CloseReport()
        {
            // 删除临时表
            if (customRptTempTableNames.IsNullOrEmptyOrWhiteSpace())
            {
                return;
            }
            IDBService dbService = Kingdee.BOS.App.ServiceHelper.GetService<Kingdee.BOS.Contracts.IDBService>();
            // 使用后的临时表需要删除
            dbService.DeleteTemporaryTableName(this.Context, customRptTempTableNames);

            base.CloseReport();
        }
    }

2、bos扩展报表,引入插件,并且把标准插件停用

3、发布和验证效果

4、加过滤

如果报表加的条件需要在过滤方案里面作为过滤条件查询,也需要针对调整

基于1里面的代码,过滤条件的sql拼接,并且在临时表查询条件中加上拼接的过滤sql.

        /// <summary>
        /// 封装二开过滤条件语句
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        private static string CheckIsNeedChange(IRptParams filter)
        {
            string whereSql = "";
            for (int i = 0; i < filter.FilterParameter.FilterRows.Count; i++)
            {
                // 检查过滤方案中是否有二开的过滤条件,拼接成where 语句
                string strFieldName = filter.FilterParameter.FilterRows[i].FilterField.FieldName;
                if (strFieldName== "F_LSLOCATION")
                {
                    whereSql= string.Format(@" and B.F_LSLOCATION='{0}'", filter.FilterParameter.FilterRows[i].Value);
                }
                // 使用人组织
                if (strFieldName == "F_LS_UserOrg")
                {
                    whereSql = whereSql+string.Format(@" and E.FNAME='{0}'", filter.FilterParameter.FilterRows[i].Value);
                }
            }
            if (string.IsNullOrWhiteSpace(whereSql))
            {
                return whereSql;
            }
            else
            {
                return " where 1=1 "+whereSql;
            }
        }

参考社区文章:报表二次开发高级查询添加自定义字段指导方案

5、注意点

  • 字段取名需要界面、过滤方案、sql语句里面完全一样。

  • 如果新加的字段需要过滤,要在扩展过滤方案里面配置

相关文章:

  • 【GoLang】哪些大公司正在使用Go语言
  • eclipse中基于maven构建的web项目pom.xml中指定的jar包无法发布到tomcat中
  • 如何实现公网访问本地内网搭建的WBO白板远程协作办公【内网穿透】
  • 华为mpls vpn跨域方案A
  • 本地文件内容搜索神器AnyTXT Searcher如何搭建与远程访问
  • 数据库故障Waiting for table metadata lock
  • Jvm GC 参数总结「二」
  • 【make/Makefile】Linux下进度条的设计与实现
  • 2-高可用-负载均衡、反向代理
  • Apache Tomcat httpoxy 安全漏洞 CVE-2016-5388 已亲自复现
  • Axure中继器的使用实现表格的增删改查的自定义文件
  • LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!
  • Rabbitmq 死信取消超时订单
  • olap/clickhouse-编译器优化与向量化
  • 数据结构学习 Leetcode300最长递增子序列
  • YOLOv8改进 | 2023注意力篇 | HAttention(HAT)超分辨率重建助力小目标检测 (全网首发)
  • XXE漏洞 [NCTF2019]Fake XML cookbook1
  • SQL Server 安装教程
  • MySQL——表的增删查改
  • 软件设计模式:UML类图
  • 中国科协发声:屡禁不止的奇葩论文再次敲响学风建设警钟
  • 李在明正式登记参选下届韩国总统
  • 告别户口本!今天起婚姻登记实现全国通办
  • 总粉丝破亿!当网络大V遇见硬核科技,互联网时代如何书写上海故事?
  • 央行设立服务消费与养老再贷款,额度5000亿元
  • 以总理内塔尼亚胡称决心彻底击败哈马斯