科目余额表webapi实现维度分列原创
金蝶云社区-小红没有帽
小红没有帽
25人赞赏了该文章 673次浏览 未经作者许可,禁止转载编辑于2023年12月19日 11:18:50

因目前平台对动态字段支持有限,且webapi不会触发过滤条件中的部分插件方法,导致目前无法直接使用科目余额表的维度分列功能,现提供一个二开方式,实现对webapi科目余额表的维度分列查询。

首先需要了解为何科目余额表无法实现维度分列,有一定基础的小伙伴应该了解,大部分账表的取数,都是在账表服务端插件中的BuilderReportSqlAndTempTable方法完成的,此方法有两个输入参数,一是过滤条件filter,另一个是平台提供的临时表名temptablename,我们在往临时表写数据的时候,会创建哪些字段,是来源于filter中,需要显示哪些字段,即字段来源于filter.FilterParameter.ColumnInfo属性中,所以实现此功能的重点就在于,给filter.FilterParameter.ColumnInfo正确赋值,下面进入具体方法:

  1. 确定动态字段的来源,webapi中在未传日schemeid的时候默认使用系统预设的默认过滤方案,所以首先要修改默认方案的XML文件,实现对维度列的读取。

    1.1.这里可以将维度范围最大的查询场景另存一个方案,目的是为了获取包含所有维度字段的XML信息(比如 不录入科目范围,使用维度最多的科目表对应的账簿等),且最好起一个唯一的方案名称

    1.2.数据库查找对应的方案,我们的方案都存储在T_BAS_FILTERSCHEME 表中,可根据方案名称进行搜索,以下给出科目余额表的查询示例(根据表单ID查询)select * from T_BAS_FILTERSCHEME where FFORMID like 'GL_RPT_AccountBalance'

    image.png

    1.3.获取列信息节点,点击打开FSCHEME中的XML信息,其中ColumnSetting就是我们需要的节点信息

    image.png

    1.4.通过update语句将ColumnSetting节点替换到默认方案中,默认方案的fisdefault字段为1,fuserid为-1

  2. 当步骤1顺利完成之后,即可开始插件的编写,二开服务端插件,以科目余额表为例,继承kingdee.k3.fin.gl.app.report.AccountBalanceService,覆写BuilderReportSqlAndTempTable方法,注意需要先执行下方修改ilter.FilterParameter.ColumnInfo操作,再执行base.BuilderReportSqlAndTempTable()。

  3. 扩展账表,将服务器插件换成二开插件,并停用原厂插件即可。


修改Filter.FilterParameter.ColumnInfo操作:

具体思路为读取默认方案中的ColumnSetting节点,生成filter.FilterParameter.ColumnInfo,参考示例代码如下:

//解析过滤方案的XML

            var columnSetting = this.GetSchemeColumns("<ColumnSetting>" + filter.FilterParameter.SchemeEntity.ColumnSetting + "</ColumnSetting>");

            Dictionary<string, object>[] dctColumns = new Dictionary<string, object>[columnSetting.Count];

            columnSetting.CopyTo(dctColumns);

            foreach (var f in dctColumns)

            {

                if (f != null && f.GetInt("V") == 1)

                {

                    lstDispalyRow.Add(f.GetString("F"));

                }

            }

            //将构建的字段信息反写到filter

            int index = 0;

            List<ColumnField> colList = new List<ColumnField>();

            foreach (var item in lstDispalyRow)

            {

                if (lstDispalyRow.Contains(item.Value[1]) && !lstFieldName.Contains(item.Value[1]))

                {

                    ColumnField columnfield = new ColumnField();

                    columnfield.Caption = new Kingdee.BOS.LocaleValue(item.Value[0], this.Context.UserLocale.LCID);

                    columnfield.Key = item.Value[1];

                    columnfield.FieldName = item.Value[1];

                    columnfield.EntityKey = item.Key;

                    columnfield.Visible = true;

                    columnfield.DefaultVisible = true;

                    columnfield.ColIndex = index++;

                    colList.Add(columnfield);

                }

                else

                {

                    continue;

                }

            }

            filter.FilterParameter.ColumnInfo.AddRange(colList);



/// <summary>

        /// 解析fschema字段,获取columnsetting属性并 转换成jsonarray

        /// </summary>

        /// <param name="xmlStr"></param>

        /// <returns></returns>

        private JSONArray GetSchemeColumns(string xmlStr)

        {

            string columnSetting = string.Empty;

            xmlStr = xmlStr.Trim();

            if (!xmlStr.StartsWith("<?xml", StringComparison.InvariantCultureIgnoreCase))

            {

                xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + xmlStr;

            }

            using (StringReader strReader = new StringReader(xmlStr))

            {

                using (XmlReader r = XmlReader.Create(strReader))

                {

                    while (r.Read())

                    {

                        if (r.Name.ToUpperInvariant() == "COLUMNSETTING")

                        {

                            columnSetting = r.ReadInnerXml();

                        }

                    }

                }

            }

            return string.IsNullOrWhiteSpace(columnSetting) ? null : JSONArray.Parse(columnSetting);

        }


图标赞 25
25人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!