我最近一直在处理一个问题并且被卡住了。特定程序(已编译的 .p)具有编写的代码,它试图将值保存到数据库中的特定字段。
在该表下方有一个 VAILDATE 语句。这会导致值在执行更新操作时恢复。我在 VALIDATE 之前和之后发送了消息,可以看到在 VALIDATE 之前更新的值并在 VALIDATE 之后恢复。请有人可以帮助我。提前谢谢了。
我最近一直在处理一个问题并且被卡住了。特定程序(已编译的 .p)具有编写的代码,它试图将值保存到数据库中的特定字段。
在该表下方有一个 VAILDATE 语句。这会导致值在执行更新操作时恢复。我在 VALIDATE 之前和之后发送了消息,可以看到在 VALIDATE 之前更新的值并在 VALIDATE 之后恢复。请有人可以帮助我。提前谢谢了。
从文档中:
VALIDATE statement:
Verifies that a record complies with mandatory field and unique index definitions.
因此,如果您的 UPDATE 在 VALIDATE 之后恢复,则意味着至少有一个字段值不符合约束条件。查看您的表架构和字段值。检查它们是否正常。从您的问题中不清楚您是否可以访问代码。如果您有权访问代码并且 VALIDATE 语句有 NO-ERROR,请尝试删除 NO-ERROR。如果您删除 NO-ERROR,您会看到错误消息,其中可能包含一些线索。
我确实模拟了你的问题。最有可能的是,分配违反了索引并更改了您正在监视的字段的值。当 OE 解析 VALIDATE 并且没有通过时,整个事务将失败。然后将记录恢复(回滚)到其最后一个有效值,以及您正在查看的字段的旧值。据我所知,这是意料之中的。
为了避免这种行为,我相信你应该
a) 仅更改唯一字段后重写块并验证记录(尽管这并不能真正解决它。它只是使您免于执行稍后将撤消的操作);或者
b) 将旧值保存到临时表记录中,如果在 VALIDATE 失败时仍需要它们,则将它们复制回来。
希望这至少能给你一些想法。
好的。所以问题是“验证声明一个 .p 文件,导致值回滚。根本原因是根据下面链接中提到的最后一点:
其中一个触发器有一个有意回滚该值的代码。
如上所述,原因是 VALIDATE 语句触发了所有相关的触发器。
感谢您的所有帮助。我很感激能成为这样一个伟大社区的一员。
我现在找到了造成这种情况的原因。文档“ https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvref/validate-statement.html ”在最后一点给出了答案。我不知道 VALIDATE 语句的这种行为。
再次感谢大家。