数据验证

时间:2011-01-17 23:27:56

标签: cobol

所以我进入了学院的第二学期,他们让我做了一门名为Advanced COBOL的课程。作为我的任务之一,我必须制作一个程序来测试文件中的某些内容,以确保输入没有错误。我得到了一般性的想法,但只有一些我不理解的事情,我的老师就是那些会给你一项任务的人之一,让你自己很少或根本没有帮助。所以我需要帮助。

  1. 我有一个字段,前5列必须是数字,第6列是大写字母,最后2个数字是01-68或78-99。

  2. 我的一个字段必须是一串数字,其中包含短划线,如00000-000,但有些字符有多个短划线。如何计算破折号以确定存在问题。

1 个答案:

答案 0 :(得分:2)

以下是一些提示......

使用hieratical记录结构以不同方式查看数据。例如:

 01 ITEM-REC.
    05 ITEM-CODE.
       10 ITEM-NUM-CODE    PIC 9(3).
       10 ITEM-CHAR-CODE   PIC A(3).
          88 ITEM-TYPE-A   VALUE 'AAA' THRU 'AZZ'.
          88 ITEM-TYPE-B   VALUE 'BAA' THRU 'BZZ'.
    05 QUANTITY            PIC 9(4).

ITEM-CODE是一个6个字符的组字段,第一部分是数字(ITEM-NUM-CODE),最后一部分 是字母(ITEM-CHAR-CODE)。您可以在程序中引用这三个变量中的任何一个。当你 请参阅ITEM-CODE或任何其他组项COBOL 将变量视为声明为PIC X。这意味着你可以 MOVE几乎没有任何错误。例如:

MOVE 'ABCdef' TO ITEM-CODE

MOVE 'ABCdef0005' TO ITEM-REC

即使基本数据项ITEM-NUM-CODE绝对不是数字,也不会导致错误。 验证有效性 组移动后的数据应分别验证每个基本数据项(除非 你知道肯定没有发生数据类型错误)。有很多种方法可以做到这一点。对于 例如,如果数据项必须是数字,则以下方法可以起作用:

IF ITEM-NUM-CODE IS NUMERIC
   CONTINUE
ELSE
   DISPLAY 'ITEM-NUM-CODE IS NOT NUMERIC'
   PERFORM BIG-BAD-ERROR
END-IF

COBOL提供了可以对数据项应用的各种类测试。对于 例如:常用NUMERIC,ALPHABETIC和ALPHANUMERIC。

测试值范围的另一种常用方法是定义各种88级 - 但是练习 警告。在上面 示例ITEM-TYPE-A是一个88级别,它定义了基于的“AAA”到“AZZ”的数据范围 整理顺序目前有效。验证ITEM-CHAR-CODE仅包含字母 字符和第一个字母是'A'或'B',您可以执行以下操作:

IF ITEM-CHAR-CODE ALPHABETIC
   DISPLAY 'ITEM-CHAR-CODE is alphabetic.'
   EVALUATE TRUE
      WHEN ITEM-TYPE-A
         DISPLAY 'ITEM-CHAR-CODE is in range AAA through AZZ'
      WHEN ITEM-TYPE-B
         DISPLAY 'ITEM-CHAR-CODE is in range BAA through BZZ'
      WHEN OTHER
         DISPLAY 'ITEM-CHAR-CODE is in some other range'
   END-EVALUATE
ELSE
   DISPLAY 'ITEM-CHAR-CODE is not alphabetic'
END-IF        

请注意上面ALPHABETIC的单独测试。为什么在88级测试时呢 本来可以做的吗?实际上88是不够的,因为他们 根据当前的整理顺序,涵盖从AAAAZZ的整个范围 有效。在 这是一个基于EBCDIC的环境(大量的COBOL商店使用EBCDIC) A}\等值。 close-brace和反斜杠字符是非alpha的但是 落入中间 范围'A'到'Z'(#* @!是什么?)。还要注意这样的值 因为'aaa'不满足ITEM-TYPE-A条件,因为小写字母落在外面 定义的范围。也许是时候看看EBCDIC角色表了。

最后,您可以计算字符或字符串的出现次数 带有INSPECT动词的变量如下:

INSPECT ITEM-CODE TALLING DASH-COUNT FOR ALL '-'

DASH-COUNT必须是一个数字项,并且会包含ITEM-CODE中的短划线字符数。 INSPECT 如果要计算位数,动词就不那么有用了。为此,每个数字都需要一个语句。

对循环进行编码可能更容易:

PERFORM VARYING I FROM 1 BY 1
           UNTIL I > LENGTH OF ITEM-CODE
   EVALUATE ITEM-CODE(I:1)
      WHEN '-'
         COMPUTE DASH-COUNT = DASH-COUNT + 1
      WHEN '0' THRU '9'
         COMPUTE DIGIT-COUNT = DIGIT-COUNT + 1
      WHEN OTHER
         COMPUTE OTHER-COUNT = OTHER-COUNT + 1
   END-EVALUATE
END-PERFORM

现在问问自己为什么我很乐意使用0到9范围检查?提示:查看整理顺序。

希望这会有所帮助。