内部子程序
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-A.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-B.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
END PROGRAM PROC-B.
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-C.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-D.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
END PROGRAM PROC-D.
END PROGRAM PROC-C.
END PROGRAM PROC-A.
程序A包含B,C两个子程序,其中C又包含子程序D。
A能调用B,C。C能调用D。B不能调用C,A不能调用D。
如果C声明为公用的,则B可以调用C,语法为:
PROGRAM-ID. PROC-C IS COMMON PROGRAM.
当前函数中定义的变量都只是对当前函数有效。可以用GLOBAL声明为对所有函数有效。
01 DATA-NAME IS GOLBAL ...
文件也有此声明:FD FILE-NAME IS GOLBAL ...
如果调用的不是本程序中的文件或变量,则可以用EXTERNAL声明。
FD FILE-NAME IS EXTERNAL.../01 DATA-NAME IS EXTERNAL...
CALL PROC VAR1 [ON EXCEPTION CODE1] [NOT ON EXCEPTION CODE2] END-CALL.
如果找不到PROC程序名,执行CODE1(如果有此声明),找到将参数VAR1传递给PROC,并执行。PROC返回时执行CODE2(如果有此声明)。
参数应该在文件,工作存储或连接节中定义,应为01层数据项,77层数据项或基本数据项。
子程序要返回调用程序,执行EXIT PROGRAM
传递参数有3步:
首先在调用程序的CALL语句列出要传递的参数。
CALL PROC VAR1 .
然后在被调用程序的过程部标题,使用USING短语列出相应的参数。
PROCEDURE DIVISION USING VAR1.
最后在被调用程序的连接节(LINKAGE SECTION)提供参数的存储空间。
LINKAGE SECTION.
01 VAR1 PIC XX.
参数传递有2中方式:
BY CONTENT 传递的参数值只在被调用函数中被改变,调用函数中的值不变。
BY REFERENCE. 传递的参数值在被调用函数中被改变,调用函数中的值也改变。
CALL PROC VAR1 BY CONTENT/REFERENCE.
再次调用子程序,子程序处于上次退出的状态(除了连接节中的数据),打开的文件依然打开。
可以用INITIAL声明函数被调用时处于初始状态。
PROGRAM-ID. PROC-C IS INITIAL PROGRAM.
如果不想每次执行都初始化,只在需要的时候初始化,可以用CANCEL PROC.初始化PROC程序,但不执行PROC。
cobol 知识点集锦
计息是银行的一项重要业务,包括日常代理客户收、付计算客户利息和年度计息等。目前,这些工作大多数是在IBM ES9000主机的SAFE应用系统平台上进行,该系统联机程序和联机计息程序是用IBM 370汇编语言实现的。为方便汇编语言读写,在VSAM文件存储的数据中,数据存放格式进行了特殊的定义。如日期存放采用X(3)型,01年03月15日,存入EBCD码为X‘010315’。在进行年度计息时,为了实现各种复杂的运算工作,一般采用COBOL语言来实现各种运算。而采用COBOL语言读取X(3)型数据时,读出的是字符型数据,不能直接进行运算,必须转换为COBOL数据类型的数据后才能进行相应处理。如刚才的X‘010315’,需要转换为内部十进制数据X‘0010315C’。本文介绍一种用COBOL语言实现字符型X(3)与内部十进制数据相互转换的方法。 |
由于日期数据总是大于零,在COBOL语言的工作单元节定义变量DATE-FIRST后,再追加定义COBOL语言的最小数据单元X‘000C’,即十进制12。由于重定义DATE-CASE为DATE-CHANGE后,DATE-CHANGE是原日期数据的1000倍,于是要在过程部将DATE-CHANGE除以1000。 |
首先,在COBOL程序WORKING-STORAGE SECTION. 中定义如下内容: |
02 DATE-SIGN PIC 9(4) COMP VALUE 12.;定点二进制数 |
01 DATE-CHANGE REDEFINES DATE-CASE PIC 9(9) COMP-3. ;内部十进制数据 |
01 DATE-HEX PIC X(3). ; 转换前数据 |
01 DATE-DEC PIC S9(7)COMP-3 . ; 转换后数据 |
然后,在过程部PROCEDURE DEVISION.中加入如下语句: |
MOVE DATE-HEX TO DATE-FIRST . |
COMPUTE DATE-CHANGE = DATE- |
MOVE DATE-CHANGE TO DATE-DEC. |
在进行相反的转换时,要消除因COBOL语言数据类型标志“C”引起的原日期数据前多加的一个0,所以需要将转换数据乘以10,再取出前6位数据即可。 |
首先,在COBOL程序WORKING-STORAGE SECTION. 中定义如下内容: |
01 WORK-DATE PIC S9(7) COMP-3. |
01 AA REDEFINES WORK-DATE. |
01 DATE-HEX PIC X(3). ;转换后数据 |
01 DATE-DEC PIC S9(7) COMP-3. |
然后,在过程部PROCEDURE DEVISION.中加入如下语句即可: |
MOVE DATE-DEC TO WORK-DATE。 |
COMPUTE WORK-DATE=WORK-DATE*10. |
转载自原文链接, 如需删除请联系管理员。
原文链接:COBOL 知识点集锦(下),转载请注明来源!