【第14期】金蝶云·星空-协同开发 | 产品应用典型/热门问答精选 2023年11月发布

各位社区的小伙伴们,大家好,我是 版主 OUT_MAN
在金蝶云·星空-协同开发产品应用中,你需要了解的典型/热门问答都在这里!
本帖每月持续更新,欢迎小伙伴们点赞,收藏本帖,CTRL+F关键词搜索,以便随时查看、扩充知识哟![]()
玩转金蝶云社区
【第14期】
更新日期:2023-11
1、 下推后调用BusinessDataServiceHelper.Save 和展示单据为何结果不同?
问题描述:
我在下推后对明细单基础资料和数值进行赋值,展示单据能看到值,但直接保存再去单据中查看是空的,并且数值有值,基础资料没值,是为啥?大佬指教,数值文本都行,直接展示基础资料也有值,就是直接保存基础资料为空???

解决方案:
基础资料赋值 要分别对ID和对象赋值
改成:
//基础资料赋值
var COSTID = (BaseDataField)targetBInfo.GetField("FCOSTID");
var dys = BusinessDataServiceHelper.LoadFromCache(this.Context, new object[] { dt.Rows[i]["FCOSTID"].ToString() }, COSTID.RefFormDynamicObjectType);
//增加
((DynamicObject)((DynamicObjectCollection)((DynamicObject)targetObjs[0])["REFUNDBILLENTRY"])[i])["FCOSTID_Id"] = dt.Rows[i]["FCOSTID"];
((DynamicObject)((DynamicObjectCollection)((DynamicObject)targetObjs[0])["REFUNDBILLENTRY"])[i])["FCOSTID"] = dys[0];问题来源:https://wenku.my7c.com/link/s/lAGqK
2、 通过二开插件自动下推,获取到下推后的数据包,如何对下推后生成的单据字段赋值?
问题描述:
我知当前单据赋值用this.Model.SetValue就行,但对下推后的数据包,请指教,
private void Push(string pushCate,string pushId,string targetId,string formId) {
OperateOption pushOption = OperateOption.Create();//操作选项
var pushArgs = this.CreatePushArgs(pushOption,pushCate,pushId,targetId,formId); //构建下推参数
var convertResult = ConvertServiceHelper.Push(this.Context, pushArgs, pushOption);//调用下推接口
var targetObjs = (from p in convertResult.TargetDataEntities select p.DataEntity).ToArray();//得到目标单据数据包
var targetBInfo = this.GetBusinessInfo(pushArgs.ConvertRule.TargetFormId, pushArgs.ConvertRule.TargetFormMetadata);
var saveResult = BusinessDataServiceHelper.Save(this.Model.Context, targetBInfo, targetObjs);
if (!saveResult.IsSuccess)
{
var errorInfo = string.Join(";", saveResult.ValidationErrors.Select(x => x.Message));
this.View.ShowErrMessage(errorInfo);
return;
}
else
{
this.View.ShowMessage("保存成功");
}
}解决方案:

// 获取生成的目标单据数据包
DynamicObject[] objs = (from p in operationResult.TargetDataEntities
select p.DataEntity).ToArray();
int i = 0;
// var list = datas.ToList<Object>()
//单据头
((DynamicObject)objs[0])["F_Remark"] = str;
((DynamicObject)objs[0])["F_InspectionStatus"] = status;
foreach (var data in datas)
{
//单据体
((DynamicObject)((DynamicObjectCollection)((DynamicObject)objs[0])["PRD_MORPTENTRY"])[i])["FinishQty"] = Convert.ToDecimal(data["FQTY"].ToString());
((DynamicObject)((DynamicObjectCollection)((DynamicObject)objs[0])["PRD_MORPTENTRY"])[i])["BaseFinishQty"] = Convert.ToDecimal(data["FQTY"].ToString());
i++;
}
问题来源:https://wenku.my7c.com/link/s/lAY8I
3、 公有云补丁在更新,因特殊原因等不了更新。如何能联系总部撤销补丁更新。
问题描述:
公有云补丁在更新,因特殊原因等不了更新。如何能联系总部撤销补丁更新
解决方案:
补丁安装后无法回退,只能用在安装补丁前做好的备份恢复。安装前的准备工作:
备份数据库打补丁前需要先对数据库进行备份,包括:管理中心库和业务中心库。管理中心库的备份需要在数据库上进行,业务库的备份可以登录Cloud管理站点进行备份。
检查业务数据中心检查业务数据中心是否都可连接,如果是多个应用服务器,请检查所有的应用服务器,确定都可正常使用。如果有多余的业务库,请登录管理中心反注册;如果有多余的站点,请调整管理中心相关配置文件,去掉这个多应用服务器。多应用服务器涉及到的配置,请查阅:如何配置应用服务器集QUN。
关闭360软件建议先关闭360等杀毒软件,或者设置白名单,允许Cloud相关的操作,不要对其进行拦截。
确定服务未断请查看Internet信息服务(IIS)管理器,确保应用程序池中的K/3Cloud各服务未断。
问题来源:https://wenku.my7c.com/link/s/lAf2q
4、 Python在单据保存时把更改的辅助资料值,更新供应商的辅助资料值
问题描述:
一直提示:实体类型BillHead中不存在名为FBillHead的属性 原码如下
import clr
clr.AddReference("System")
clr.AddReference("System.Core")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.DataEntity")
clr.AddReference("Newtonsoft.Json")
clr.AddReference("Kingdee.BOS.ServiceHelper")
from Kingdee.BOS.Util import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import *
from Kingdee.BOS.Core.Metadata.FormElement import *
from Kingdee.BOS.App.Data import *
from System import *
from System.Linq import *
from System.Text import *
from Newtonsoft.Json import *
from Newtonsoft.Json.Linq import *
from Kingdee.BOS.ServiceHelper import *
def AfterExecuteOperationTransaction(e):
obj = e.DataEntitys;
_FEntity=obj[0]["FBillHead"] #获取单据明细表
#raise NameError(JsonConvert.SerializeObject(obj)); #用于查看数据结构 方便取值使用
for item in _FEntity :
FSIGNCOMP= item["FSIGNCOMP"];#合同签订主体
FSUPPLIERID=item["F_WAPC_BASE12"];#供应商ID
if FSIGNCOMP is not None:
#更新基础资料
_UpdateSql="/*dialect*/ UPDATE T_BD_SUPPLIER set F_WAPC_ASSISTANT = {0} where FSUPPLIERID = {1}".format(FSIGNCOMP,FSUPPLIERID);
DBUtils.Execute(this.Context,_UpdateSql);
ClearCache(FSUPPLIERID);#清除缓存资料
def ClearCache(ID):
#缓存清理
FORMID="BD_SUPPLIER";#基础资料的表单ID
completaMetadata = MetaDataServiceHelper.Load(this.Context,FORMID);
pkList = [-1];
pkList[0] = ID;
BusinessDataServiceHelper.ClearCache(this.Context, completaMetadata.BusinessInfo.GetDynamicObjectType(), pkList);
CacheUtil.ClearCache(this.Context.DBId + FORMID, "BOS_QuickBaseDataCache");
解决方案:
获取数据包的方法不对啊!AfterExecuteOperationTransaction读取单据数据包代码参考:
for exBillData in e.SelectedRows:#循环每一张单据 billObj=exBillData.DataEntity;#单据的数据包,最外层,单据头字段可直接从这里面获取 en=billObj["单据体ORM实体属性标识"];#获取单据体数据的集合 for r in en:#循环单据体的每一行 XXX=r["单据体字段实体属性标识"];#获取单据体的字段
数据包层层解析参考这个:【Python插件入门】第3篇:插件中如何进行数据操作

问题来源:https://wenku.my7c.com/link/s/lAfUk
5、 操作服务插件,如果操作是在列表勾选单据体后发起的,校验器的Validate方法里如何获取勾选的单据体?
问题描述:
操作服务插件,在OnAddValidators添加校验器后,指定校验的是单据体,如validator.EntityKey = "FPOOrderEntry",假如单据列表界面,有2个单据,单据A(2条明细:序号1,2),单据B(3条明细:序号3,4,5),如果勾选单据A的序号1的明细,加上单据B序号3的明细,发起操作,经调试发现
【第14期】金蝶云·星空-协同开发 | 产品应用典型/热门问答精选 2023年11月发布
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



