如何实现 FIND CURRENT & CURRENT-CHANGE in Progress 4GL?
Posted
技术标签:
【中文标题】如何实现 FIND CURRENT & CURRENT-CHANGE in Progress 4GL?【英文标题】:How to implement FIND CURRENT & CURRENT-CHANGED in Progress4GL? 【发布时间】:2022-01-12 21:36:24 【问题描述】:我尝试阅读 FIND CURRENT 语句的进度知识库。它没有多大帮助。谁能告诉我 FIND CURRENT 语句的作用以及我们为什么/在哪些锁定场景中使用它?此外,如果可以用简单的示例进行解释,那将非常有帮助。注意:任何使用 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
【问题讨论】:
【参考方案1】:您的代码示例目前无法编译。您似乎将数据库名称“个人”与表名混淆,然后在表名和字段名之间使用空格指定字段名。或者类似的东西。
通常您不需要在代码中指定数据库名称。您可能希望这样做的一种情况是,如果您连接到具有相同名称表的多个数据库 - 但这不是您的情况。如果你要这样做,正确的语法是:
dbname.tablename.fieldname
您可能会使用 FIND CURRENT 的一种情况是,您认为其他用户可能会在您以 NO-LOCK 状态查看数据时更改数据。
如果您想升级锁而不必重新指定 WHERE 子句,另一种情况可能是使用 FIND CURRENT(下面的示例非常简单,因此几乎不值得省力,但您可以有更复杂的东西)。
例如:
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
【讨论】:
嗨,汤姆,你是对的。错误地,我提到了逻辑数据库名称 Personal 而不是表名 Personal。我很欣赏你给出的例子。感谢您为我提供清晰的信息。【参考方案2】:在上面的示例中,我没有看到 FIND CURRENT 有很多价值。您在第一个 FIND 中专门锁定记录。而且由于您已锁定记录,因此其他用户无法更改记录。
通常 FIND CURRENT 有两个目的: 更改锁定状态,例如从 NO-LOCK 或 SHARE-LOCK 到 EXCLUSIVE-LOCK,以防您不立即知道自己需要锁。
对于最初使用 FIND NO-LOCK 访问的记录,FIND CURRENT 允许刷新记录以防其他用户更改它。
【讨论】:
嗨 Mike,感谢您提出“查找当前记录允许在其他用户更改记录时刷新记录”这一点。我清楚地了解了 FIND CURRENT 和 CURRENT-CHANGED 的用法。 如果可能,避免共享锁。排他锁通常会让你不那么头疼。以上是关于如何实现 FIND CURRENT & CURRENT-CHANGE in Progress 4GL?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用find_if查找类的匹配对象? (或任何其他方式来实现结果)
Could not find ‘json‘ (>= 1.5.1) among 45 total gem(s)
Could not find ‘json‘ (>= 1.5.1) among 45 total gem(s)
C++文档阅读笔记-How to find Segmentation Error in C & C++ ? (Using GDB)
C++文档阅读笔记-How to find Segmentation Error in C & C++ ? (Using GDB)
C++文档阅读笔记-How to find Segmentation Error in C & C++ ? (Using GDB)