0

我面临一个我发现很难调试的错误。

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

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

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

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

当我在网上搜索时,我会得到类似“您尝试修改同一记录两次”的结果和一堆 NAV 代码,但我无法访问 NAV 代码,而我们正在与之合作的 NAV 顾问自己也一无所知.

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

我的工作流程如下:

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

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

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

亲切的问候

4

1 回答 1

2

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

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

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

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

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

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

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

service.IsUpdated(obj.Key);

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

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

于 2019-12-11T14:56:16.213 回答