Progress 4GL:如何判断For Each更新操作是否执行成功?
在WebSpeed中处理Progress 4GL更新的锁定问题并返回状态
要解决记录锁定导致更新失败的问题,同时在WebSpeed中返回操作成功/失败的状态,你可以通过错误捕获机制结合Progress的错误码判断来实现。以下是具体的实现方案:
核心思路
Progress 4GL中记录被锁定的错误码为108(提示信息:Record is locked),我们可以通过错误处理块捕获该错误,区分是锁定失败还是其他异常,最终返回布尔值状态。
实现代码示例
方案1:捕获UPDATE时的锁定错误
此方案直接捕获UPDATE操作触发的锁定异常,适合需要遍历多条记录的场景:
OUTPUT CONTENT-TYPE 'text/plain'. DEFINE VARIABLE lSuccess AS LOGICAL NO-UNDO INITIAL TRUE. /* 错误捕获块:处理异常并区分错误类型 */ DO ON ERROR UNDO, THROW: FOR EACH products WHERE products.name = "ProductsName": UPDATE price = 1000. END. CATCH e AS Progress.Lang.Error: /* 判断是否为记录锁定错误 */ IF e:GetMessageNum(1) = 108 THEN DO: lSuccess = FALSE. /* 可选:添加日志记录锁定事件 */ LOG-MESSAGE "Products record locked: " + products.name TO "webspeed-logs.log". END. ELSE DO: /* 非锁定错误,重新抛出以保留原始错误信息 */ THROW e. END. END. /* 向Web前端输出结果 */ PUT UNFORMATTED STRING(lSuccess) SKIP.
方案2:主动尝试锁定记录(推荐)
使用EXCLUSIVE-LOCK NO-WAIT主动请求记录锁,避免程序因等待锁定而挂起,适合单条记录更新场景:
OUTPUT CONTENT-TYPE 'text/plain'. DEFINE VARIABLE lSuccess AS LOGICAL NO-UNDO INITIAL TRUE. DO ON ERROR UNDO, THROW: /* 尝试独占锁定记录,不等待 */ FIND FIRST products WHERE products.name = "ProductsName" EXCLUSIVE-LOCK NO-WAIT. IF AVAILABLE products THEN DO: UPDATE price = 1000. END. ELSE DO: /* 记录不存在或锁定失败 */ lSuccess = FALSE. END. CATCH e AS Progress.Lang.Error: IF e:GetMessageNum(1) = 108 THEN DO: lSuccess = FALSE. LOG-MESSAGE "Failed to lock products record: " + "ProductsName" TO "webspeed-logs.log". END. ELSE DO: THROW e. END. END. PUT UNFORMATTED STRING(lSuccess) SKIP.
关键说明
- Content-Type设置:通过
OUTPUT CONTENT-TYPE 'text/plain'确保前端能正确解析返回的布尔值文本。 - 错误码判断:错误号
108是Progress标准的记录锁定错误码,精准识别锁定导致的失败。 - 日志记录:可选添加
LOG-MESSAGE语句,便于后续排查锁定问题的触发场景。 - 异常处理:非锁定错误重新抛出,保证其他类型的异常能被正常捕获和处理。
内容的提问来源于stack exchange,提问作者Taki Tam
相关产品推荐
相关产品推荐

