【问题标题】:Another user has modified the record (NAV webservice)另一个用户修改了记录(NAV 网络服务)
【发布时间】:2017-07-10 09:25:53
【问题描述】:

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

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

该工具在 50% 的情况下工作正常,另外 50% 的情况下不能正常工作,而且总是出现相同的错误:

其他用户修改了“service_name”“No.=CONST(customer_number)”

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

当我在网上搜索时,我会得到类似“您尝试修改同一记录两次”的结果和一堆 NAV 代码,但我无权访问 NAV 代码,以及我们正在合作的 NAV 顾问自己也是一头雾水。

如果有人能以某种方式指出不涉及 NAV 代码的可能场景,那就太棒了。

我的工作流程如下:

  1. 我从 NAV 中检索记录
  2. 我在需要的地方编辑和修改记录
  3. 我创建和/或更新修改的记录
  4. 要么成功,要么我收到上面提到的错误

无论哪种方式,我在整个过程中只调用一次更新方法。

请帮帮我...我一无所知

亲切的问候

【问题讨论】:

  • 我想您需要正确初始化记录变量。 Nav 在插入/修改时检查记录上的时间戳。如果时间戳在请求中相同但在 SQL 上发生更改,则会导致您面临的错误。
  • 这是哪个时间戳?我只是得到一个复杂的类型,它分配了某些属性,我知道 NAV 键属性非常重要,但我似乎找不到时间戳。
  • 时间戳在 SQL 服务器上,不能在 Nav 中访问,它只是在内部使用。您也无权访问它。我要说的是,您应该注意如何初始化用于访问导航记录的代理类型。很可能它在内部包含时间戳。
  • VS 生成了代理类...除了检索实体我什么都不做...我也在与我们的 NAV 顾问讨论这个问题,所以希望很快会有答案。 ..
  • 是的 VS 生成它们,但可能是如何使用它们的问题。如果您使用代理类的对象创建了一条记录,那么您可能需要先做一些事情,然后才能使用相同的对象或相同的记录调用 modify。

标签: .net soap dynamics-nav-2016


【解决方案1】:

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

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

对于刚刚更新实体然后想再次更新它的人来说,这可能看起来很奇怪,因为他们知道没有其他人正在使用系统或处理数据 - 但原因很简单。

当您更新一个实体时,您需要为其关键属性提供一个值。该值不仅包含实体的唯一标识符,还包含时间戳或版本描述(如果您愿意)。 这意味着键值是“一次性”的东西 - 如果您要更改实体的状态,则不能多次使用它。

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

那么如何解决这个问题,这很简单,因为 Update 方法将要更新的实体作为引用(ref)参数,所以一旦实体成功更新,它的 key 属性中就会有一个新值,这是实体的当前状态 - 将此值用于下一次更新等等。

这并不意味着如果要更新实体,您总是必须先检索它。该服务有一个方法来检查是否有必要。

service.IsUpdated(obj.Key);

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

希望这是有道理的,并且会帮助与我和 OP 处于相同情况的其他人:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多