【代码案例】账表二开 二开字段作为条件过滤原创
1人赞赏了该文章
1,171次浏览
未经作者许可,禁止转载编辑于2023年07月21日 15:10:33
标准账表二开字段是不允许作为条件过滤的,因为源表的字段是固定的,我们二开时是继承于标准报表的类进行开发的,故需要在插件中进行处理。
一、报错信息
列名 'FTest' 无效。
二、过滤框条件的二开字段
FTest
三、实现思路
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
1人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读