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
相关产品推荐
相关产品推荐

