入出力レコード以外に、中間の演算や処理の為に必要なデータ項目は、この節に書く。
また、データ項目にあらかじめ値を設定しておく事ができる。
初期値を設定するものに以下のものがあります。
FILLER
メモリは確保するが、特に名前は付けない場合には、FILLERと記載します。
系统的关键字,其所描述的数据具有特殊的意义,不能通过其他用户自定义的数据名取代。
主页是占用记录为准,但在程序中不会用到。
iFanxu
入出力レコード以外に、中間の演算や処理の為に必要なデータ項目は、この節に書く。
また、データ項目にあらかじめ値を設定しておく事ができる。
初期値を設定するものに以下のものがあります。
FILLER
メモリは確保するが、特に名前は付けない場合には、FILLERと記載します。
系统的关键字,其所描述的数据具有特殊的意义,不能通过其他用户自定义的数据名取代。
主页是占用记录为准,但在程序中不会用到。
1、 FD语句主要用来描述与文件记录相关的物理信息,如记录实际格式,长度等。
RECORDING MODE IS F : 用于指明文件记录的格式。F表示 Fixed-length。通常,大多文件都是定长的。
2、 LABEL RECORDS ARE STANDARD:缺省为STANDARD。还可以取OMITTED,OMITTED表示忽略文件记录的标号。当指定为OMITTED时,将对应于用作输出打印的文件。也可写为:LABEL RECORD IS STANDARD.
3、 RECORD CONTAINS 132 CHARACTERS:标明每条文件记录包含132个字符。标准情况下输出的文件中的记录是包含132个字符的。同时,此处所指定的字符个数需要与后面由PIC语句指定的总字符数一致。
4、 DATA RECORD IS PRINT-LINE:指明该文件所包含的记录名。
FD语句语法格式如下:
FD FILE-NAME
BLOCK CONTAINS N RECORDS
RECORD CANTAINS N CHARACTERS
LABEL RECORD IS OMITTED/STANDARD
(OR: LABEL RECORDS ARE OMITTED/STANDARD)
RECORDING MODE IS F
DATA RECORD IS RECORD-NAME.
BLOCK CONTAINS N RECORDS:该从句用于指明在一个数据块中包含有多少条数据记录。通常情况下,N的值为0,表示在程序的执行过程中动态地对数据记录组块。
FD语句下所有的数据组和数据项组成了该文件的一条记录。
实际,在文件节(FILE SECTION)中,FD语句下定义的数据组和数据项是对相应文件记录逻辑上的一个划分。
【用途】
通称FD句と呼ばれ、ファイルの記述をおこなう。環境部のINPUT-OUTPUT SECTIONに記述したSELECT句のファイルに対して必ず対応するFD句を記述しなければならない。
ファイル記述項
COBOLプログラムでは,ファイル記述項がファイル節の中の最高レベルを表す.ファイル節の見出しに続けてファイル記述項を書く.ファイル記述項は,レベル指示語FD,ファイル名及び幾つかの独立な句の並びで構成し,レコードやブロックの大きさ,ラベルレコードの有無,ラベル項目の値,ファイルを構成するレコードの名前及び論理的な印字ページの行数を指定する.ファイル記述項自体は,分離符の終止符でとめる.
レコード記述の構造
レコード記述(record description)は,レコードの性質を記述する一群のデータ記述項で構成する.
データ記述項は,レベル番号とそれに続くデータ名又はFILLER句及び幾つかの必要な独立した句の並びで構成する.レコード記述は,階層構造を有する.ある項に書く句は,それに従属する項があるかないかによって異なる.
初期値
ファイル節のデータ項目の初期値は,不定である.
機能
ファイル記述項は,ファイルの物理的な構造,識別及び順ファイルに関連するレコード名の情報を与える.
程序中所有数据间的关系在数据部中通过层指示符和层号来定义。
层指示符(level indicator)和其描述条目一起指定了程序中的每个文件。FD是文件描述的层指示符,SD是sort-merge文件描述的层指示符。
层号(level-number)和其描述条目一起指定了具体数据的属性。层号包括范围[01,49]中的一位或两位整数,以及3个特殊层号:66、77、88。
基本数据项(elementary items)是数据的基本划分。
组数据项(group items)是基本数据项的组合。组还可以组合成包含一个或多个子组的更大的组。不带GROUP-USAGE从句的组是英数字型的组,无论其所包含的基本数据项是如何表示的。GROUP-USAGE的用法为:
GROUP-USAGE [IS] NATIONAL.
每个组数据项和基本数据项都是一个单独的条目,都必须被赋予一个层号。
01:它是最高层,必须从A区开始。可以是英数字型组数据项、NATIONAL组数据项或基本数据项。
02~49:可以从A区或B区开始。层次越低的数据项被赋予越大的层号,它们之间不必是连续的。
66:必须包含一个RENAMES从句,用于重新编制前面已定义的数据项。
格式:
66 DATA-1 RENAMES DATA-2 [THROUGH/THRU DATA-3].
例1——————————-
01 RECORD-I
05 DN-1… .
05 DN-2… .
05 DN-3… .
05 DN-4… .
66 DN-6 RENAMES DN-1 THROUGH DN-3.
图示:
│DN-1│DN-2│DN-3│DN-4│
┕━━━DN-6━━━┙
例2——————————-
01 RECORD-II
05 DN-1… .
10 DN-2… .
10 DN-2A… .
05 DN-1A REDEFINES DN-1.
10 DN-3A… .
10 DN-3… .
10 DN-3B… .
05 DN-5… .
66 DN-6 RENAMES DN-2 THROUGH DN-3.
图示:
┍━━━DN-1 ━━━━┑
│DN-2 │ DN-2A │DN-5 │
┍━━━DN-1A━━━━┑
│DN-3A │DN-3│DN-3B│
┕━━DN-6━━┙
77:必须从A区开始。用于标识工作存储节或连接节中的一个独立的数据描述条目。它不是其它项目的细分项,本身也不能细分。
88:标识与条件变量的某个特定值相关的条件名。
01 AGE-GROUP PIC 99. //条件变量(conditional variable)
88 INFANT VALUE 0. //条件名(condition name),下同
88 BABY VALUE 1, 2.
88 CHILD VALUE 3 THRU 12.
88 TEENAGER VALUE 13 THRU 19.
用法:
IF INFANT //如果AGE-GROUP的值为0
… //执行语句
数据对齐规则:
数据在基本数据项中的对齐标准取决于接收它的数据项的类型。
数字型(numeric):按假定的小数点对齐,如果需要,会发生截断或以0填充。如果没有显式地指定小数点,则认为小数点紧接在字段的最右边。
数字编辑型(numeric-edited):按小数点对齐,如果需要,会在任意一端发生截断或以0填充。
内部浮点数(internal floating-point):小数点被假定紧接在字段的最左边,数据向左对齐,指数被相应地调整。
外部浮点数(external floating-point):数据向左对齐,指数被相应地调整。
英数字型(alphanumeric)/英数字编辑型(alphanumeric-edited)/字母型(alphabetic)/DBCS:左对齐,如果需要,会在右端发生截断或以空格填充。如果指定了JUSTIFIED/JUST从句,则右对齐。
national/national-edited:同上,区别是用Unicode空格(NX’0020’)进行填充。
数据描述从句:
FILLER:指定程序中不被显示提到的数据项。如果省略了数据名及FILLER,则相当于使用了FILLER。在INITIALIZE语句中,FILLER数据项将被忽略。
BLANK WHEN ZERO/ZEROS/ZEROES:当数据项的值为零时,该项只包含空格。只能用于数字型和数字编辑型的基本数据项,且其PICTURE字符串不包含S或*,必须被显式或隐式地描述为USAGE DISPLAY或USAGE NATIONAL。不能用于日期字段。
JUSTIFIED/JUST [RIGHT]:右对齐。只用于英数字型(alphanumeric)/英数字编辑型(alphanumeric-edited)/字母型(alphabetic)/DBCS/national/national-edited。
OCCURS:指定一个表(数组),其元素可以通过下标来访问,下标从1开始。OCCURS不能用于01、66、77和88层的项目。多维表通过嵌套OCCURS来实现,其下标格式为(m,n,k…)或(m n k…)。格式:
OCCURS INT-1 [TO INT-2] [TIMES] DEPENDING [ON] DATA-1
ASCENDING/DESCENDING [KEY] [IS] DATA-2…
INDEXED [BY] IDX-1… .
其中,INT-2必须比INT-1大。
DEPENDING ON从句定义不定长的表。DATA-1必须是整数数据项,其当前值代表了表中当前的元素个数。
ASCENDING/DESCENDING KEY短语指定表中的数据必须按升序或降序排列。DATA-2…必须按其重要性的降序列出。所有KEY的个数不能超过12个,所有KEY的长度和不能超过256。
INDEXED BY定义表的索引。可以为一个特定的表创建索引(用INDEXED BY),此索引也可以用于其它表,只要两个表具有相同数目及相同长度的元素;也可以单独创建一个索引(用USAGE [IS] INDEX),此索引可以用于任何一个表。例:
05 TABLE-ITEM PIC X(8) OCCURS 10 INDEXED BY INX-A.
77 INX-B USAGE IS INDEX.
PERFORM VARYING INX-B FROM 1 BY 1 UNTIL INX-B > 10
DISPLAY TABLE-ITEM(INX-B)
END-PERFORM.
PICTURE/PIC [IS]:指定基本数据项的一般特征和编辑要求。PICTURE从句不可用于INDEX数据项、RENAMES主语、POINTER和内部浮点数。
picture符号的含义:
A:容纳一个拉丁字母或空格。占据数据项大小中的一个字符位。
B:容纳一个空格。占据数据项大小中的一个字符位。
E:标示外部浮点数中指数的起点。占据数据项大小中的一个字符位。
G:一个DBCS字符。占据数据项大小中的一个字符位。
N:一个DBCS字符或NATIONAL字符。占据数据项大小中的一个字符位。
P:指定假定的十进制缩放位置,不计入数据项大小。
只能在picture字符串的最左边或最右边指定一串连续的P。例:PPP999的值范围为0~.000999,
S999PPP的值范围为-999000~-1000、0、1000~999000。
S:正负号指示符,不计入数据项大小,如果指定了SIGN … SEPARATE,则占据数据项大小中的一个字符位。
S只能是picture字符串最左边的一个字符。
V:指定假定小数点的位置,不计入数据项大小。当小数点位于picture字符串最右边时,V是多余的。
V只能在给定的picture字符串中出现一次。
X:容纳计算机英数字符集中任意一个被允许的字符。占据数据项大小中的一个字符位。
Z:代表一个先头数字字符位,当该位为0时,将用空格代替。占据数据项大小中的一个字符位。
9:一个数字。占据数据项大小中的一个字符位。
0:数字0。占据数据项大小中的一个字符位。
/:斜杠。占据数据项大小中的一个字符位。
,:逗号。占据数据项大小中的一个字符位。
.:一个编辑字符,代表用于对齐的小数点。另外也代表一个句号位,占据数据项大小中的一个字符位。
+、-:用于编辑项的正负号控制符。占据数据项大小中的一个字符位。
"+"表示对于正值将输出"+"表示正数,负值将输出"-"表示负数;
"-"表示对于正值将输出空表示正数,负值将输出"-"表示负数。
*:代表一个先头数字字符位,当该位为0时,将用*代替。占据数据项大小中的一个字符位。
紧跟在其中任一符号后的括号内的无符号非0整数表示该符号连续出现的个数。
REDEFINES:用不同的数据描述条目描述同一块计算机内存区域。
格式:
level-number [DATA-1/FILLER] REDEFINES DATA-2.
DATA-1及其下级项不能包含VALUE从句。DATA-2的描述项可以有REDEFINES从句,不可以有OCCURS从句,但DATA-2可以是OCCURS数据项的下级项。DATA-1和DATA-2必须具有相同级别,但层号不必相同,且不能是66或88。DATA-1的长度可以比DATA-2的长度大,这不会改变DATA-2的长度。
如果 A REDEFINES B. 则 MOVE A TO B 和 MOVE B TO A 的结果可能是未定义的。
SIGN:为带符号数字项指定运算符的位置和表现形式。
格式:
[SIGN [IS]] LEADING/TRAILING [SEPARATE [CHARACTER]].
该从句只能用于一个用语为DISPLAY或NATIONAL且其picture字符串中包含S的基本数字数据项,或者至少包含一个此类数据项的组数据项。当用于后者时,SIGN从句只作用于组中包含的如前者的数据项,其它数据项将不受此从句影响。USAGE NATIONAL必须包含SEPARATE短语。
SYNCHRONIZED:指定基本数据项在内存的自然边界上的对齐方式。可用于基本数据项和01层组数据项。
格式:
SYNCHRONIZED/SYNC [LEFT/RIGHT].
USAGE:指定数据在内存中的表示格式。可用于除66和88外的任意层次的数据描述条目。组数据项的USAGE将作用于组内每一个基本数据项。当USAGE没有被显式地指定时,将默认为如下的USAGE:
DISPLAY:当PICTURE从句只包含G、N以外的符号。
NATIONAL:当PICTURE从句只包含一个或多个N,并且编译器选项NSYMBOL(NATIONAL)有效。
DISPLAY-1:当PICTURE从句只包含一个或多个N,并且编译器选项NSYMBOL(DBCS)有效。
计算项(computational items)用于算术运算,必须是数字型。其最大长度为18位数,除了PACKED-DECIMAL项外。如果编译器选项ARITH(COMPAT)有效,PACKED-DECIMAL的最大长度为18位数;如果ARITH(EXTEND)有效,则PACKED-DECIMAL的最大长度为31位数。其PICTURE字符串只能包含:9、S、V、P。COMP-1和COMP-2不能有PICTURE字符串。计算项包括以下用语(COMP是COMPUTATIONAL的缩写,二者等价):
BINARY:二进制数据项。负数用其绝对值的2的补码表示。所占内存取决于其PICTURE从句中定义的十进制数的个数。
位数: 内存:
1~4 2个字节
5~9 4个字节
10~18 8个字节
二进制数是big-endian的,运算符包含在最左边的位上。
PACKED-DECIMAL:内部十进制数据项。PICTURE字符串中每2个十进制数占用一个字节的内存,除了最右边的字节只包含1个十进制数及符号。
COMP:等价于BINARY。
COMP-1:内部浮点数据项(单精度)。4字节长。
COMP-2:内部浮点数据项(双精度)。8字节长。
COMP-3:等价于PACKED-DECIMAL。
COMP-4:等价于BINARY。
COMP-5:本地二进制数据项。其取值范围可达到本地二进制表示所能容纳的范围,而不受限于PICTURE字符串中9的个数所指的值。
PIC: 内存: 取值范围:
S9(01)~S9(04) 2个字节 2^(-15)~2^15-1
S9(05)~S9(09) 4个字节 2^(-31)~2^31-1
S9(10)~S9(18) 8个字节 2^(-63)~2^63-1
9(01)~9(04) 2个字节 0~2^16-1
9(05)~9(09) 4个字节 0~2^32-1
9(10)~9(18) 8个字节 0~2^64-1
//标识部
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. PGMNAME. //指定本程序名。此段是必须的,并且必须排在标识部的最前头。
//环境部
000003 ENVIRONMENT DIVISION.
//配置节
000004 CONFIGURATION SECTION.
000005 SOURCE-COMPUTER. IBM-PC WITH DEBUGGING MODE. //WITH从句指定启用调试代码。
000006 OBJECT-COMPUTER. IBM-PC.
000007 SPECIAL-NAMES.
000008 CURRENCY-SIGN IS $. //指定货币符号为"$"。
000009 DECIMAL-POINT IS COMMA. //在PIC字符串或数字字面值中交换逗号","和小数点"."的功能。
//输入输出节
000010 INPUT-OUTPUT SECTION.
000011 FILE-CONTROL. //命名程序所用文件,并将其与外部文件相关联。
000012 SELECT INPUT-FILE ASSIGN TO "IN.DAT".
//数据部
000013 DATA DIVISION.
//文件节
000014 FILE SECTION. //定义数据文件的结构。
000015 FD INPUT-FILE. //File Description.后面的文件名必须与前面SELECT语句中的一致。
000016 01 INPUT-RECORD-1 PIC X(100). //描述文件属性及与其关联的数据记录(可以是多个)。
000017 01 INPUT-RECORD-2 //同一存储区域的另一种定义。重定义INPUT-RECORD-1。
000018 03 ITEM-1 PIC X(20).
000019 03 ITEM-2 PIC X(80).
//工作存储节,描述程序处理过程中所涉及的不属于文件的数据记录。
//此存储区在运行单元开始时被分配,在运行单元结束时被销毁,在此过程中将保持其最后使用值。
000020 WORKING-STORAGE SECTION.
000021 01 WORK-FIELD PIC X(20).
//连接节,用于被调用程序,描述从调用程序传递过来的数据。
000022 LINKAGE SECTION.
000023 01 LNK-FIELD PIC X(10).
//过程部,被调用程序可以包含USING从句用于接收调用程序传递的参数数据,主调程序不需要。
//BY REFERENCE是默认值,可以省略。
000024 PROCEDURE DIVISION USING BY REFERENCE LNK-FIELD.
//过程部处理逻辑的细分。
000025 PGMNAME-START SECTION.
000026 PERFORM P-PROC-1-RTN.
000027 PERFORM P-PROC-2-RTN.
000028 EXIT PROGRAM. //返回调用程序(同GOBACK)。
000029 P-PROC-1-RTN SECTION.
000030 P-PROC-1.
000031 DISPLAY "first program:".
000032 P-PROC-1-EXT.
000033 EXIT.
//相当于CONTINUE,其后的任何语句都会被执行。
000034 P-PROC-2-RTN SECTION.
000035 P-PROC-2.
000036 DISPLAY "HELLO, WORLD!".
000037 P-PROC-2-EXT.
000038 EXIT.
実際に処理を行う手続き節(SECTION)を記述します。
一つの「xxSECTION」から「EXIT」までが一つの節になります。
过程部是COBOL程序的最后一个部分。程序的主体:程序的逻辑运算在此操作。
包含程序运行时要执行的所有语句,对数据操作的程序逻辑。
1.每个程序分为四大节(模块),
• 前处理(初始化变量,设定初始值等)
• 主处理(程序业务处理部分)
• 后处理(程序正常结束时的出口)
• 错误处理(程序异常结束时的出口)
2.对于子程序,PROCEDURE DIVISION 后应列出LINK节中定义的参数。
如: PROCEDURE DIVISION USING LINK-INPUT-DATA LINK-OUTPUT-DATA.
3.程序结束。
• 主程序 STOP RUN.
• 子程序 GO BACK.
过程部的组件包括语句、句子、段和节。
(1) 语句(statement):以动词开头的单词、直接数和分隔符的组合。语句应一律从B区(12列开始)开始写,续行也应从B区开始。
(2) 句子(sentence):以英文句号(.)结尾的一系列语句。
(3) 段(paragraph):由段名、句号分隔符和零或几条句子组成。段的最后一条语句要用英文句号结束。
(4) 节(section):由节标题加上保留字SECTION和分隔符句号。
注:段名应在节中保持唯一性、节名应在程序中保持唯一性。段名不能与节名重复。引用段名时可以用所属的节限定如下:GO TO PARA-1 IN SECTION-22.
过程部的部头格式为:
PROCEDURE DIVISION [USING [[BY] REFERENCE/VALUE] DATA-1…] [RETURNING DATA-2].
USING短语用于子程序,指定程序被调用时所接收的参数。DATA-1…必须是LINKAGE SECTION中定义为01层或77层的数据项,但在调用程序的CALL语句的USING短语中指定的数据项可以是其数据部中定义的任意层的数据项。DATA-1…的数据描述项中可以包含REDEFINES从句。可以从非COBOL程序CALL COBOL程序,或者从系统命令向COBOL主程序传递用户参数。调用程序与子程序的USING短语中的标识符是按位置而不是名字来对应的,相应的标识符必须包含相同的字节数,尽管它们的数据描述不必相同。BY REFERENCE和BY VALUE短语作用于其后的所有参数,直到出现另一个此短语。
RETURNING短语指定一个用于接收程序结果的数据项,这是一个输出参数。DATA-2必须是LINKAGE SECTION中定义为01层或77层的数据项。此短语不能用于包含ENTRY语句的程序、嵌套程序和主程序。
过程部的结束由以下之一标识:
碰到嵌套程序的标识部部头。
END PROGRAM记号。
到达程序的尾部,后面再没有任何代码行了。