大写字母的COBOL数据验证?

大写字母的COBOL数据验证?,cobol,validation,Cobol,Validation,我在大学的第二个季度学习“高级COBOL”,我们刚刚收到一份作业,要求我们为不同的数据编写一些验证程序。除了小的验证程序,我什么都做了 有一个名为“零件号”的字段,长度为8字节。前5列必须是数字。第6列必须是大写字母,最后2列必须在01-68或78-99范围内。我唯一的问题是如何验证第6列是否为大写 以下是我正在使用的代码: 从工作存储: 01 DETAIL-LINE. 05 PART-NUMBER.

我在大学的第二个季度学习“高级COBOL”,我们刚刚收到一份作业,要求我们为不同的数据编写一些验证程序。除了小的验证程序,我什么都做了

有一个名为“零件号”的字段,长度为8字节。前5列必须是数字。第6列必须是大写字母,最后2列必须在01-68或78-99范围内。我唯一的问题是如何验证第6列是否为大写

以下是我正在使用的代码: 从工作存储:

01 DETAIL-LINE.                                         
05 PART-NUMBER.                                     
    10 PART-FIRST-FIVE-DL        PIC X(5).          
    10 PART-LETTER-DL            PIC X.             
        88 CAPITAL-LETTER        VALUE 'A' THRU 'Z'.
    10 PART-LAST-TWO-DL          PIC XX.
来自300-VALIDATE-PART-NUMBER

EVALUATE PART-LETTER-DL ALPHABETIC               
   WHEN TRUE EVALUATE CAPITAL-LETTER               
      WHEN FALSE MOVE 'YES' TO RECORD-ERROR-SWITCH
      MOVE 'PART NUMBER' TO FIELD-NAME            
      MOVE PART-NO-IN TO FIELD-VALUE              
      MOVE 'YES' TO PART-NO-ERROR                 
   END-EVALUATE                                    
   WHEN FALSE MOVE 'YES' TO RECORD-ERROR-SWITCH    
   MOVE 'PART NUMBER' TO FIELD-NAME                
   MOVE PART-NO-IN TO FIELD-VALUE                  
   MOVE 'YES' TO PART-NO-ERROR                     
END-EVALUATE 

我知道我做这件事可能不是很有效率,但现在我只需要让它发挥作用。我已经阅读了书中关于数据验证的整个章节,这是最后一分钟的错误(程序明天到期),所以老师不在。我将非常感谢在这方面能得到的任何帮助。我真的不知道如何验证大写字母。如果零件号的第6列中没有A或Z,我现在使用的方法会报告错误

我看不出你的代码有什么根本性的错误。我把它放进一个盒子里 驱动程序,编译并运行它。我得到了预期的结果:只报告了错误 当零件号的第6个字符不是大写字母时

您的COBOL编码风格与我以前看到的非常不同(没有错,只是 不同)

大多数资深COBOL程序员的代码如下:

    IF PART-LETTER-DL IS ALPHABETIC AND
       CAPITAL-LETTER
       CONTINUE
    ELSE
       MOVE 'PART NUMBER' TO FIELD-NAME            
       MOVE PART-NO-IN TO FIELD-VALUE              
       MOVE 'YES' TO PART-NO-ERROR
    END-IF
如果
应用两个编辑条件,如果都通过(继续),则不执行任何操作,否则 报告错误(其他部分)。上面所做的与您的代码基本相同 除了使用
IF
而不是
EVALUATE
之外,该示例不进行其他操作

我给你满分测试字母和大写字母 使用88级范围(
through
)。很多程序员只会使用88级,使 隐式假设“A”到“Z”只包含字母字符-这是完全错误的 在某些环境中(特别是EBCDIC字符集)


另外,我知道你们一定有和Kimmy一样的老师

您应该关心的一件事是“值'A'到'Z'”。它只能在ASCII机器上工作


如果您实际对值“A”、“B”、“C”进行编码,…'Z’。它可以在所有平台上工作。

对于EBCDIC,放弃字母测试,只需使用88:

88 CAPITAL-LETTER        VALUE 'A' THRU 'I'
                               'J' THRU 'R'
                               'S' THRU 'Z'.

指定单个字母有效,但会生成26个比较!以上产生了三个问题。字母加上“A”到“Z”只有两个,但会带来一些内在的混淆(空格是字母,而“THRU”包括X'C1'到X'E9'范围内的不可打印数字)。

对于大写字母,您可以测试字母上限条件:

IF PART-LETTER-DL NOT EQUAL SPACE AND PART-LETTER-DL IS ALPHABETIC-UPPER
 ...
END-IF.

字母-LOWER也可以使用,但请记住空格被视为字母,因此如果您只需要大写字母,测试空格是必要的。

去年有人遇到了同样的问题,但没有达到您的程度----但答案很好。是的,事实上,我在发布问题之前就发现了这一点,但我一点也不明白。我认为这远远超出了我们目前所学的内容。问题中给出的代码将在我能想到的所有平台上正常工作。如果一个字符集在相同的值范围内编码混合的大写/小写字母,那么它只会失败。这在ASCII、EBCDIC或Unicode字符集中不会发生,因此我认为所采取的方法几乎是防弹的。但是,
'A'THRU'Z'
如果没有
字母
测试,则在EBCDIC中会失败,因为非字母字符出现在'A'到'Z'的值范围内。“A'THRU'Z”将允许非字符在EBCDIC上有效。。。。但是字母顺序并不能解决这个问题——将这两个测试放在一起可以解决这个问题,对于编写的代码来说也是如此。但该数据项仍然为被误解敞开了大门。