我想知道以下代码位中究竟发生了什么,
IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE.
Actullay我必须修复一种复杂的旧编码Progress GUI应用程序中的错误。简洁的情景, 系统正在保存有关成员的各种详细信息。其中有一个关系字段,您可以通过单击切换按钮切换到关系记录。所以问题是在你切换到关系记录之后,记录系统的结果会在我们切换的关系记录中保持锁定。 我无法发布任何代码,因为它显示代码问题是巨大而复杂的,但如果有人能够解决这个问题,你可能能够让我正确的方向来解决这个问题。我期待一个答案,比如检查调查这类问题的关键事项是什么?任何帮助都将受到高度赞赏。
答案 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.
"定义缓冲区"限制对"客户"的所有引用到那个内部程序(方法)。这可以防止意外记录范围泄漏。
答案 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 -*/