AIF文档服务的Update操作用来更新系统数据,支持全部更新(Full update)和部分更新(Partial update)两种类型。

  • Full update-这种更新方式使用新的数据替换已经存在的文档数据,提交到AIF的数据被认为是个完整的文档包含所有的字段,效果等同于删除掉原记录重建,但是主键保持不变,XSD允许但不包含在提交数据中的字段依照其数据类型被清除,XSD不允许因而无法提交的字段会被重设为对应默认值。

在消息头中指定Update Action并且主体包含记录上不不带任何更新属性、或者消息头中指定update action并且顶级记录带有replace属性,这两种情况下将执行全部更新。

对于包含子数据的文档比如销售订单需要注意几种情况:

  • 销售订单只有一个订单行,如果提交的数据包含销售订单数据、一个和数据库中匹配的销售订单行数据、一行和数据库中不匹配的订单行数据,使用全部更新会更新销售订单、更新匹配的销售订单行、同时用新数据创建一个新的订单行。
  • 销售订单有三个订单行,提交的数据包含销售订单数据、两个和原有订单行匹配订单行数据,使用全部更新会更新销售订单、两行匹配的原有订单行,而原有的不匹配的第三行订单行将被删除,这是要特别注意的。

Update操作带两个参数,一个是AifEntityKeyList对象,指定要更新的数据文档的键值,比如销售订单行,另外一个参数是顶层的数据对象,比如销售订单服务的SalesSalesOrder对象,因此在我们提交的XML更新操作销售中也会包含这两部分内容。一个更新销售订单的XML消息类似(省略部分内容):

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"><Header><MessageId></MessageId><Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesOrderService/update</Action><ConversationId></ConversationId></Header><Body><MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"><EntityKeyList xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKeyList"><EntityKey xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey"><KeyData><KeyField><Field>SalesId</Field><Value>00016_036</Value></KeyField></KeyData></EntityKey></EntityKeyList><SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder"><DocPurpose>Original</DocPurpose><SenderId>dat</SenderId><SalesTable class="entity"><_DocumentHash>820acb9d4e266e791f5069edd7bd3d39</_DocumentHash>...删除部分数据...<CurrencyCode>EUR</CurrencyCode><CustAccount>4005</CustAccount><CustGroup>40</CustGroup><Deadline>2002-03-30</Deadline><SalesLine class="entity"><CustAccount>4005</CustAccount><CustGroup>40</CustGroup>...删除部分数据...<InventDimId>00001_060</InventDimId><ItemId>OL-1500</ItemId><Name>Office Lamp 1500 2-tubes</Name><PalletTagging>No</PalletTagging><PriceUnit>1.00</PriceUnit><ProjCategoryId>Lamps</ProjCategoryId><QtyOrdered>200.00</QtyOrdered><RecId>5637144590</RecId><RecVersion>406348234</RecVersion><RemainInventPhysical>200.00</RemainInventPhysical><RemainSalesPhysical>200.00</RemainSalesPhysical>...删除部分数据...<TaxItemGroup>full</TaxItemGroup><InventDim class="entity"><inventDimId>00001_060</inventDimId><InventLocationId>GW</InventLocationId><InventSiteId>S1</InventSiteId><RecId>5637144576</RecId><RecVersion>1</RecVersion></InventDim></SalesLine></SalesTable></SalesOrder></MessageParts></Body>
</Envelope>

消息中包含EntityKeyList节,指定要更新的订单号,SalesOrder节则是完整的销售订单信息,包含其下SalesLine的内容。这么复杂的订单内容不可能手工取编写,所以一般是先用read操作读取订单的内容到XML,然后更改这个XML的订单内容、更改头中的服务操作、并加上EntityKeyList节,就得到了一个更新文档的消息。所以更新数据是要先读再更新,而且必须这样做,因为涉及到并发操作的问题,一条记录可能在你递交消息前已经被其他途径更改,如果不加控制,你的数据就会改写其他人的更改,这是需要避免的。AIF检测并发冲突有两种方法,一是文档哈希值(消息中的_DocumentHash标记),二是RecId和RecVersion。

通过AIF read操作读取文档时AIF会使用文档包含的所有数据库记录的RecId、RecVersion计算得到一个哈希值包含在<_DocumentHash>节点,在把更新数据发回到AIF时,系统再次计算当前数据库中所有记录的RecId、RecVersion哈希值,如果两者不一致就知道数据库中的记录已经被更改过,AIF返回错误提示。使用这种方法不需要在XML文档中包含所有记录的RecId和RecVersion,但是一旦出现并发冲突AIF无法判断出具体是哪条记录。

更直接的方法是在消息中加入每条记录的RecId和RecVersion,如果消息中既不包含文档哈希值也不包含所有记录的RecId、RecVersion,更新操作会失败,相反,如果两者都有,它们会同时被检查。

  •  Partial update -  部分更新则只更新出现在提交消息中的字段,对于未出现在消息中的字段不予更改,但是对于那些依赖于其他子段但又未出现在提交消息中的字段会依照默认规则设置为默认值,比如字段FullName是FirstName和LastName组合生成,如果FirstName或者LastName被更新而FullName未出现在提交消息中,FullName会被更新为默认值。总的来说有这几种情况:

    • 字段未出现在消息中 —— 表字段保持不变
    • 消息中指定为XML NULL值(<Field>xsi:nil</Field>) -- 表字段保持不变
    • 消息中指定某个值(<Field>123</Field>)、或者空(<Field></Field>)、或者X++的NULL空值 -- 表字段被更新为指定值

在一个消息中可以同时更新多个文档记录,即在EntityKeyList节可以包含多个EntityKey,与此对应,消息中需要包含同样数目的文档记录数据。在每一个文档记录数据包括子文档记录上单独指定操作Action时启用部分更新,比如:

  • <SalesTable class="entity" action="update"> —— 更新销售订单
  • <SalesLine class="entity" action="update"> —— 更新销售订单行
  • <SalesLine class="entity" action="create"> —— 创建销售订单行
  • <SalesLine class="entity" action="delete"> —— 删除销售订单行

一个部分更新操作XML消息的样例:

<?xml version="1.0" encoding="utf-8" ?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"><Header><Action>http://www.microsoft.com/dynamics/services/2008/01/SalesOrderService/update</Action></Header><Body><MessageParts xmlns = "http://schemas.microsoft.com/dynamics/2008/01/documents/Message"><EntityKeyList xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKeyList"><EntityKey xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey"><KeyData><KeyField><Field>CustAccount</Field><Value>10002</Value></KeyField></KeyData></EntityKey></EntityKeyList><SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder"><SalesTable class="entity" action="update"><CustAccount>10002</CustAccount><_DocumentHash>d2394857bffgg23924718kxk2908zj3s</_DocumentHash><SalesLine class="entity" action="update"><ItemId>4710003</ ItemId >… 删除部分数据 …<SalesQty>77</ SalesQty ><SalesUnit>Pcs</ SalesUnit > </SalesLine><SalesLine class="entity" action="create"><ItemId>4710005</ ItemId >… 删除部分数据 …</SalesLine><SalesLine class="entity" action="delete"><ItemId>4710001</ ItemId >… 删除部分数据 …</SalesLine></SalesTable></SalesOrder></MessageParts></Body>
</Envelope>

同样部分更新的XML文档中必须包含文档哈希值或者RecId、RecVersion来检查并发操作。

转载于:https://www.cnblogs.com/duanshuiliu/archive/2013/02/01/2886729.html

[AX]AX2012 AIF(五):使用文档服务更新数据相关推荐

  1. [AX]AX2012 AIF(二):文档服务编程模型

    一个完整的文档服务包含很多对象,以Customer服务为例,它包含以下对象: 查询AxdCustomer:这个query的顶层表为CustTable,其下Datasource包含表DirParty,D ...

  2. 百度DOC php,PHP对接百度文档服务DOC

    生成认证字符串需要用到的工具类 namespace App\Service; class HttpUtil { // 根据RFC 3986,除了: // 1.大小写英文字符 // 2.阿拉伯数字 // ...

  3. 苹果电脑上好用的五款文档文字编辑处理工具

    苹果电脑上文字编辑必不可少,那么哪个更好用呢,今天就为大家分享几款苹果电脑上好用的五款文档文字编辑处理工具,以做参考. 第一款:word 2019中文 文档处理软件中 ,我们常用的也就两个:一是off ...

  4. Eolink征文活动---Eolink API文档服务的天才产品

    实际上我并不是因为这次活动才知道Eolink,早在几年前,我就成为了Eolink的使用者,所以,这次征文活动我势在必行!本篇文章将会围绕我如何利用Eolink去解决项目问题进行展开讨论,大致分为以下内 ...

  5. 医疗影像工具LEADTOOLS 入门教程: 在 Windows 服务器上部署 LEADTOOLS 文档服务 - .NET Framework

    LEADTOOLS是一个综合工具包的集合,用于将识别.文档.医疗.成像和多媒体技术整合到桌面.服务器.平板电脑.网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和 ...

  6. elasticsearch 第五篇(文档操作接口)

    INDEX API 示例: 1 2 3 4 5 PUT /test/user/1 { "name": "silence", "age": 2 ...

  7. elasticsearch 6.x (五) 单一文档 API 介绍和使用 update和delete API

    大家好,我是烤鸭: 今天分享的是官网6.x    单一文档(Single document APIs)APIs. 本文这是部分翻译,如果想看全部的,还是建议阅读官方api.链接: https://ww ...

  8. oracle查看jdk文档_Oracle JDK 9 Early Access文档已更新

    oracle查看jdk文档 Raymond Gallardo于2017年4月4日发布的针对Oracle JDK 9的抢先 访问文档已更新,今天宣布对Oracle JDK9文档的抢先访问页面进行了更新. ...

  9. Oracle JDK 9 Early Access文档已更新

    Raymond Gallardo在2017年4月4日发布的针对Oracle JDK 9的抢先体验文档 已更新,今天宣布对Oracle JDK9文档的抢先体验页面进行了更新. Gallardo重点介绍了 ...

  10. 【.NET】用Aspose.Words for .NET动态生成word文档中的数据表格

    1.概述 最近项目中有一个这样的需求:导出word 文档,要求这个文档的格式不是固定的,用户可以随便的调整,导出内容中的数据表格列是动态的,例如要求导出姓名和性别,你就要导出这两列的数据,而且这个文档 ...

最新文章

  1. hbase 数据库简介安装与常用命令的使用
  2. C语言 链表的创建--打印--逆置--新增--删除--排序--释放
  3. “分库分表 ?选型和流程要慎重,否则会失控
  4. 图像相似度测量与模板匹配总结
  5. qq饥荒联机版服务器没有响应,饥荒联机版专用服务器卡顿原因及解决方法汇总...
  6. js 操作Listbox js 获取Listbox选择的值的代码
  7. PCL中点云可视化:坐标字段、随机、单一颜色、法向量
  8. 在HTML中使用WCF RESTful上传文件
  9. 在家想远程公司电脑?Python + 微信一键连接!
  10. TODA-MES电池行业解决方案
  11. Spring boot中如何获取profiles环境
  12. python测试用例队列_Python tornado队列示例-一个并发web爬虫代码分享
  13. 外企的溃败:Oracle中国研发中心裁员,1600人,补偿为N+6
  14. 如何使用jquery ,浏览器窗口滚动到一定距离,显示div中的内容
  15. Env:Cscope安装与配置
  16. 班级信息管理c语言代码,C语言班级信息管理系统(有详细代码).doc
  17. selenium2 原理和常用api
  18. 如何在word中批量编辑所有图片的大小?
  19. 石子合并,四边形不等式优化(Buy Candy,玲珑杯 Round#6 A lonlife 1066)
  20. 关于反向传播算法中几个公式的推导

热门文章

  1. 理解Linux高性能网络架构的那些事
  2. Linux内核中Netfilter架构介绍
  3. 脚注交叉引用序号不一样_著作权合理使用制度之“适当引用”的界定
  4. java配环境变量_用于 Java 开发的配置工具 Simple Configuration Facade
  5. 【数据工具】ArcGIS批量出图工具箱
  6. java 获取图片路径_Java获取文件路径的几种方式
  7. 清除VCENTER中的日志文件
  8. 双层板在哪层覆铜_2020年中国印制电路板行业发展现状及发展趋势预测(图)...
  9. prerenderspaplugin可以抓取动态数据吗_RPA编程思路之数据抓取
  10. java awt image_JAVA;使用java.awt.Image的不稳定性