You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenEdge中FOR EACH与FIRST-OF的记录作用域异常咨询

生产环境正常但开发环境执行失败的Progress 4GL作用域问题

问题现象

代码在生产环境的标准.p文件中运行正常,但在独立过程编辑器或mpro会话中执行时,同一公司的第二条employee记录对应的company记录会变为不可用(即使该company记录实际存在)。

原代码

FOR EACH employee NO-LOCK BREAK BY employee.company:
    IF FIRST-OF(employee.company) THEN 
    DO:
        FIND company WHERE company.company = employee.company NO-LOCK NO-ERROR.
    END.

    MESSAGE FIRST-OF(employee.company) SKIP
            AVAILABLE company
         VIEW-AS ALERT-BOX. 
END.

预期与实际不符点

  • 预期:只要company记录存在,同一公司的所有employee记录对应的company都应处于可用状态
  • 实际:处理到同一公司的第二条employee记录时,AVAILABLE company返回false

原因分析

核心差异在于Progress 4GL的默认作用域规则:

  • 生产环境中,大概率启用了-scoped启动参数,默认作用域为过程级。FIND到的company记录会在整个过程生命周期内保持可用,直到被覆盖或过程结束。
  • 独立编辑器/mpro会话默认未启用该参数,默认作用域为语句级。每个FOR EACH循环迭代都会自动重置未显式声明作用域的记录缓冲区,导致下一次迭代时company缓冲区被清空,AVAILABLE company返回false。

解决方案

使用DO FOR块显式指定作用域,将employee和company的作用域绑定到该块内,确保同一块内的所有迭代共享同一个company缓冲区:

DO FOR employee, company:
    FOR EACH employee NO-LOCK BREAK BY employee.company:
        IF FIRST-OF(employee.company) THEN 
        DO:
            FIND company WHERE company.company = employee.company NO-LOCK NO-ERROR.
        END.

        MESSAGE FIRST-OF(employee.company) SKIP
                AVAILABLE company
            VIEW-AS ALERT-BOX. 
    END.
END.

环境配置验证

检查生产环境的启动参数,确认是否包含-scoped(或-scope)参数。若在mpro会话中添加该参数启动,原代码也能正常运行,与生产环境表现一致。

内容的提问来源于stack exchange,提问作者Darren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:25:15