报表过滤条件选择分组,查询所有下级分组的数据

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

报表过滤条件选择分组,查询所有下级分组的数据

  1. 案例

    物料收发汇总表,过滤条件选择 "分组 等于 XX",需要查出XX分组及其下级分组的所有数据

  2. 思路

    假设XX分组有A、B、C、D 4个下级分组,在系统组建sql之前,把过滤条件替换掉,将 "分组 等于 XX" 改为 "分组 in XX,A,B,C,D"

  3. 实现

    3.1 找到仓库分组的表:

3.webp

        3.2 为"物料收发汇总表过滤框"写个插件,继承 AbstractCommonFilterPlugIn,重写 OnParseSetting 方法。代码如下,关键点见代码注释:

using Kingdee.BOS.Core.CommonFilter.PlugIn;

using System.Linq;

using Kingdee.BOS.Util;

using Kingdee.BOS.Core.CommonFilter.PlugIn.Args;

using Kingdee.BOS.App.Data;

using Kingdee.BOS;


namespace X.Study.Plugin

{

    public class StockSummaryFilterGroup : AbstractCommonFilterPlugIn

    {

        /// <summary>

        /// 解析用户配置的过滤方案内容之后发生;

        /// 用户配置的过滤方案,在解析之前,是描述性内容,必须解析出来,才能使用

        /// 插件利用此事件,可以判断用户配置的方案是否合理,给出错误提示

        /// </summary>

        /// <param name="e"></param>

        public override void OnParseSetting(OnParseSettingEventArgs e)

        {

            base.OnParseSetting(e);

            foreach (var filterRow in CommonFilterModel.FilterObject.FilterRows)

            {

                if (filterRow.FilterField.FieldName == "FStockGroup")//过滤条件是仓库分组

                {

                    if (filterRow.CompareType.Operate == "=")//比较符是等于

                    {

                        //替换比较符为in

                        //断点调试,观察 CommonFilterModel.FilterObject.FilterMetaData.CompareTypes,从中找到比较符 in 的id是338

                        filterRow.CompareType = CommonFilterModel.FilterObject.FilterMetaData.CompareTypes.FirstOrDefault(x => x.Id == "338");


                        //值改为仓库分组自身及所有下级

                        filterRow.Value = GetDescendantStockGroup(filterRow.Value);

                    }

                }

            }

        }

        

        /// <summary>

        /// 查出仓库分组自身及所有下级

        /// </summary>

        /// <param name="stockName"></param>

        /// <returns></returns>

        private string GetDescendantStockGroup(string stockName)

        {

            string result = "";


            //sqlserver方言,用cte实现递归查询

            //仓库分组的表 T_BD_STOCKGROUP,对应多语言表 T_BD_STOCKGROUP_L

            string sql = string.Format(@"/*dialect*/ with t as (

    select p.FID,pl.FNAME from T_BD_STOCKGROUP p join T_BD_STOCKGROUP_L pl on p.FID=pl.FID and pl.FLOCALEID=2052 where pl.FNAME=@stockName

    union all

    select a.FID,al.FNAME from T_BD_STOCKGROUP a join t on a.FPARENTID=t.FID join T_BD_STOCKGROUP_L al on a.FID=al.FID and al.FLOCALEID={0} 

) select * from t", this.Context.UserLocale.LCID);


            using (var reader = DBUtils.ExecuteReader(this.Context, sql, new SqlParam("stockName", KDDbType.AnsiString, stockName)))

            {

                while (reader.Read())

                {

                    result += reader.GetValue<string>("FNAME") + ",";

                }

            }

            return result.TrimEnd(',');

        }

    }

}

        3.3 配好插件:

1.webp

        3.4 试试效果:

2.webp



【emoji】

报表过滤条件选择分组,查询所有下级分组的数据

案例物料收发汇总表,过滤条件选择 "分组 等于 XX",需要查出XX分组及其下级分组的所有数据思路假设XX分组有A、B、C、D 4个下级分组,...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息