另一位用户修改了记录(NAV webservice)

时间:2017-07-10 09:25:54

标签: .net soap dynamics-nav-2016

我遇到了一个我发现很难调试的错误。

我有一个访问Dynamics NAV页面服务的工具,用于在我们的Dynamics NAV数据库中创建和/或更新客户。

50%的时间工具工作正常,另外50%没有工作,并且它总是带有相同的错误:

其他用户已修改" service_name" "第= CONST(CUSTOMER_NUMBER)"

问题是NAV中的编辑被禁用,因此唯一可能编辑记录的是工具本身。

当我在网上搜索时,我得到的结果就像"你尝试修改同一条记录两次"还有一堆资产净值代码,但是我无法访问资产净值代码,而我们正在使用的资产净值顾问本人也是无能为力。

如果某人能够以某种方式指出可能不会涉及令人敬畏的资产净值代码的可能情况。

我的工作流程如下:

  1. 我从NAV中检索记录
  2. 我根据需要编辑和修改记录
  3. 我创建和/或更新修改后的记录
  4. 要么成功,要么我得到上面提到的错误
  5. 无论哪种方式,我只在整个过程中调用一次更新方法。

    请帮助我......我很无能

    亲切的问候

1 个答案:

答案 0 :(得分:0)

我最近遇到了这个问题。我不确定是哪个版本的NAV,因为我自己并没有真正使用NAV,只是使用了Web(肥皂)服务。 但是我认为这个问题在最新版本中也一样,因为它不是错误。

无论如何,据我所知,NAV这样做是为了维护数据库的ACID规则。 在这种特殊情况下,NAV可以防止“脏写”,这意味着它可以防止您将某些已更改为比您拥有(或说您拥有)更新版本的数据更新。

对于刚更新实体然后又想更新它的人来说,这似乎很奇怪,因为他不知道其他人正在使用系统或处理数据-但这是很简单的原因。

更新实体时,将为其键属性提供一个值。如果您愿意,此值不仅包含实体的唯一标识符,而且还包含时间戳或版本说明。 这意味着键值是“一次性”的事情-如果要更改实体的状态,则不能多次使用它。

因此,当您使用键“ abcdefg”(仅作为示例)更新en实体时,它将成功。 但是下一次(可能是5秒后)您要更新实体并使用相同的键“ abcdefg”,它将以100%的确定性失败。

因此,如何解决此问题,这很简单,因为Update方法将要更新的实体作为参考(ref)参数,因此一旦成功更新实体,它将在其key属性中具有新值,这就是实体的当前状态-将该值用于下一次更新,依此类推。

这并不意味着如果要更新实体,则始终必须首先检索该实体。该服务提供了一种检查是否必要的方法。

service.IsUpdated(obj.Key);

如果返回 false ,则可以继续使用具有的键值更新实体,如果 true ,则需要检索新副本,因为密钥中描述的实体状态已过时。

在我和OP处于相同情况下,希望有帮助并能帮助他人的希望: