什么是PERSISTENT正在进行的程序4GL?

时间:2015-05-21 21:15:27

标签: persistent progress-4gl openedge procedures

我想知道以下代码位中究竟发生了什么,

IF THIS-PROCEDURE:PERSISTENT 
THEN 
    DELETE PROCEDURE THIS-PROCEDURE.

Actullay我必须修复一种复杂的旧编码Progress GUI应用程序中的错误。简洁的情景, 系统正在保存有关成员的各种详细信息。其中有一个关系字段,您可以通过单击切换按钮切换到关系记录。所以问题是在你切换到关系记录之后,记录系统的结果会在我们切换的关系记录中保持锁定。 我无法发布任何代码,因为它显示代码问题是巨大而复杂的,但如果有人能够解决这个问题,你可能能够让我正确的方向来解决这个问题。我期待一个答案,比如检查调查这类问题的关键事项是什么?任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

持久性过程是在初始RUN完成后保留在内存中的过程。 (类似于古代"终止和驻留居民" DOS中的程序......)

以下内容过于简化,但可能有所帮助:

程序的主体可以被认为是"构造函数"。

您所展示的代码通常是作为析构函数的内部过程("方法")的一部分。

知道持久过程句柄的其他过程可以运行其方法。 "运行xyz IN proc-handle。" (您可以通过将持久性过程建立为"会话超级过程来避免需要知道句柄。)

您的锁定问题可能是由于记录范围不佳造成的。可能存在对作为整体的程序范围的记录的引用。然后有一种方法是“借”"从较大的程序记录范围并修改它需要锁定。然后锁定范围到过程而不是方法。

我个人认为有用的一个技巧就是编写内部程序:

procedure xyz:

  define parameter cnum  as integer no-undo.
  define parameter cname as character no-undo.

  define buffer customer for customer.  /* this is the "trick" */

  find customer exclusive-lock where custNum = cnum.
  custName = cname.

end.

"定义缓冲区"限制对&​​#34;客户"的所有引用到那个内部程序(方法)。这可以防止意外记录范围泄漏。

答案 1 :(得分:3)

Tom给了你一个很好的持久性描述,并且还指出了最可能的代码问题(记录范围而不是持久性过程问题)。

我喜欢比汤姆建议更进一步,并使用强大的范围,因为:

1)编译器会警告您有关增加范围的尝试 2)它适用于内部程序和旧式自上而下的代码

define buffer bfCustomer for Customer.

/*- a bfCustomer reference here gets a compiler error -*/

do for bfCustomer transaction:
   find first bfCustomer exclusive-lock no-error.
   assign bfCustomer.name = "testme".
end.

/*- a bfCustomer reference here gets a compiler error -*/