如何实施 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
我尝试阅读 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