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

OpenEdge/Progress 4GL手机号与出生日期验证及代码问题求助

问题分析与修复方案

原代码核心问题

  1. Frame B未明确定位:Progress 4GL中未定义位置的frame可能无法正常渲染,导致录入后无输出。
  2. 重复录入操作:dob < today分支已执行update name,后续又重复执行,打乱录入流程。
  3. 输入校验不严谨:出生日期、手机号仅单次校验,用户再次输入错误时无二次校验逻辑,无法保证数据合法性。
  4. 手机号逻辑不符需求:原代码仅校验10位手机号,不符合"不少于9位"的要求;且用int存储手机号存在范围限制(Progress int最大值通常为2147483647,无法存10位以上号码)。
  5. Frame B输出逻辑模糊:未明确显示位置,内容可能被其他frame覆盖。

修复后的代码

define var num as integer label "S.No".                                                      
define var name as char label "NAME ".                                                        
define var dob as date label "DOB" format "99/99/9999". 
define var mobnum as char label "Mobile No:" format "9999999999". /* 改用char存储,避免int范围限制 */

/* 定义录入区Frame A和展示区Frame B的位置与结构 */
define frame a at row 2 col 2
    num label "S.No"
    dob label "DOB"
    name label "NAME"
    mobnum label "Mobile No:"
    with 10 down title "信息录入".

define frame b at row 15 col 2
    num column-label "S.NO"
    name column-label "NAME"
    dob column-label "DOB"
    mobnum column-label "Mobile Number"
    with 10 down title "已录入记录".

/* 初始化Frame B表头 */
display 
    "S.NO" column-label "S.NO"
    "NAME" column-label "NAME"
    "DOB" column-label "DOB"
    "Mobile Number" column-label "Mobile Number"
with frame b.
down with frame b.

repeat num = 1 to 3: 
    /* 清空Frame A旧内容 */
    erase frame a.

    display num with frame a.

    /* 循环校验出生日期:必须小于等于当前日期 */
    repeat:
        update dob with frame a.
        if dob > today then do:    
            display "日期不能大于当前日期,请重新输入." with frame a row 10 col 2.
        end.
        else leave. /* 输入正确则退出校验循环 */
    end.

    /* 录入姓名 */
    update name with frame a.

    /* 循环校验手机号:不少于9位数字 */
    repeat:
        update mobnum with frame a.
        if not(mobnum matches "999999999") or length(mobnum) < 9 then do:
            display "请输入不少于9位的数字手机号." with frame a row 10 col 2.
        end.
        else leave. /* 输入正确则退出校验循环 */
    end.

    /* 在Frame B追加当前记录 */
    display 
        num column-label "S.NO"
        name column-label "NAME"
        dob column-label "DOB"
        mobnum column-label "Mobile Number"
    with frame b down.

end.  

关键修复说明

  • 明确Frame定义:指定两个frame的位置和标题,分离录入区与展示区,避免内容覆盖。
  • 循环校验输入:对出生日期、手机号使用repeat循环,直到用户输入符合要求,确保数据有效性。
  • 优化录入流程:移除重复的update name操作,严格按照序号→出生日期→姓名→手机号的顺序录入。
  • 手机号存储优化:改用char类型存储,避免整数范围限制,同时方便长度校验。
  • 初始化展示表头:提前渲染Frame B的表头,让输出结构更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:57:32