【代码案例】账表二开 二开字段作为条件过滤原创
金蝶云社区-哆啦A梦是一只狸猫
哆啦A梦是一只狸猫
1人赞赏了该文章 668次浏览 未经作者许可,禁止转载编辑于2023年07月21日 15:10:33
封面

标准账表二开字段是不允许作为条件过滤的,因为源表的字段是固定的,我们二开时是继承于标准报表的类进行开发的,故需要在插件中进行处理。

一、报错信息

列名 'FTest' 无效。

image.png

二、过滤框条件的二开字段

FTest

image.png


三、实现思路

1.获取过滤条件:var commonFilter = filter.FilterParameter.FilterString; 
2.记录过滤条件:在commonFilter校验是否有二开的字段,有则把字段、条件值记录下来。
3.重新给filter.FilterParameter.FilterString对象赋值:把关于二开字段的条件replace为空。
4.在BuilderReportSqlAndTempTable方法里重新写的SQL语句中加入过滤条件。

四、解决方案(代码实现)

using Kingdee.BOS.App;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.Report;
using Kingdee.BOS.Util;
using Kingdee.K3.SCM.App.Purchase.Report;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;

namespace test
{
    [Description("采购价格分析表 新增二开字段并可过滤"), HotUpdate]
    public class PurchasePriceAnalyzeReport : PurchasePriceAnalyzeRpt
    {
        private string[] tempTableNames;

        private List<CustomFilter> customFilters;   //二开字段过滤集合

        /// <summary>
        /// 二开字段过滤对象
        /// </summary>
        class CustomFilter
        {
            /// <summary>
            /// 字段名
            /// </summary>
            public string FieldName { get; set; }

            /// <summary>
            /// 逻辑
            /// </summary>
            public string Logic { get; set; }

            /// <summary>
            /// 字段值
            /// </summary>
            public string FieldValue { get; set; }
        }

        public override DataTable GetList(IRptParams filter)
        {
            var commonFilter = filter.FilterParameter.FilterString; //账表过滤条件(包含高级过滤)

            string[] operateFieldNames = new string[] { "FTest" };    //自定义二开字段
            List<string> replaces = new List<string>(); //需替换字符串集合

            #region 设置二开字段过滤集合

            foreach (string operateFieldName in operateFieldNames)
            {
                string strReplace = "";
                if (commonFilter.Contains(operateFieldName))
                {
                    string[] strs = commonFilter.Split(' ');
                    int iBegin = 1;
                    CustomFilter customFilter = new CustomFilter();
                    for (int o = 0; o < strs.Count(); o++)
                    {
                        string str = strs[o];

                        strReplace += str;
                        if (string.IsNullOrWhiteSpace(str))
                            continue;

                        if (str == operateFieldName)
                        {
                            customFilter.FieldName = str;
                            iBegin++;
                        }

                        if (iBegin == 2)
                        {
                            customFilter.Logic = str;
                            iBegin++;
                        }

                        if (iBegin == 3)
                        {
                            customFilter.FieldValue = str;
                            //重新初始化
                            iBegin = 0;
                        }
                    }
                    //包含二开字段过滤
                    customFilters.Add(customFilter);
                }
            }

            #endregion

            //替换二开字段过滤条件为""
            foreach (string str in replaces)
            {
                commonFilter.Replace(str, "");
            }

            filter.FilterParameter.FilterString = commonFilter; //重新赋值给过滤条件对象

            return base.GetList(filter);
        }

        /// <summary>
        /// 构建账表SQL语句并创建临时表
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="tableName"></param>
        public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
        {
            IDBService service = ServiceHelper.GetService<IDBService>();
            this.tempTableNames = service.CreateTemporaryTableName(this.Context, 1);
            string strOldTableName = this.tempTableNames[0];//原临时表,通过关联此表获取原来要展示的数据
            base.BuilderReportSqlAndTempTable(filter, strOldTableName);//执行,让原临时表有数据

            string strFilter = " 1=1 "; //过滤条件
            if (customFilters != null)
            {
                foreach (var obj in customFilters)
                {
                    strFilter += $" and t2.{obj.FieldName} {obj.Logic} '{obj.FieldValue}'";
                }
            }

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.AppendFormat($@"/*dialect*/
				--插入数据
				select * into {tableName} from {strOldTableName} t1
                left join T_BD_MATERIAL t2 on t1.FMATERIAL=t2.FMATERIAL
                where {strFilter}
 			");
            DBUtils.Execute(this.Context, stringBuilder.ToString());
        }
    }
}

直接赋值粘贴,调整个性化业务逻辑代码!

赞 1