0

我最近一直在处理一个问题并且被卡住了。特定程序(已编译的 .p)具有编写的代码,它试图将值保存到数据库中的特定字段。

在该表下方有一个 VAILDATE 语句。这会导致值在执行更新操作时恢复。我在 VALIDATE 之前和之后发送了消息,可以看到在 VALIDATE 之前更新的值并在 VALIDATE 之后恢复。请有人可以帮助我。提前谢谢了。

4

4 回答 4

2

从文档中:

VALIDATE statement:
Verifies that a record complies with mandatory field and unique index definitions. 

因此,如果您的 UPDATE 在 VALIDATE 之后恢复,则意味着至少有一个字段值不符合约束条件。查看您的表架构和字段值。检查它们是否正常。从您的问题中不清楚您是否可以访问代码。如果您有权访问代码并且 VALIDATE 语句有 NO-ERROR,请尝试删除 NO-ERROR。如果您删除 NO-ERROR,您会看到错误消息,其中可能包含一些线索。

于 2017-07-05T08:49:18.440 回答
2

我确实模拟了你的问题。最有可能的是,分配违反了索引并更改了您正在监视的字段的值。当 OE 解析 VALIDATE 并且没有通过时,整个事务将失败。然后将记录恢复(回滚)到其最后一个有效值,以及您正在查看的字段的旧值。据我所知,这是意料之中的。

为了避免这种行为,我相信你应该

a) 仅更改唯一字段后重写块并验证记录(尽管这并不能真正解决它。它只是使您免于执行稍后将撤消的操作);或者

b) 将旧值保存到临时表记录中,如果在 VALIDATE 失败时仍需要它们,则将它们复制回来。

希望这至少能给你一些想法。

于 2017-07-05T18:44:36.707 回答
1

好的。所以问题是“验证声明一个 .p 文件,导致值回滚。根本原因是根据下面链接中提到的最后一点:

https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvref/validate-statement.html

其中一个触发器有一个有意回滚该值的代码。

如上所述,原因是 VALIDATE 语句触发了所有相关的触发器。

于 2017-07-14T08:06:55.820 回答
0

感谢您的所有帮助。我很感激能成为这样一个伟大社区的一员。

我现在找到了造成这种情况的原因。文档“ https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvref/validate-statement.html ”在最后一点给出了答案。我不知道 VALIDATE 语句的这种行为。

再次感谢大家。

于 2017-07-07T09:50:40.790 回答