COBOL - 数据布局
COBOL 布局是对每个字段的使用及其中存在的值的描述。 以下是COBOL中使用的数据描述条目−
- Redefines 子句
- Renames 子句
- Usage 子句
- Copybooks
Redefines 子句
Redefines 子句用于定义具有不同数据描述的存储。 如果一个或多个数据项不同时使用,则相同的存储可用于另一数据项。 因此同一个存储可以被不同的数据项引用。
语法
以下是 Redefines 子句的语法 −
01 WS-OLD PIC X(10). 01 WS-NEW1 REDEFINES WS-OLD PIC 9(8). 01 WS-NEW2 REDEFINES WS-OLD PIC A(10).
以下是所使用参数的详细信息 −
- WS-OLD 是重新定义的项目
- WS-NEW1 和 WS-NEW2 正在重新定义项目
重定义项和重定义项的级别号必须相同,且不能是66或88级号。 不要将 VALUE 子句与重新定义项一起使用。 在文件部分中,不要使用级别号为 01 的 redefines 子句。 重新定义定义必须是您要重新定义的下一个数据描述。 重新定义的项目将始终具有与重新定义的项目相同的值。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-DESCRIPTION. 05 WS-DATE1 VALUE '20140831'. 10 WS-YEAR PIC X(4). 10 WS-MONTH PIC X(2). 10 WS-DATE PIC X(2). 05 WS-DATE2 REDEFINES WS-DATE1 PIC 9(8). PROCEDURE DIVISION. DISPLAY "WS-DATE1 : "WS-DATE1. DISPLAY "WS-DATE2 : "WS-DATE2. STOP RUN.
JCL 执行上面的COBOL程序 −
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
当你编译并执行上面的程序时,它会产生以下结果 −
WS-DATE1 : 20140831 WS-DATE2 : 20140831
Renames 子句
Renames 子句用于为现有数据项指定不同的名称。 它用于重新组合数据名称并为其赋予新名称。 新的数据名称可以跨组或基本项目重命名。 66 级保留用于重命名。
语法
以下是 Renames 子句的语法 −
01 WS-OLD. 10 WS-A PIC 9(12). 10 WS-B PIC X(20). 10 WS-C PIC A(25). 10 WS-D PIC X(12). 66 WS-NEW RENAMES WS-A THRU WS-C.
重命名只能在同一级别进行。 在上面的示例中,WS-A、WS-B 和 WS-C 处于同一级别。 重命名定义必须是您要重命名的下一个数据描述。 请勿使用级别编号为 01 或 77 的重命名。用于重命名的数据名称必须按顺序排列。 无法重命名带有发生子句的数据项。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-DESCRIPTION. 05 WS-NUM. 10 WS-NUM1 PIC 9(2) VALUE 20. 10 WS-NUM2 PIC 9(2) VALUE 56. 05 WS-CHAR. 10 WS-CHAR1 PIC X(2) VALUE 'AA'. 10 WS-CHAR2 PIC X(2) VALUE 'BB'. 66 WS-RENAME RENAMES WS-NUM2 THRU WS-CHAR2. PROCEDURE DIVISION. DISPLAY "WS-RENAME : " WS-RENAME. STOP RUN.
JCL 执行上面的COBOL程序 −
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
当你编译并执行上面的程序时,它会产生以下结果 −
WS-RENAME : 56AABB
Usage 子句
Usage 子句指定存储格式数据的操作系统。 它不能与级别号 66 或 88 一起使用。如果在组上指定了用法子句,则所有基本项将具有相同的用法子句。 使用子句可用的不同选项如下 −
Display
数据项以 ASCII 格式存储,每个字符占用 1 个字节。 这是默认用法。
以下示例计算所需的字节数 −
01 WS-NUM PIC S9(5)V9(3) USAGE IS DISPLAY. It requires 8 bytes as sign and decimal doesn't require any byte. 01 WS-NUM PIC 9(5) USAGE IS DISPLAY. It requires 5 bytes as sign.
COMPUTATIONAL / COMP
数据项以二进制格式存储。 这里,数据项必须是整数。
以下示例计算所需的字节数 −
01 WS-NUM PIC S9(n) USAGE IS COMP. If 'n' = 1 to 4, it takes 2 bytes. If 'n' = 5 to 9, it takes 4 bytes. If 'n' = 10 to 18, it takes 8 bytes.
COMP-1
数据项与Real或Float类似,表示为单精度浮点数。 在内部,数据以十六进制格式存储。 COMP-1 不接受 PIC 条款。 这里1个字等于4个字节。
COMP-2
数据项与Long或Double类似,表示为双精度浮点数。 在内部,数据以十六进制格式存储。 COMP-2 未指定 PIC 子句。 这里2个字等于8个字节。
COMP-3
数据项以压缩十进制格式存储。 每个数字占据半个字节(1 个半字节),符号存储在最右边的半字节。
以下示例计算所需的字节数 −
01 WS-NUM PIC 9(n) USAGE IS COMP. Number of bytes = n/2 (If n is even) Number of bytes = n/2 + 1(If n is odd, consider only integer part) 01 WS-NUM PIC 9(4) USAGE IS COMP-3 VALUE 21. It requires 2 bytes of storage as each digit occupies half a byte. 01 WS-NUM PIC 9(5) USAGE IS COMP-3 VALUE 21. It requires 3 bytes of storage as each digit occupies half a byte.
Copybooks
COBOL copybook 是定义数据结构的代码选择。 如果某个特定的数据结构在许多程序中使用,那么我们可以使用copybook,而不是再次编写相同的数据结构。 我们使用 COPY 语句在程序中包含抄写本。 COPY 语句用于WorkingStorage 部分。
以下示例在 COBOL 程序中包含一个 Copybooks −
DATA DIVISION. WORKING-STORAGE SECTION. COPY ABC.
这里 ABC 是 copybook 名称。 ABC copybook 中的以下数据项可以在程序内使用。
01 WS-DESCRIPTION. 05 WS-NUM. 10 WS-NUM1 PIC 9(2) VALUE 20. 10 WS-NUM2 PIC 9(2) VALUE 56. 05 WS-CHAR. 10 WS-CHAR1 PIC X(2) VALUE 'AA'. 10 WS-CHAR2 PIC X(2) VALUE 'BB'.