引入数据时,如何建立与源单的关联关系

仅分享,因涉及到太多东西难以保证所有数据的准确性。
业务背景:
单据通过Excel引入金蝶云中,引入这些数据时,仅仅能够保存单据本身,其与源单的关联关系则不能引入进来,导致没有反写,不支持上下查等。
解决思路:
通过引入单据的保存插件实现。
1.引入模板中,单据体字段 源单编号 必须引入;
2. 编写单据的保存操作插件重载BeforeExecuteOperationTransaction事件;
3.对单据体行进行循环,取每单据体行的源单编号;
4.根据源单编号,批量读取源单;
5.对源单单据体行进行循环,按照源单编号取到源单单据体行内码等信息;
6.重新对目标单单据体行进行循环,判断目标单单据体行"xxxx_Link"子单据体是否有数据;
7.如果"xxxx_Link"子单据体没有数据,则插件新建数据包,并填写源单信息,追加到目标单单据体中。

依赖原理:单据保存时,会根据单据体的"xxxx_Link"子单据体记录的源单信息,与源单进行关联、反写。

【注意】单据关联配置-控制字段

【注意】反写规则-反写条件(不满足条件则不会反写)

【注意】关联关系字段(可以在API查看)

案例:引入销售出库单时,如何与销售订单建立关联

import clr
clr.AddReference("System")
clr.AddReference("System.Data")
clr.AddReference("System.XML")
clr.AddReference("System.Web.Extensions")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.DataEntity")
clr.AddReference("Kingdee.BOS.ServiceHelper")
clr.AddReference("Newtonsoft.Json")
clr.AddReference("Kingdee.BOS.Contracts")
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("System.Web")
clr.AddReference("Kingdee.BOS.App.Core")
#clr.AddReference("Kingdee.BOS.WebApi.Client")
import sys
from System import *
from System import String as string
from System.IO import *
from System.Net import *
from System.Web import *
from System.Text import *
from System.Threading import *
from System.Globalization import *
from System.Security.Cryptography import *
from System.Web.Script.Serialization import *
from System.Collections.Generic import List as syslist
from System.Collections.Generic import Dictionary
#from Kingdee.BOS.WebApi.Client import *
from Newtonsoft.Json.Linq import *from Kingdee.BOS.AppServer import AppServerObject
from Kingdee.BOS.App.Core import *
from Kingdee.BOS.Contracts import *
from Kingdee.BOS.Core.List import *
from Kingdee.BOS.Core.CommonFilter import *
from Kingdee.BOS.Contracts.Report import *
from Kingdee.BOS.Core.Report import ISysReportView
from Kingdee.BOS.Core.Report import ReportTitles
from Kingdee.BOS.App import ServiceHelper as ServiceHelperAPP
from Kingdee.BOS import *
from Kingdee.BOS.Util import *
from Kingdee.BOS.Core.List.PlugIn import *
from Kingdee.BOS.Core.Log import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Orm import OperateOption
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.DataEntity import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Core.Bill import *
from Kingdee.BOS.Core.Bill.PlugIn import *
from Kingdee.BOS.ServiceHelper import *
from Kingdee.BOS.Core.Interaction import KDInteractionException
#from Kingdee.BOS import KDBusinessException
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Metadata import SelectorItemInfo ##字段选择实体类
from Kingdee.BOS.Core.Metadata import OQLFilter ##字段选择实体类
from Kingdee.BOS.Core.SqlBuilder import QueryBuilderParemeter ##查询参数实体类
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
#修改默认编码为utf8
reload(sys)
sys.setdefaultencoding('utf-8')
def _Zstr(a):return ("" if a==None else (a if isinstance(a,str) else str(a))).strip();def LoadData(BillNos):formid = "SAL_SaleOrder";#源单标识#指定需要加载的销售订单字段fields =syslist[SelectorItemInfo]();fields.Add( SelectorItemInfo("FID"));#单据主键fields.Add( SelectorItemInfo("FSaleOrderEntry_FEntryID"));#单据体主键fields.Add( SelectorItemInfo("FBillNo"));#单据编号fields.Add( SelectorItemInfo("FBFLowId"));#业务流程fields.Add( SelectorItemInfo("FMaterialId"));#物料fields.Add( SelectorItemInfo("FBaseCanOutQty"));#基本单位数量fields.Add( SelectorItemInfo("FStockBaseCanOutQty"));#基本单位数量#指定过滤条件filter = string.Format(" FBillNo IN ('{0}') ",string.Join("','",BillNos));ofilter = OQLFilter.CreateHeadEntityFilter(filter);objs =BusinessDataServiceHelper.Load(this.Context,formid,fields,ofilter);return objs;def BuildDictionary(DDObjs):dctAllBills =Dictionary[string, Dictionary[string, DynamicObject]]();for DDObj in DDObjs:billNo = Convert.ToString(DDObj["BillNo"]);#销售订单单据编号-对应源单编码dctOneBill=Dictionary[string, DynamicObject]();entryRows = DDObj["SaleOrderEntry"]for entryRow in entryRows:Seq = Convert.ToString(entryRow["Seq"]);#销售订单分录号-对应销售出库单源单分录码dctOneBill[Seq] = entryRow;dctAllBills.Add(billNo, dctOneBill);return dctAllBills;def FillLinkRow(srcRow,toRow,linkRow):linkRow["FlowId"] = srcRow["FBFLowId_Id"];linkRow["FlowLineId"] = 0;linkRow["RuleId"] = "SaleOrder-OutStock";#单据转换IDlinkRow["SBillId"] = (srcRow.Parent)[0];#源单内码linkRow["SId"] = srcRow[0];#源单分录内码#原始携带量BaseCanOutQty = Convert.ToDecimal(srcRow["BaseCanOutQty"]);StockBaseCanOutQty = Convert.ToDecimal(srcRow["StockBaseCanOutQty"]);linkRow["BaseUnitQtyOld"] =BaseCanOutQty;linkRow["SALBASEQTYOld"] =StockBaseCanOutQty;linkRow["BaseUnitQty"] = toRow["BaseUnitQty"];linkRow["SALBASEQTY"] = toRow["SALBASEQTY"];toRow["BaseMustQty"]=BaseCanOutQtytoRow["MustQty"]=BaseCanOutQtytoRow["SrcType"]="SAL_SaleOrder"#为满足反写规则条件def OnPreparePropertys(e):e.FieldKeys.Add("F_LYP_Text");#源单编码e.FieldKeys.Add("F_LYP_Text1");#源单分录码
def BeforeExecuteOperationTransaction(e):   try:#对单据体进行循环,取关联的源单编号for billObj in e.SelectedRows:BillNos=syslist[str]();entryRows =billObj.DataEntity["SAL_OUTSTOCKENTRY"]for entryRow in entryRows:FSrcBillNo =entryRow["F_LYP_Text"]if FSrcBillNo=="":#源单编码为空跳过continueif (BillNos.Contains(FSrcBillNo)):#已存在跳过continueBillNos.Add(FSrcBillNo);DDObjs=LoadData(BillNos)#查找销售订单数据#获取源单单据体表名FsrcTableNumber = BusinessFlowServiceHelper.LoadTableDefine(this.Context, "SAL_SaleOrder", "FSaleOrderEntry").TableNumber;#构建数据dctAllBills =BuildDictionary(DDObjs);#记录所有关联,后续为新建的源单关联信息,设置内码allNewLinkRows =syslist[DynamicObject]();for billObj in e.SelectedRows:entryRows =billObj.DataEntity["SAL_OUTSTOCKENTRY"]for entryRow in entryRows:linkRows =entryRow["FEntity_Link"]#获取关联关系对象linkRow =DynamicObject(this.BusinessInfo.GetEntity("FEntity_Link").DynamicObjectType);linkRow["STableName"] = FsrcTableNumber;#按源单编号获取信息FSrcBillNo =entryRow["F_LYP_Text"]if (FSrcBillNo==""):continue;dctOneBill=dctAllBills[FSrcBillNo]#按源单分录码获取信息Seq=entryRow["F_LYP_Text1"]if (Seq==""):continue;srcRow=dctOneBill[Seq]#关联关系对象赋值和反写规则条件处理FillLinkRow(srcRow,entryRow,linkRow);if (linkRows.Count>0):#判断是否已存在关联信息continue;linkRows.Add(linkRow);allNewLinkRows.Add(linkRow);#为新建的源单关联信息,设置内码_SequenceReader=SequenceReader(this.Context)_SequenceReader.AutoSetPrimaryKey(allNewLinkRows.ToArray(),this.BusinessInfo.GetEntity("FEntity_Link").DynamicObjectType);except Exception as e:raise Exception("BeforeExecuteOperationTransaction:"+e.ToString());

结果展示

金蝶云引入数据时,如何建立与源单的关联关系相关推荐

  1. 金蝶云星空对接打通伯俊ERP调拨单查询接口与修改记录接口

    金蝶云星空对接打通伯俊ERP调拨单查询接口与修改记录接口 正在上传-重新上传取消 对接源平台:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上,提供了标准的管理模式:通过标准的业务 ...

  2. 聚水潭对接金蝶云星空数据方案

    01 系统说明: 聚水潭:是由上海聚水潭网络科技有限公司基于SaaS模式开发的商家ERP软件系统,公司创始团队聚集了一群来自阿里.麦包包等知名企业的技术.仓管.市场营销精英,具有近二十年传统及电商企业 ...

  3. 金蝶云星空与浪潮ERP对接集成应付单查询1连通新增凭证-定制webService(浪潮凭证测试)

    数据源系统:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上,提供了标准的管理模式:通过标准的业务架构:多会计准则.多币别.多地点.多组织.多税制应用框架等,有效支持企业的运营管理 ...

  4. 金蝶云星空对接打通精诚ERP应付单查询1接口与执行操作接口接口

    接入系统:金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台.金蝶K/3Cloud围绕着"生态.人人.体验&quo ...

  5. 金蝶云星空条码APP PDA安卓系统专业版支持手机PDA

    金蝶云星空条码APP  PDA安卓系统条码管理是以一维码或二维码为载体,将源单信息打印成可扫描识别的条码,再通过扫描设备扫描条码,快速生成下游单据的功能.一维码(传统条码)具有简单.易用.低成本和高效 ...

  6. 整理的金蝶云苍穹初级练习题

    整理的金蝶云苍穹初级练习题 (单选题)以下哪项描述不正确 C A.苍穹动态微服务架构部署态时是按云或应用动态组合微服务容器的 B.苍弯使用了多级缓存服务,以保证系统的高性能 C.对于苍穹应用中的负责计 ...

  7. 金蝶云苍穹笔记2022-07-13

    rollbackSave事件-->1 事件介绍 此事件用于保存失败时通知插件回滚数据. initialize事件-->3 代码模板 package kd.bos.plugin.sample ...

  8. 在外出差,如何远程登录公司内网金蝶云ERP管理系统【cpolar内网穿透】

    文章目录 前言 1.金蝶安装简介 2. 安装cpolar内网穿透 3. 创建安全隧道映射 4. 在外远程访问金蝶云星空管理中心 5. 固定访问地址 6. 配置固定公网访问地址 7.创建数据中心简介 8 ...

  9. 公网远程ERP - 在外远程登录公司局域网金蝶云ERP管理系统

    文章目录 前言 1.金蝶安装简介 2. 安装cpolar内网穿透 3. 创建安全隧道映射 4. 在外远程访问金蝶云星空管理中心 5. 固定访问地址 6. 配置固定公网访问地址 7.创建数据中心简介 8 ...

最新文章

  1. access下如何配置两个vlan_【新华三】网络工程师 H3C如何配置VLAN-trunk 二层隔离技术...
  2. 一文助你解决90%的自然语言处理问题(附代码)
  3. C++14尝鲜:Generic Lambdas(泛型lambda)
  4. 【MPI高性能计算】蒙特卡洛方法计算pi值
  5. freemarker使用说明_SpringBoot+Swagger2集成详细说明
  6. 基于android公交车线路查询论文文献,本科毕业论文---基于android的手机公交线路查询系统.doc...
  7. html loader的作用,webpack认识loader的作用
  8. 数据结构实验之查找四:二分查找
  9. Android中添加自己的模块 【转】
  10. WannaCry感染文件恢复方法,企业再也不用愁了!
  11. 2017河北对口升学计算机试题,2017河北对口升学计算机专业理论试题(含答案).doc...
  12. IDEA导入Git项目后右键项目找不到Git选项的解决方法
  13. 【软考】2021软件设计师复习开坑指南
  14. Kiwi Syslog日志服务器的安装及配置使用
  15. Kubernetes运维之使用Prometheus全方位监控K8S
  16. 三星Note9的优秀与不足,能承担单骑救主的重任么?
  17. 计算机二级java答题演示_全国计算机二级考试高级Office考试操作题
  18. ios客户端开源的项目
  19. SAP笑话 ABAP简称
  20. 通信协议之Protocol buffer(Java篇)

热门文章

  1. 你准备好了吗,2018末班车即将到站!
  2. linux 查看隐藏文件大小
  3. 雷军很无奈、小米9的热度不到两个月便被友商抢尽了风头
  4. WORD里头的图片如何直接复制到wangEditor编辑器
  5. hdu 2546 饭卡——一道简单的 01背包
  6. 前端基础知识第一章---HTML
  7. Regression----李宏毅
  8. Ubuntu下unrar指令的简单使用
  9. 天津公务员 计算机水平,天津公务员考试报考这6类职位,上岸几率更大!
  10. 设计超萌的机械键盘,超有手感还不吵人,雷柏MT510PRO键盘上手