如何实施 FIND CURRENT & CURRENT-CHANGE in Progress 4GL?

How to implement FIND CURRENT & CURRENT-CHANGED in Progress4GL?

我尝试阅读 FIND CURRENT 语句的 Progress 知识库。它没有太大帮助。谁能告诉我 FIND CURRENT 语句的作用以及 why/in 我们使用它的哪些锁定场景?另外,如果可以用简单的例子来解释它,那将非常有帮助。注意:任何使用 Sports 数据库的示例,知识库中均未显示。我实现了下面的代码,但是当我编译程序时它似乎没有到达 CURRENT-CHANGED 语句(我正在使用我创建的逻辑名称为“个人”的数据库)。

谢谢。

 FIND FIRST personal WHERE personal firstNAME = "Ganesh" EXCLUSIVE-LOCK.
 UPDATE personal.
 FIND CURRENT personal EXCLUSIVE-LOCK.
 UPDATE personal
 IF CURRENT-CHANGED personal THEN DO:
    MESSAGE "Record is changed"
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK
    DISPLAY personal.
 END

在上面的示例中,我没有看到 FIND CURRENT 有太多价值。您在第一个 FIND 中专门锁定记录。由于您已锁定记录,因此其他用户无法更改记录。

一般FIND CURRENT有两个目的:改变锁状态,例如从 NO-LOCK 或 SHARE-LOCK 到 EXCLUSIVE-LOCK,以防你不知道你需要锁。

对于最初使用 FIND NO-LOCK 访问的记录,FIND CURRENT 允许刷新记录以防其他用户更改它。

您的代码示例目前无法编译。您似乎将数据库名称“个人”与 table 名称混淆,然后在 table 名称和字段名称之间使用 space 指定字段名称。或者类似的东西。

通常您不需要在代码中指定数据库名称。您可能希望这样做的一种情况是,如果您连接到具有相同名称 tables 的多个数据库——但这不是您的情况。如果您要这样做,则使用的正确语法是:

dbname.tablename.fieldname

您可能会使用 FIND CURRENT 的一种情况是,您认为其他用户可能正在更改数据,而您正在以 NO-LOCK 状态查看数据。

另一种情况可能是使用 FIND CURRENT 如果你想升级锁而不必重新指定 WHERE 子句(下面的例子非常简单所以不值得省力但你可以有很多东西更复杂)。

例如:

find customer no-lock where customer.custNum = 1.
display customer.custName.
pause.

/* if you try to update the name at this point you will fail because the record is not locked */

find current customer exclusive-lock.  /* upgrade from no-lock to an exclusive-lock */

if current-changed customer = false then
  update customer.custName.
 else
  do:
    message "someone else changed things while you were reviewing the record :(".
  end.

这里也有说明:

https://docs.progress.com/bundle/openedge-abl-reference-117/page/CURRENT-CHANGED-function.html