【第16期】金蝶云·星空-协同开发 | 产品应用典型/热门问答精选 2024年1月发布原创
金蝶云社区-OUT_MAN
OUT_MAN
10人赞赏了该文章 383次浏览 未经作者许可,禁止转载编辑于2024年02月04日 14:01:08
封面

各位社区的小伙伴们,大家好,我是  版主 OUT_MAN


在金蝶云·星空-协同开发产品应用中,你需要了解的典型/热门问答都在这里!  

本帖每月持续更新,欢迎小伙伴们点赞,收藏本帖,CTRL+F关键词搜索,以便随时查看、扩充知识哟


【第16期】

  更新日期:2024-1


1、 IBillView创建单据如何批量给单据体赋值

问题描述:
通过SQL查到值
如何将查到的值给到,构建的单据体;最好是可以批量,若是逐行每个字段给值效率会比较低。

image.png


解决方案:

用IBillView赋值的话,只能逐行循环赋值,并且可以触发相关的值更新和实体服务规则,尽可能使用数据包赋值,不要用SetValue赋值,这样的话,效率会高一点。


如果要批量的话,也可以使用批量插入表格的方式赋值。但是需要先批量生成单据体新增行的主键ID。

可以参考:

系统运维.数据库.修复种子表(单据)

https://vip.kingdee.com/link/s/lVDMz 


平台接口-批量插入功能

https://vip.kingdee.com/link/s/lVDfo 


问题来源:https://vip.kingdee.com/link/s/lg57e       


2、 未能加载文件或程序集System.ComponentModel.Primitives.Version=8.0.0.0

问题描述:
早上好!各位老师,请教一个问题:我在ViSualStudio2022上编写了一个操作服务插件,生成解决方案成功,但在注册到系统上有如下提示报错,是什么原因所导致?是不是因为.net8.00这个版本太高,不兼容?可否远程协助一下调试,万分感谢!!!

image.png

解决方案:

看下服务器 System.ComponentModel 这个组件是不是没有

image.png


问题来源:https://vip.kingdee.com/link/s/lVDmD        


3、 构建行时单据id和分录id都设置了,以前都是只下推构建的行,现在突然整单被下推了。。。。是什么问题导致的啊

问题描述:
构建行时单据id和分录id都设置了,以前都是只下推构建的行,现在突然整单被下推了。。。。是什么问题导致的啊

image.png

解决方案:

①单据内码不用传值。

②selectedRow.EntryEntityKey要赋值单据体的标识。(最容易忘记的)

③设置SelectByBillId参数为false

image.png



问题来源:https://vip.kingdee.com/link/s/lVDKb


4、 求助!协同开发平台打不开单据,报错

问题描述:
在协同开发平台打开单据就这样了,之前使用还好好的,客户端都能进,扩展的内容也还在

尝试过在门户里卸载重装了,没有解决

完整报错信息如下:
发生时间:	2024-01-03 09:35:04
错误来源:	mscorlib
错误信息:	程序集“Kingdee.BOS.DomainModelDesigner, Version=8.0.144.1, Culture=neutral, PublicKeyToken=null”中的类型“Kingdee.BOS.DomainModelDesigner.View.DynamicFormDesigner”的方法“CreateView”没有实现。
===================================================
调用堆栈:
   在 System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)
   在 System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
   在 System.Type.GetType(String typeName)
   在 Kingdee.BOS.DomainModelDesigner.ViewManager.GetDesignerContent(DomainModel dm, SolutionNode currNode, Enu_SolutionAction action)
   在 Kingdee.BOS.DomainModelDesigner.ViewManager.OpenForm(SolutionNode currNode, Enu_SolutionAction action)
   在 Kingdee.BOS.DomainModelDesigner.ViewManager.SolutionView_SolutionAction(Object sender, SolutionActionArgs e)
错误数据:	System.Collections.ListDictionaryInternal

image.png

解决方案:

64位的操作系统,试试用这个X64打开BOS设计器。


image.png


问题来源:https://vip.kingdee.com/link/s/lPAIc        

        

5、 如何在插件中释放网络控制?

问题描述:
 如何在插件中释放网络控制?

解决方案:

可参考二开案例.WebApi.网控


问题来源:https://vip.kingdee.com/link/s/lVumW        



6、 操作插件的撤销操作的代码是Operation_CancelAssign吗?为什么没有生效

问题描述:
操作插件的撤销操作的代码是Operation_CancelAssign吗?我在这个方法里面打了断点,但是点击撤销没有进去

image.png

解决方案:

OperationId不是对应的操作代码,而是操作ID。

this.FormOperation.Operation,这个才是操作代码。


另外,你这个开发要注意的是,未启用工作流的情况下,点击撤销是触发撤销(CancelAssign),

如果启用工作流的情况下,点击撤销,系统触发的是反审核

image.png

问题来源:https://vip.kingdee.com/link/s/lqFoB        


7、 企业版8.2 在插件中获取银行存款流水账表,报错“未将对象引用设置到对象的实例。 ”

问题描述:
因业务需要,二开需要获取到指定日期的银行账号余额,因此参考 小技巧 - 如何在服务层获取简单账表数据结果 (kingdee.com) 获取系统的【银行存款流水账】数据,可是代码在执行到获取报表数据
SysReportServiceHelper.GetListAndReportData(param);
时报错“未将对象引用设置到对象的实例”,已对比系统报表直接运行的参数RptParams与插件自定义的RptParams是一致的,可以帮忙看看是哪里的问题吗?附件中有源码,谢谢!
var bRpt = GetReportData(this.Context, "CN_BankDetailReport", "CN_BankDetailReportFilter", "657aafe41dd9dd", 0);


        /// <summary>
        /// 获取账表数据
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="rptFormId">账表FormId</param>
        /// <param name="rptFilterFormId">账表过滤方案FormId</param>
        /// <param name="schemeId">过滤方案内码</param>
        /// <param name="currentPosition">账表当前位置</param>
        /// <returns></returns>
        private IMoveReport GetReportData(Context ctx, string rptFormId, string rptFilterFormId, string schemeId, int currentPosition)
        {
            var filterMetadata = FormMetaDataCache.GetCachedFilterMetaData(ctx);//加载字段比较条件元数据。
            var reportMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, rptFormId);//加载报表
            var reportFilterMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, rptFilterFormId);//加载报表过滤条件元数据。
            var reportFilterServiceProvider = reportFilterMetadata.BusinessInfo.GetForm().GetFormServiceProvider();
            var model = new SysReportFilterModel();
            model.SetContext(ctx, reportFilterMetadata.BusinessInfo, reportFilterServiceProvider);
            model.FormId = reportFilterMetadata.BusinessInfo.GetForm().Id;
            model.FilterObject.FilterMetaData = filterMetadata;
            model.InitFieldList(reportMetadata, reportFilterMetadata);
            //List<Kingdee.BOS.Core.CommonFilter.FilterScheme> schList = model.GetSchemeList();//过滤方案的主键值,可通过该SQL语句查询得到:SELECT * FROM T_BAS_FILTERSCHEME
            var entity = model.Load(schemeId);
            var dyn = DeserializeCustomFilter(reportFilterMetadata.BusinessInfo, entity.CustomFilterSetting);
            model.DataObject = dyn;
            var filter = model.GetFilterParameter();

            #region 自定义过滤条件
            DateTime cDate = Convert.ToDateTime(this.Model.GetValue("F_UAWV_EDate"));
            DynamicObject cfilter = filter.CustomFilter;
            cfilter["StartDate"] = cDate;
            cfilter["EndDate"] = cDate;
            #endregion

            //var openParameter = new Dictionary<string, object>();

            var parameterDataFormId = reportMetadata.BusinessInfo.GetForm().ParameterObjectId;
            var parameterDataMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, parameterDataFormId);
            var parameterData = UserParamterServiceHelper.Load(ctx, parameterDataMetadata.BusinessInfo, ctx.UserId, rptFormId, KeyConst.USERPARAMETER_KEY);

            ReportVchInfo rptVchInfo = new ReportVchInfo();
            rptVchInfo.IsSetData = false;

            IRptParams rptParam = new RptParams();
            rptParam.FormId = reportFilterMetadata.BusinessInfo.GetForm().Id;
            rptParam.CurrentPosition = currentPosition;//分页账表当前位置
            rptParam.StartRow = 1;
            rptParam.EndRow = int.MaxValue;//StartRow和EndRow是报表数据分页的起始行数和截至行数,一般取所有数据,所以EndRow取int最大值。
            rptParam.FilterParameter = filter;
            rptParam.FilterFieldInfo = model.FilterFieldInfo;
            rptParam.ParameterData = parameterData;
            rptParam.VchInfo = rptVchInfo;
            var dic = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
            foreach (var itemProp in dyn.DynamicObjectType.Properties)
            {
                dic[itemProp.Name] = dyn[itemProp.Name];
            }
            rptParam.CustomParams.Add("OpenParameter", dic);

            MoveReportServiceParameter param = new MoveReportServiceParameter(ctx, reportMetadata.BusinessInfo, Guid.NewGuid().ToString(), rptParam);

            return SysReportServiceHelper.GetListAndReportData(param);
        }

        /// <summary>
        /// 获取自定义参数
        /// </summary>
        /// <param name="businessInfo">过滤方案元数据</param>
        /// <param name="xml"></param>
        /// <returns></returns>
        private DynamicObject DeserializeCustomFilter(BusinessInfo businessInfo, string xml)
        {
            DcxmlBinder binder = new DynamicObjectDcxmlBinder(businessInfo);
            binder.OnlyDbProperty = false;
            DcxmlSerializer target = new DcxmlSerializer(binder);
            //切换到中性语言,获取主差量
            //CultureInfo inv = new CultureInfo(2052); //中性语言
            binder.Culture = CultureInfo.InvariantCulture;// inv;
                                                          // 集合忽略主键冲突
            target.ColloctionIgnorePKValue = true;
            DynamicObject obj = (DynamicObject)target.DeserializeFromString(xml, null);
            return obj;
        }

解决方案:

你方法里缺少了获取报表服务的语句,加上这句试试:
ISysReportService sysReporSservice = ServiceFactory.GetSysReportService(this.Context);
也少了权限验证语句,不确定是否必须,你可以试试是否必须要有
IPermissionService permissionService = ServiceFactory.GetPermissionService(this.Context);



参考你的建议,我修改了获取报表数据的方式,就可以正常获取到数据了:

            ISysReportService sysReporSservice = ServiceFactory.GetSysReportService(this.Context);
            IPermissionService permissionService = ServiceFactory.GetPermissionService(this.Context);

            rptParam.BaseDataTempTable.AddRange(permissionService.GetBaseDataTempTable(this.Context, rptFormId));

            DataTable rptData = sysReporSservice.GetData(this.Context, reportMetadata.BusinessInfo, rptParam);
            
            if (null != rptData && rptData.Rows.Count > 0)
            { 
            }

            ServiceFactory.CloseService(sysReporSservice);
            ServiceFactory.CloseService(permissionService);

问题来源:https://vip.kingdee.com/link/s/lVuJF        


8、 有没有即时库存的SQL视图

问题描述:

需要显示 物料组的名称,物料代码,物料名称,规格型号,计量单位,批号,即时库存数量,可用库存数量,仓库名称,仓位名称等2、物料组的名称一定要显示,很重要

解决方案:

SELECTT1.FBASEQTY AS '库存量(基本单位)', t1.FBASEAVBQTY AS '可用量(基本单位)',T3.FNUMBER  物料编码, T3L.FNAME as 物料名称, T4L.FNAME 物料分组名称, T3L.FDESCRIPTION as 物料描述, T3L.FSPECIFICATION AS 规格型号 ,T2L.FNAME  as 仓库名称 ,T1.FSTOCKID  AS  仓库标识 ,T1.FSTOCKLOCID  AS  仓位标识 ,T5L.FNAME AS 基本单位 ,T1.FLOT AS 批号基本标识 ,T6L.FNUMBER AS 批号from T_STK_INVENTORY t1INNER JOIN t_BD_Stock T2 ON T1.FSTOCKID=T2.FSTOCKIDINNER JOIN t_BD_Stock_l T2L ON T1.FSTOCKID=T2L.FSTOCKID and T2L.FLOCALEID=2052 INNER JOIN T_BD_MATERIAL T3 ON T1.FMaterialId = T3.FMasterId AND T1.FSTOCKORGID=T3.FUSEORGIDINNER JOIN T_BD_MATERIAL_L T3L ON T3.FMaterialId=T3L.FMaterialId  AND T3L.FLOCALEID=2052 LEFT JOIN T_BD_MATERIALGROUP T4 ON T4.FID=T3.FMATERIALGROUP LEFT JOIN T_BD_MATERIALGROUP_L T4L ON T4L.FID=T4.FID AND T4L.FLOCALEID=2052 INNER JOIN T_BD_UNIT_L T5L ON T5L.FUNITID=t1.FBASEUNITID AND T5L.FLOCALEID=2052 LEFT JOIN T_BD_LOTMASTER T6L ON T6L.FLOTID=T1.FLOT  WHERE T1.FBASEQTY <> 0


问题来源:https://vip.kingdee.com/link/s/lVufr



我创建了<<协同开发,轻松入门>>的学习清单,推荐给你,和我一起学习交流吧!

<<协同开发,轻松入门>>


查看往期精选:

【汇总】金蝶云·星空-协同开发 | 产品应用典型/热门问答精选

        


赞 10