如何实现 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)