科目余额表核算维度名称显示优化原创
金蝶云社区-战斗的凯文
战斗的凯文
72人赞赏了该文章 284次浏览 未经作者许可,禁止转载编辑于2024年07月12日 18:56:31

        当前官方出品的科目余额表,当显示核算维度名称时,由于没有显示维度名称,只是简单的将各已录入维度值的名称用“/”分隔,用户无法准备分辨出具体维度对应的维度值,尤其是科目挂多个维度且当中间的维度未录入时,维度值和维度之间的对应关系就很难确定。如下图所示:

image.png

        为了解决这一问题,这里提供一个科目余额表扩展插件,使用该插件后,核算维度名称列的显示如下图所示:

image.png

        中括号“[]”中包含了具体的维度名称,多个维度之间用分号“;”分隔,且按对应科目上指定维度的顺序排列,“/”前面分别是维度值编码和维度值名称,支持未录入维度的标识显示,这样就完整包含的对应科目所有维度信息,可以很方便的分辨维度信息。对于通过API获取科目余额表数据的情况,拿到上述数据后,亦可以很方便对字段内容进行分解,得到具体的维度数据。

        以下是为科目余额表指定新插件的方法:

image.png

        将下载的插件的dll文件放到系统Bin目录下,注册时选择该dll文件,并勾选对应的插件名。保存后生效。

        注意,由于平台不支持为账表挂多个插件,因此,注册新插件后,必须取消原插件的启用。如下图所示:

image.png


        插件源码如下:

namespace MyKingdee.K3.Assembly.ServicePlugIn
{
    /// <summary>
    /// 科目余额表扩展服务端插件
    /// </summary>
    [Description("科目余额表扩展服务端插件")]
    public class AccountBalanceExt : Kingdee.K3.FIN.GL.App.Report.AccountBalanceService
    {
        /// <summary>
        /// 构建报表数据临时表
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="tableName"></param>
        public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
        {
            base.BuilderReportSqlAndTempTable(filter, tableName);
            //查询完成后自定义功能扩展
            AfterQuery(this.Context, filter,tableName);
        }

        /// <summary>
        /// 查询完成后自定义功能扩展
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="filter"></param>
        /// <param name="tempTable"></param>
        private void AfterQuery(Context ctx,IRptParams filter, string tempTable)
        {
            DynamicObject dyobj = filter.FilterParameter.CustomFilter;  //过滤条件
            if (dyobj == null) return;
            //显示核算维度字符串名称
            var ShowDetailItem =dyobj.GetValue<bool>(AccountBalanceFilterField.CONST_FBillHead.ORM_SHOWDETAIL, false);
            if (ShowDetailItem)
            {
                //得到科目和维度组合ID
                List<Tuple<long, long>> lstDetailIDAccount = new List<Tuple<long, long>>();
                var strSql = string.Format("SELECT DISTINCT FACCTID FACCOUNTID,FDETAILID FROM {0} WHERE FACCTID>0 AND FDETAILID>0", tempTable);
                using (var reader = DBUtils.ExecuteReader(ctx, strSql))
                {
                    while (reader.Read())
                    {
                        var tup = Tuple.Create<long, long>(Convert.ToInt64(reader["FACCOUNTID"]), Convert.ToInt64(reader["FDETAILID"]));
                        lstDetailIDAccount.Add(tup);
                    }
                }

                if (lstDetailIDAccount.Count > 0)
                {
                    //得到所有维度组合字符串名称
                    var dctName = GetDetailIdName(ctx, lstDetailIDAccount);
                    //将字符串名称写入临时表
                    var strFlexTableName = GetFlexTableName(ctx, dctName);
                    //关联临时表,将字符串名称写入最终BOS临时表中的核算维度名称字段中,以便最后显示
                    var strUpdateSql = string.Format(@"MERGE INTO {0} T0
                    USING {1} T1 ON T0.FACCTID=T1.FACCOUNTID AND T0.FDETAILID=T1.FDETAILID
                    WHEN MATCHED THEN
                    UPDATE SET T0.FDETAILNAME=T1.FFLEXNAME;
                ", tempTable, strFlexTableName);
                    DBUtils.Execute(ctx, strUpdateSql);
                    //及时删除用到的中间临时表
                    CommonFunction.DropTempTable(ctx, new List<string>() { strFlexTableName }, true);
                }
            }
        }
        //......完整源码请见附件
    }
}


    希望上面的内容对你有用。

赞 72