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

COBOL如何初始化嵌套结构的两列八行数据表?

COBOL嵌套表初始化解决方案

第一步:修正表结构(匹配两列8行需求)

你当前的DATA DIVISION定义把数值行和字符串行分成了两个独立的OCCURS组,没法实现“每行对应一个数值+一个字符串”的结构。正确的定义应该是每行包含两个列,然后8行重复:

01 BMI_TABELL.
    05 BMI_RAD OCCURS 8 TIMES.
        10 NUMBMI_CAT_HIGH_BREAK  PIC 99.9.
        10 BMI_MEDDELande_KORT_CAT_X  PIC X(30).

这样每一个BMI_RAD就是一行,包含数值列和字符串列,完全匹配你的需求。

第二步:初始化方法

方法1:静态硬编码初始化(推荐,适合固定值)

直接在WORKING-STORAGE里用VALUE子句批量初始化,注意COBOL里用句点作为小数点分隔符(需要把瑞典格式的逗号转成句点):

01 BMI_TABELL.
    05 BMI_RAD OCCURS 8 TIMES.
        10 NUMBMI_CAT_HIGH_BREAK  PIC 99.9.
        10 BMI_MEDDELande_KORT_CAT_X  PIC X(30).
    88 BMI_TABELL_INITIALIZED VALUE ALL '16.0' SPACE(30)
                                      '17.0' SPACE(30)
                                      '18.5' SPACE(30)
                                      '25.0' SPACE(30)
                                      '30.0' SPACE(30)
                                      '35.0' SPACE(30)
                                      '40.0' SPACE(30)
                                      '99.0' SPACE(30).

然后在PROCEDURE DIVISION开头执行:

SET BMI_TABELL_INITIALIZED TO TRUE.

就能一次性把所有行的数值和字符串(示例用空格填充,可替换为实际需要的内容)初始化完成。

方法2:动态循环初始化(适合需要动态赋值的场景)

如果需要在程序运行时赋值,用PERFORM循环遍历每一行:
首先在WORKING-STORAGE定义循环变量:

01 I PIC 9.

然后在PROCEDURE DIVISION中编写循环:

PROCEDURE DIVISION.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 8
        EVALUATE I
            WHEN 1 MOVE 16.0 TO NUMBMI_CAT_HIGH_BREAK(I)
                 MOVE '自定义字符串1' TO BMI_MEDDELande_KORT_CAT_X(I)
            WHEN 2 MOVE 17.0 TO NUMBMI_CAT_HIGH_BREAK(I)
                 MOVE '自定义字符串2' TO BMI_MEDDELande_KORT_CAT_X(I)
            WHEN 3 MOVE 18.5 TO NUMBMI_CAT_HIGH_BREAK(I)
                 MOVE '自定义字符串3' TO BMI_MEDDELande_KORT_CAT_X(I)
            WHEN 4 MOVE 25.0 TO NUMBMI_CAT_HIGH_BREAK(I)
                 MOVE '自定义字符串4' TO BMI_MEDDELande_KORT_CAT_X(I)
            WHEN 5 MOVE 30.0 TO NUMBMI_CAT_HIGH_BREAK(I)
                 MOVE '自定义字符串5' TO BMI_MEDDELande_KORT_CAT_X(I)
            WHEN 6 MOVE 35.0 TO NUMBMI_CAT_HIGH_BREAK(I)
                 MOVE '自定义字符串6' TO BMI_MEDDELande_KORT_CAT_X(I)
            WHEN 7 MOVE 40.0 TO NUMBMI_CAT_HIGH_BREAK(I)
                 MOVE '自定义字符串7' TO BMI_MEDDELande_KORT_CAT_X(I)
            WHEN 8 MOVE 99.0 TO NUMBMI_CAT_HIGH_BREAK(I)
                 MOVE '自定义字符串8' TO BMI_MEDDELande_KORT_CAT_X(I)
        END-EVALUATE
    END-PERFORM.

补充说明

  • COBOL中小数点统一用句点(.),你提供的瑞典逗号格式(如16,0)必须转成16.0才能正确赋值。
  • 如果坚持使用你原来的嵌套结构(不推荐,不符合“一行两列”的业务逻辑),初始化时需要同时指定两个OCCURS的下标,比如NUMBMI_CAT_HIGH_BREAK(1, I)和BMI_MEDDELande_KORT_CAT_X(2, I),但这种结构会让数值和字符串分属独立列组,行对应关系极易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:34:55