- IBM主机技术一本通
- 吕新民编著
- 7851字
- 2020-08-26 22:17:25
5.11 数据描述和数据传送(Move)语句
不像其他的程序设计语言,COBOL不支持用户定义的常数。COBOL程序中有下列3种基本数据类型。
● 变量(Variables)。
变量是命名了的内存区域,程序既可以将数据存储进去,也可以从它那里检索数据。程序通过数据名访问变量占据的内存区域。变量必须说明它的类型和长度。COBOL程序中的每个变量必须描述在数据部(Data Division)中。
● 常量(Literals)。
COBOL常量包括字符常量和数字常量两种。字符常量是由引号(‘’)括起来的字母数字字符,比如:‘Newman Lv’、‘-123’和‘123.45’等。数字常量只可以包含数字、小数点、加号(+)和减号(-),且不能用引号括起来,比如,123、123.45、-256和+2987等。
● 表意常数(Figurative Constants)。
COBOL有它自己的特殊常数,称为表意常数。其中:
✧ SPACE或SPACES= 空格。
✧ ZERO或ZEROS或ZEROES = 0。
✧ QUOTE或QUOTES=引号(‘)。
✧ HIGH-VALUE或HIGH-VALUES= 最大值(Max Value),即十六进制数的X'FF'。
✧ LOW-VALUE或LOW-VALUES =最小值(Min Value),即十六进制数的X'00'。
✧ ALL常数 = 表示常数的值出现一次或多次。
下面是表意常数的例子。
● 例子1:
01 IntRate PIC 9(5)V99 VALUE 13.5. MOVE ZEROS TO GrossPay. 这时,IntRate中的内容变成了零。
● 例子2:
01 EmployeeName PIC X(10) VALUE "NEWMAN". MOVE ALL "-" TO EmployeeName. 这时,EmployeeName中的内容变成了‘----------’。
5.11.1 COBOL数据类型及模式(Picture)短语
COBOL不是那种数据类别分得很清楚的程序语言,有时,COBOL语言中的数据类别之间的界限是模糊的。就目前来说,我们只集中介绍两种数据类别。
● 数字(Numeric)。
● 文本或字符串。
数据类别决定了它所能进行的运算。与其他程序语言比较起来,COBOL的数据类型不是特别严密的。比如,某些COBOL数值类型的变量,经过一段时间变迁后会变成非数字的!
而在类别分明的程序设计语言中,你只要简单地指定数据类型,系统就会提供大量的信息给你。数据类型通常决定了变量的取值范围,比如,对于CARDINAL类型的项目,能存放的数值为0到65535,而INTEGER类型的取值范围为-32,768 到32767。根据数据类型,编译器就知道分配多少内存空间去存放它的值。
COBOL不是一种数据类别分明的语言,它采用了另外一种描述数据特性的方法。我们可以把COBOL描述数据类型的方法描述为“用例子说明”的策略。程序员在程序中为系统提供一些例子或模板(Picture)告诉系统数据项是什么样的。通过模板(Picture),系统推理数据项的必要信息并据此为它分配内存。
为了建立一个模板,程序员要使用一组符号。下面这些符号会经常在Picture短语中使用。
● 9(数字9)用来说明在模板(Picture)短语中数字出现的次数和对应的位置。
● X(字符X)用来说明字符集中的字符在模板(Picture)短语中出现的次数和对应的位置。
● V(字符V)用来说明数字变量中小数点的位置。它常常被称为“假定的小数点位置”字符。
● S(字符S)表示有符号数,它只出现在模板(Picture)短语中的最前面。
下面是一些例子。
● PICTURE 999:3个数字的整数。
● PICTURE S999:3个数字的带符号的整数。
● PICTURE XXXX:4个字符的字符串。
● PICTURE 99V99:从0到99.99的数字。
● PICTURE S9V9:取值范围从-9.9到9.9的数字。
如果你愿意,PICTURE可以简写为PIC。数字值最多可以有18个数字,即最多有18个9。字符串的限制则取决于系统定义。重复的符号可以在圆括号中指定重复的次数。下面是一些例子。
● PIC 9(6)等于PICTURE 999999。
● PIC 9(6)V99等于PIC 999999V99。
● PICTURE X(10)等于PIC XXXXXXXXXX。
● PIC S9(4)V9(4)等于PIC S9999V9999。
● PIC 9(18)等于PIC 999999999999999999。
在COBOL中,变量的说明由4部分组成。
● 级别号(Level Number)。
● 数据名或标识符。
● PICTURE短语。
● USAGE短语。
5.11.2 级别号表达数据的层次
在COBOL语言中,你可以使用级别号(Level Number)将一个复杂的数据结构分解成一个个有意义的组件。在这种层次结构中,级别号越大,数据项的层次越低。在最低层的数据是基本项。级别号通常从01到49,但程序中还有特殊的级别号即66、77和88。
在一个层次数据描述中,重要的是级别号之间的相互关系,而不是具体使用的级别号是多少。在图5.3所示的雇员信息记录描述中,左右两边是完全等价的。
图5.3 等价的雇员信息记录描述
5.11.3 特殊级别号数据项
在COBOL语言中,级别号为66、77和88的是特别级别号,它们的含义分别为:
● 66级:带有一个RENAMES短语,用来对之前已经定义的数据项重新组合。66级变量不能重命名另外一个66级变量,也不能对01、77和88级变量重命名。66级数据项必须紧跟在它所要重命名的记录格式的最后一个数据项后面。
● 77级:定义一个不能进一步分解的基本数据项。数据项的名字必须在整个程序中是唯一的。
● 88级:总是与VALUE短语一起使用,用来定义条件名,其值只能是真(True)或假(False)。88级条件名可以与一个或多个值相关,即可以有多个值使其只为真。88级条件名既可以用来描述基本数据项,也可以用来描述组合数据项。下面是88级条件名定义的语法。
下面是一些特别级别号的例子。在这个例子中,GRADE-A到GRADE-O定义了4个88级条件名,它们的值(真或假)是与变量STUDENT-TYPE相关的,比如GRADE只有在STUDENT-TYPE为‘A’时其值才会为真(True),其他都为假。而条件名GRADE-O则有两个值可以令其为真,即当STUDENT-TYPE的值为‘D’或’O’时,它的值都会为真。
GEOGRAPHIC是一个66级的重命名数据项,它将从STUDENT-CITY到STUDENT-ZIP之间的3个数据项重新命名为GEOGRAPHIC。WS-TOTAL则是一个独立的基本数据项。
01 STUDENT-RECORD. 05 STUDENT-TYPE PIC X. 88 GRADE-A VALUE 'A'. 88 GRADE-B VALUE 'B'. 88 GRADE-C VALUE 'C'. 88 GRADE-O VALUE ‘D’ OR 'O'. 05 STUDENT-NAME PIC X(30). 05 STUDENT-ADDRESS PIC X(60). 10 STUDENT-STREET PIC X(15). 10 STUDENT-CITY PIC X(15). 10 STUDENT-STATE PIC X(2). 10 STUDENT-ZIP PIC 9(5). 66 GEOGRAPHIC RENAMES STUDENT-CITY THRU STUDENT-ZIP. ••• 77 WS-TOTAL PIC S9(11)V99 COMP-3.
5.11.4 组合项和基本项
在COBOL语言中,组合项(Group Item)用来描述可以进一步分解的数据项。
● 组合项的说明由级别号和数据名组成,但不能有模式(Picture)短语。
● 当组合项出现在数据描述的最高层时,我们称之为记录(Record)并使用级别号01。
基本项(Elementary Item)用来描述不可以分解的数据项,它是原子的(Atomic),即不可以进一步分解。基本项的描述由下列几部分组成。
● 级别号。
● 数据名。
● 模式(Picture)短语。
● 用法(Usage)短语。
基本项必须有模式(Picture)短语。无论是基本项或组合项,都必须以句号(.)结束。组合项数据不用指定模式短语,因为组合项的大小是它属下的基本项大小之和,而其类型则总是假定为PIC X。之所以将组合项的类型假定为PIC X的理由是,组合项是由多个不同的数据项组成的,而X类型是唯一支持这种组合的描述。下面是组合项的例子。
WORKING-STORAGE SECTION. 01 EmployeeDetails PIC X(26). WORKING-STORAGE SECTION. 01 EmployeeDetails. 02 EmployeeName PIC X(10). 02 EmployeeId PIC 9(7). 02 EmployeeCode PIC X(4). 02 Grant PIC 9(4). 02 Gender PIC X. WORKING-STORAGE SECTION. 01 EmployeeDetails. 02 EmployeeName. 03 Surname PIC X(8). 03 Initials PIC XX. 02 EmployeeId PIC 9(7). 02 EmployeeCode PIC X(4). 02 Grant PIC 9(4). 02 Gender PIC X.
我们可以通过VALUE短语给变量赋初值,它是PICTURE短语的扩充。下面是VALUE短语的例子。
DATA DIVISION. WORKING-STORAGE SECTION. 01 Num1 PIC 999 VALUE ZEROS. 01 VatRate PIC V99 VALUE .18. 01 EmployeeName PIC X(10) VALUE SPACES.
5.11.5 数据用法(USAGE)短语
下面是数据用法短语的语法,它也是与模式(Picture)短语一起使用的。
USAGE短语指定数据项在计算机内部的存储格式。除了66和88级外,USAGE短语可以在任何级别的数据描述项中使用。但是,如果为组合项指定USAGE短语,它就对该组合项的每个基本项都有效。基本项中指定的USAGE短语不能与其所属的组合项中指定的冲突。
USAGE短语指定数据在内存中的存储格式。如果既没在基本项,也没在组合项中指定USAGE短语,系统默认为USAGE是DISPLAY。USAGE的取值可以为:
● DISPLAY。
数据是以字符形式存储的,每个字符占8位(Bit),即一字节(Byte)。
● BINARY或COMPUTATIONAL或COMP。
PICTURE为BINARY或COMP的变量,只能存储数字,其有效的PICTURE字符串只能包含字符9、S、V和P。数据是以二进制数形式,即半字(Halfword)、全字(Fullword)等形式存储的。当是有符号数时,负数是以绝对数的2的补码形式表示的。半字(Halfword)占2字节,可以存储1到4个数字;全字(Fullword)占4字节,可以存储5到9个数字。双字(Doubleword)占8字节用来存储10到18个数字。
表5.2列出了二进制数的数字个数与需要的存储空间的关系。
表5.2 二进制数的数字个数与需要的存储空间的关系
下面的例子需要占据1个全字(4字节)。
01 TotalCount PIC 9(7) USAGE IS COMP.
● PACKED-DECIMAL或COMP-3。
数据在计算机内部是以压缩十进制数(Packed Decimal)的形式存储的,即每个字节放2个数字,但最右边的字节内只放一个数字加符号字段。
对于定义为DATE格式的短语,其USAGE只能是DISPLAY和COMP-3(或与其等价的COMPUTATIONAL-3和PACKED-DECIMAL)。PICTURE为COMP-3或PACKED-DECIMAL的变量只能存储数字,其有效的PICTURE字符串只能包含字符9、S、V和P。
● INDEX。
INDEX用来说明优化的表下标。当表作为SEARCH语句的检索对象时,必须有一个对应的索引项目与其匹配。说明为INDEX类型的数据项不能使用PICTURE短语。
使用USAGE IS INDEX说明的数据项只能出现在:
✧ SEARCH或SET语句中。
✧ 关系条件(Relation Condition)中。
✧ PROCEDURE DIVISION的USING短语中。
✧ CALL语句的USING短语中。
下面是一个说明INDEX数据类型的例子。
01 IdxItem USAGE IS INDEX.
表5.3列出了一些PICTURE和USAGE的例子,请注意它们在内存中的存储格式。
表5.3 COBOL中PICTURE和USAGE的例子
5.11.6 数字编辑(EDITED)格式
数字编辑格式短语用来将内部格式的数字格式化后,供用户查询或编写报表时使用。为了对输出数据做格式化,COBOL在普通的格式符号(9、X、A、V和S)的基础上增加了一些新的编辑符。
编辑表示要对原来的数据做一些变化,并要增加一些分隔符到数据中,以加强数据的可读性。编辑型的数据不能用在算术表达式中做运算,但可以用来存放运算后的结果,比如可以出现在GIVING短语中。
COBOL提供的基本编辑类型有:
● 插入编辑(Insertion Editing):在源数据中插入(增加)一些符号,包括以下几种。
✧ 简单插入(Simple Insertion),可插入的符号有逗号(,)、空格(B)、零(0)和斜杠(/)。
✧ 特殊插入(Special Insertion),可插入的符号为句号小数点(.)。
✧ 固定插入(Fixed Insertion),可插入的符号为正号(+)、负号(-)、货币符号($)或贷方(CR)和借方(DB)等。
✧ 浮动插入(Floating Insertion),可插入的符号为正号(+)、负号(-)和货币符号($)。
● 抑制和置换编辑(Suppression and Replacement Editing):抑制或置换数据中的零,包括以下几种。
✧ 不显示零,而是用空格置换零,编辑符号为字符Z。
✧ 不显示零,而是用星号置换零,编辑符号为星号(*)。
表5.4列出了各种编辑格式的输出结果一览表。
表5.4 各种编辑格式的输出结果一览表
5.11.7 数据传送(MOVE)语句
MOVE语句将数据从一个地方(源数据)传送到另一个地方(目的数据)。源数据既可以是变量,也可以是常数,但目的数据必须是变量。下面是MOVE语句的语法格式:
格式1:
源数据变量和目标数据变量都可以是基本项或组合项。当目的数据项是字符型(PIC X)时,源数据从左到右复制到目的数据中。当源数据不够长时,在目的数据的右边填空格;当源数据长度超过目的数据时,数据从右边截断。
当数据MOVE到目的数据字段中时,该字段的内容会被完全覆盖掉。如果源数据太短,不够填满目的数据,目的数据的剩余部分会用零或空格填满。MOVE语句将内存中一块区域的内容传送到另外一块区域中。定义为索引(Index)的数据项不能在MOVE语句中指定。
当目的数据项为数字或编辑数字型时,数据是按照小数点的位置对齐的。如果源数据不够长时,在目的数据的左边填零;如果源数据长度超过目的数据,整数位的高位数据或小数位的低位数据就会被截断。当源数据或目的数据没有明确指定小数点的位置时,系统默认小数点紧跟在数据项的最右边的字符后面,即全部是整数。
除了在源数据和目的数据之间传送整个字段外,你也可以只传送字段中的某一段数据。你可以通过指定字段的起始(最左边)位置和传送的长度来指定要传送的一部分数据。这时,MOVE语句的格式如下:
格式3:
MOVE Data-name(Begin:[Length])TO Data-name2
其中,Begin指定开始位置,1表示字段的最左边字符;Length指定传送的长度。长度(Length)字段不是必需的,如果省略,表示从开始位置到最右边的字符都要传送。Data-name必须定义为USAGE是DISPLAY的。
你也可以将一个组合项传送到另一个组合项中。这时,编译器将它们当成组合项传送来执行。换句话说,传送时不考虑源数据组合项和目的数据组合项中基本项数据的数据类型,也不在数据之间做任何转换。这时,程序员必须保证发送和接收组合项之间的基本数据项之间是兼容的。运行时,即使发生破坏性的数据重叠情况,这种传送(Move)也会照样进行。
你可以通过使用格式2的MOVE语句中的CORRESPONDING(可以缩写为CORR)短语从一个组合项传送到另外一个组合项中。这时,系统就会将源数据组合项中与目的数据组合项中同名的基本数据项传送到目的组合项数据的对应字段中。在传送过程中,对于基本项的数据转换规则适用于每个基本项的传送。请注意,在发送端和接收端只要基本项的名字相同就会发生传送,并不需要基本项的级别号相同。
5.11.8 程序例子(MOVE语句)
我们一向认为,学习程序语言的最好方法就是多写一些程序,尤其是当你新学习一种语言,又对很多语言元素理解模糊的时候,通过写程序、运行程序来确定语法元素的真正含义,就是一个非常有效的学习方法。下面的程序对MOVE语句的各种情形做了模拟,让你可以清楚了解系统是如何处理你写的MOVE语句的。现在,我们对下面的完整程序例子做一下简单的说明。
第89行和第90行的程序,输出我们要的演示报表(Magic Report)的标题,对应于接下来的每行输出的一个提示。在接下来的每行中,我们会给出该行输出的注解(Comment),接下来的4列分别为MOVE语句的源数据和目的数据的格式(PIC)和实际值,最后一列是警告信息,提示你这一行的MOVE语句的用法可能会导致结果错误,比如,数据截断等,当你看到该列不为空白时,就要仔细研究一下了。对于我们后面介绍的COBOL语言元素,我们都会采用类似的演示报表的方式讲解,因为,实在想不出比这更有效的方法了。
第92行到第97行的第1组MOVE语句,将字符串‘SZ AMAZING!’从一个变量传送到另一个变量中,两边数据类型完全一样,所以没有任何问题,这从演示报表的第3行可以看出来。
第100行到第105行的MOVE语句,将短的字符串传送到长的字符串中,也没有什么问题,但你要明白,接收端的整个字段的值都变了,因为系统会将不够长的部分全部由空格填充。第108行到第113行的MOVE语句出现警告信息了,因为发送端的数据超过接收端的数据定义,这时,字符串右边多余的字符(这里是最后的*号)就丢掉了。第5行的报表反映了这一点。
接下来的几组MOVE语句是传送数字用的,它与字符串传送最大的不同是对齐方式,字符串总是右对齐的,而数字型字段则是小数点对齐的。第117行到第122行的MOVE语句将COBOL文字常数Zeros(零)传送到接收端字段中,因为零也是数字,传送的结果就是大家都清零了。第125行到第130行的一组MOVE语句将接收端和发送端格式完全相同的数据进行传送,当然是成功的。这在报表的第7行中得到了证实。
第133行到第139行的一组语句,试图将带有3位小数点的数据传送到只有2位小数点的接收字段中,当然要出错了,结果是发送端小数点后的第3位丢掉了。报表的第8行清楚说明了这一点。第142行到第148行的MOVE语句遇到的问题与上面的相似,只是这次丢掉的是整数位的最高位,损失惨重呀,一条语句就损失一个亿(100000000),典型的丢了西瓜捡了芝麻,大头(1个亿)传送过程中丢掉了,剩下的只是零头,对此我们在第9行的报表中亮出了红牌(警告信息)。
程序的第152行到第175行是简单插入的例子,对应报表的第10行到第12行,我们可以使用简单插入符号,在数字中插入逗号(,)和星号(*)等。
程序的第177行到第191行是特殊插入的例子,结果显示在报表的第13行和第14行,我们可以在数据的规定位置插入小数点(.),即使是编辑输出也要注意发送字段和接收字段之间的数据描述的一致性,避免出现报表第14行的小数点后面的数字丢失的情况。
程序的第194行到第208行是固定插入的例子,对应于报表的第15行和第16行,借助于固定插入方式,我们可以在数字中的固定位置插入正号(+)、负号(-)、贷方(CR)和借方(DB)等字符。
程序的第211行到第225行是浮动插入的例子,所谓浮动即是编辑符号($、+等)总是跟着数字浮动。换句话说,它们总是紧靠着最前面的有效数据。这块程序的运行结果对应于报表的第17行和第18行。第18行的报表再次出现小数点后面数字丢失的情况,要当心哦,在银行里,丢掉的就是钱呀。
程序的第228行到第243行是抑制前导零的例子,对应于报表的第19行和第20行,这种编辑方式是银行报表中经常要使用的,必须学会它们。
第245行到第251行的MOVE语句具有其他程序设计语言类似字符串子串操作的功能,你可以指定传送字符串的某一段(指定开始位置和长度),在我们的例子中,我们用它来将长度为35 位(WS-EMP-NAME)的字段分成了姓(WS-LAST-NAME)和名字(WS-FIRST-NAME)两部分。第21 行的报表显示了正确的结果。
第253行到第257行的代码演示了带有CORR选项的MOVE语句的语法,它可以用于一次在两组记录格式之间传送多个名字相同的数据字段,这在报表打印中经常用到。从报表的最后一行可以看到,一条带有CORR选项的MOVE语句正确无误地传送了3字段(ACCOUNT、ACCT-NAME和AMOUNT)。
最后请留意第250行、第255行和第256行的连字符(-),它用来告诉系统这是继续行,是上一行的继续,继续行的内容必须从程序的区域B(AREA B)开始写。
000001 IDENTIFICATION DIVISION. 000002 * 000003 PROGRAM-ID. MOVE1. 000004 AUTHOR. NEWMAN LV. 000005 * 000006 ENVIRONMENT DIVISION. 000007 * 000008 INPUT-OUTPUT SECTION. 000009 * 000010 DATA DIVISION. 000011 * 000012 000013 FILE SECTION. 000014 * 000015 WORKING-STORAGE SECTION. 000016 * 000017 01 RPT-HEADING. 000018 03 FILLER PIC X(20) VALUE SPACES. 000019 03 RPT-HEAD-MOVE PIC X(25) VALUE '*MAGIC REPORT(MOVE)*'. 000020 03 FILLER PIC X(27) VALUE SPACES. 000021 01 RPT-SUB-HEADING. 000022 03 FILLER PIC X(10) VALUE '*COMMENTS*'. 000023 03 FILLER PIC X(01) VALUE SPACE. 000024 03 FILLER PIC X(10) VALUE 'SOURCE PIC'. 000025 03 FILLER PIC X(01) VALUE SPACE. 000026 03 FILLER PIC X(11) VALUE 'SOURCE DATA'. 000027 03 FILLER PIC X(01) VALUE SPACE. 000028 03 FILLER PIC X(10) VALUE ' DEST. PIC'. 000029 03 FILLER PIC X(01) VALUE SPACE. 000030 03 FILLER PIC X(11) VALUE 'DEST. DATA'. 000031 03 FILLER PIC X(01) VALUE SPACE. 000032 03 FILLER PIC X(16) VALUE '*** WARNING ***'. 000033 01 RPT-DETAIL. 000034 03 WS-COMMENTS PIC X(10). 000035 03 FILLER PIC X(01) VALUE SPACE. 000036 03 WS-S-PIC PIC X(10). 000037 03 FILLER PIC X(01) VALUE SPACE. 000038 03 WS-S-DATA PIC X(12). 000039 03 WS-S-DATA-NUM REDEFINES WS-S-DATA PIC 9(08).99-. 000040 03 FILLER PIC X(01) VALUE SPACE. 000041 03 WS-D-PIC PIC X(12). 000042 03 FILLER PIC X(01) VALUE SPACE. 000043 03 WS-D-DATA PIC X(11). 000044 03 WS-D-DATA-NUM REDEFINES WS-D-DATA PIC 9(08).99. 000045 03 WS-D-DATA-ED1 REDEFINES WS-D-DATA PIC 999,999,999. 000046 03 WS-D-DATA-ED2 REDEFINES WS-D-DATA PIC ZZZ,ZZZ,ZZZ. 000047 03 WS-D-DATA-ED3 REDEFINES WS-D-DATA PIC ***,***,***. 000048 03 WS-D-DATA-ED4 REDEFINES WS-D-DATA PIC 9999,999.99. 000049 03 WS-D-DATA-ED5 REDEFINES WS-D-DATA PIC 9,999,999.9. 000050 03 WS-D-DATA-ED6 REDEFINES WS-D-DATA PIC 9999999.99-. 000051 03 WS-D-DATA-ED7 REDEFINES WS-D-DATA PIC 999999.99DB. 000052 03 WS-D-DATA-ED8 REDEFINES WS-D-DATA PIC $$$$,999.99. 000053 03 WS-D-DATA-ED9 REDEFINES WS-D-DATA PIC +++++++++99. 000054 03 WS-D-DATA-ED10 REDEFINES WS-D-DATA PIC ZZZZ,ZZZ.99. 000055 03 WS-D-DATA-ED11 REDEFINES WS-D-DATA PIC ZZZ,ZZZ.99-. 000056 03 FILLER PIC X(01) VALUE SPACE. 000057 03 WS-WARNING PIC X(14). 000058 01 WS-ITEMS. 000059 03 WS-SOURCE-STRING PIC X(11) VALUE 'SZ AMAZING!'. 000060 03 WS-DEST-STRING1 PIC X(11). 000061 03 WS-DEST-STRING2 PIC X(11). 000062 03 WS-DEST-STRING3 PIC X(11). 000063 03 WS-SOURCE-NUM PIC 9(8)V99 VALUE 12345.67. 000064 03 WS-SOURCE-NUM1 PIC 9(9)V99 VALUE 123456789.01. 000065 03 WS-SOURCE-NUM2 PIC 9(8)V999 VALUE 12345.678. 000066 03 WS-SOURCE-NUM-D PIC 9(9).99. 000067 03 WS-SOURCE-NUM-D2 PIC 9(8).999. 000068 03 WS-DEST-NUM1 PIC 9(8).99. 000069 03 WS-DEST-NUM2 PIC 9(8).9. 000070 03 WS-DEST-NUM3 PIC 9(4).99. 000071 03 WS-EMP-NAME PIC X(35) VALUE '1STNAME!!!LASTNAME!!!'. 000072 03 WS-NAME-LEN PIC 9(04) USAGE IS BINARY. 000073 03 WS-FIRST-NAME PIC X(10). 000074 03 WS-LAST-NAME PIC X(25). 000075 01 DETAIL-LINE. 000076 03 FILLER PIC X(01) VALUE SPACES. 000077 03 ACCOUNT PIC 9(09). 000078 03 FILLER PIC X(01) VALUE SPACES. 000079 03 ACCT-NAME PIC X(11). 000080 03 FILLER PIC X(01) VALUE SPACES. 000081 03 AMOUNT PIC ZZ,ZZZ,ZZZ.99. 000082 01 DATA-RECORD. 000083 03 ACCOUNT PIC 9(09) VALUE 123456789. 000084 03 ACCT-NAME PIC X(11) VALUE 'NEWMAN BANK'. 000085 03 AMOUNT PIC 9(8)V99 VALUE 168.98. 000086 * 000087 PROCEDURE DIVISION. 000088 * SHOW HEADING AND SUBHEADING 000089 DISPLAY RPT-HEADING 000090 DISPLAY RPT-SUB-HEADING 000091 * MOVE CHAR STRING 000092 MOVE WS-SOURCE-STRING TO WS-S-DATA 000093 WS-D-DATA 000094 MOVE 'PIC X(11)' TO WS-S-PIC 000095 WS-D-PIC 000096 MOVE 'NORMAL' TO WS-COMMENTS 000097 MOVE SPACES TO WS-WARNING 000098 DISPLAY RPT-DETAIL 000099 . 000100 MOVE 'NEWMAN' TO WS-S-DATA 000101 WS-D-DATA 000102 MOVE 'PIC X(06)' TO WS-S-PIC 000103 MOVE 'PIC X(11)' TO WS-D-PIC 000104 MOVE 'S-SHORTER' TO WS-COMMENTS 000105 MOVE 'FILL BLANK' TO WS-WARNING 000106 DISPLAY RPT-DETAIL 000107 . 000108 MOVE 'SZ AMAZING!*' TO WS-S-DATA 000109 WS-D-DATA 000110 MOVE 'PIC X(12)' TO WS-S-PIC 000111 MOVE 'PIC X(11)' TO WS-D-PIC 000112 MOVE 'S-LONGER ' TO WS-COMMENTS 000113 MOVE 'TRUNCATED!' TO WS-WARNING 000114 DISPLAY RPT-DETAIL 000115 . 000116 * MOVE NUMBERS 000117 MOVE ZEROS TO WS-S-DATA-NUM 000118 WS-D-DATA-NUM 000119 MOVE 'ZEROS ' TO WS-S-PIC 000120 MOVE 'PIC9(8).99' TO WS-D-PIC 000121 MOVE 'NORMAL' TO WS-COMMENTS 000122 MOVE SPACES TO WS-WARNING 000123 DISPLAY RPT-DETAIL 000124 . 000125 MOVE WS-SOURCE-NUM TO WS-S-DATA-NUM 000126 WS-D-DATA-NUM 000127 MOVE 'PIC9(8).99' TO WS-S-PIC 000128 MOVE 'PIC9(8).99' TO WS-D-PIC 000129 MOVE 'NORMAL' TO WS-COMMENTS 000130 MOVE SPACES TO WS-WARNING 000131 DISPLAY RPT-DETAIL 000132 . 000133 MOVE WS-SOURCE-NUM2 TO WS-SOURCE-NUM-D2 000134 WS-D-DATA-NUM 000135 MOVE WS-SOURCE-NUM-D2 TO WS-S-DATA 000136 MOVE ' 9(8).999' TO WS-S-PIC 000137 MOVE 'PIC9(8).99' TO WS-D-PIC 000138 MOVE 'DEC LONGER' TO WS-COMMENTS 000139 MOVE 'DEC TRUNCATED' TO WS-WARNING 000140 DISPLAY RPT-DETAIL 000141 . 000142 MOVE WS-SOURCE-NUM1 TO WS-SOURCE-NUM-D 000143 WS-D-DATA-NUM 000144 MOVE WS-SOURCE-NUM-D TO WS-S-DATA 000145 MOVE ' 9(9).99' TO WS-S-PIC 000146 MOVE 'PIC9(8).99' TO WS-D-PIC 000147 MOVE 'INT LONGER' TO WS-COMMENTS 000148 MOVE 'INT TRUNCATED' TO WS-WARNING 000149 DISPLAY RPT-DETAIL 000150 . 000151 * SIMPLE INSERTION 000152 MOVE 123456 TO WS-S-DATA-NUM 000153 WS-D-DATA-ED1 000154 MOVE ' 9(8).99 ' TO WS-S-PIC 000155 MOVE '999,999,999' TO WS-D-PIC 000156 MOVE 'S INSERT' TO WS-COMMENTS 000157 MOVE SPACES TO WS-WARNING 000158 DISPLAY RPT-DETAIL 000159 . 000160 MOVE 1234 TO WS-S-DATA-NUM 000161 WS-D-DATA-ED2 000162 MOVE 'PIC 9(8) ' TO WS-S-PIC 000163 MOVE 'ZZZ,ZZZ,ZZZ' TO WS-D-PIC 000164 MOVE 'S INSERT' TO WS-COMMENTS 000165 MOVE SPACES TO WS-WARNING 000166 DISPLAY RPT-DETAIL 000167 . 000168 MOVE 1234 TO WS-S-DATA-NUM 000169 WS-D-DATA-ED3 000170 MOVE 'PIC 9(8) ' TO WS-S-PIC 000171 MOVE '***,***,***' TO WS-D-PIC 000172 MOVE 'S INSERT' TO WS-COMMENTS 000173 MOVE SPACES TO WS-WARNING 000174 DISPLAY RPT-DETAIL 000175 . 000176 * SPECIAL INSERTION 000177 MOVE 1234.56 TO WS-S-DATA-NUM 000178 WS-D-DATA-ED4 000179 MOVE '9(8).9(2)' TO WS-S-PIC 000180 MOVE '9999,999.99' TO WS-D-PIC 000181 MOVE 'SP INSET' TO WS-COMMENTS 000182 MOVE SPACES TO WS-WARNING 000183 DISPLAY RPT-DETAIL 000184 . 000185 MOVE 1234.56 TO WS-S-DATA-NUM 000186 WS-D-DATA-ED5 000187 MOVE '9(8).9(2)' TO WS-S-PIC 000188 MOVE '9,999,999.9' TO WS-D-PIC 000189 MOVE 'SP INSET' TO WS-COMMENTS 000190 MOVE 'DEC TRUNCATED' TO WS-WARNING 000191 DISPLAY RPT-DETAIL 000192 . 000193 * FIXED INSERTION 000194 MOVE 1234.56 TO WS-S-DATA-NUM 000195 WS-D-DATA-ED6 000196 MOVE '9(8).9(2)' TO WS-S-PIC 000197 MOVE '9999999.99-' TO WS-D-PIC 000198 MOVE 'FIX INSET' TO WS-COMMENTS 000199 MOVE SPACES TO WS-WARNING 000200 DISPLAY RPT-DETAIL 000201 . 000202 MOVE -1234.56 TO WS-S-DATA-NUM 000203 WS-D-DATA-ED7 000204 MOVE '9(8).9(2)' TO WS-S-PIC 000205 MOVE '999999.99DB' TO WS-D-PIC 000206 MOVE 'FIX INSET' TO WS-COMMENTS 000207 MOVE SPACES TO WS-WARNING 000208 DISPLAY RPT-DETAIL 000209 . 000210 * FLOATING INSERTION 000211 MOVE 1234.56 TO WS-S-DATA-NUM 000212 WS-D-DATA-ED8 000213 MOVE '9(8).9(2)' TO WS-S-PIC 000214 MOVE '$$$,999.99' TO WS-D-PIC 000215 MOVE 'F INSET' TO WS-COMMENTS 000216 MOVE SPACES TO WS-WARNING 000217 DISPLAY RPT-DETAIL 000218 . 000219 MOVE -1234.56 TO WS-S-DATA-NUM 000220 WS-D-DATA-ED9 000221 MOVE 'S9(8).9(2)' TO WS-S-PIC 000222 MOVE '+++++++++99' TO WS-D-PIC 000223 MOVE 'F INSET' TO WS-COMMENTS 000224 MOVE 'DEC TRUNCATED' TO WS-WARNING 000225 DISPLAY RPT-DETAIL 000226 . 000227 * SUPPRESSION AND REPLACEMENT 000228 MOVE 00001234.56 TO WS-S-DATA-NUM 000229 WS-D-DATA-ED10 000230 MOVE '9(8).9(2)' TO WS-S-PIC 000231 MOVE 'ZZZZ,ZZZ.99' TO WS-D-PIC 000232 MOVE 'S & R ' TO WS-COMMENTS 000233 MOVE SPACES TO WS-WARNING 000234 DISPLAY RPT-DETAIL 000235 . 000236 MOVE -1234.56 TO WS-S-DATA-NUM 000237 WS-D-DATA-ED11 000238 MOVE 'S9(8).9(2)' TO WS-S-PIC 000239 MOVE 'ZZZ,ZZZ.99-' TO WS-D-PIC 000240 MOVE 'S & R' TO WS-COMMENTS 000241 MOVE SPACES TO WS-WARNING 000242 DISPLAY RPT-DETAIL 000243 . 000244 * MOVE SUBSTRING 000245 DISPLAY 'BELOW 2 RECORDS ARE IN FREE FORMAT:' 000246 MOVE WS-EMP-NAME(1:10) TO WS-FIRST-NAME 000247 MOVE 25 TO WS-NAME-LEN 000248 MOVE WS-EMP-NAME(11:WS-NAME-LEN) TO WS-LAST-NAME 000249 DISPLAY 'SUBSTRING MOVE:' 'FNAME:' WS-FIRST-NAME 000250- ' LNAME:' WS-LAST-NAME 000251 . 000252 * MOVE CORRESPONGING 000253 MOVE CORR DATA-RECORD TO DETAIL-LINE 000254 DISPLAY 'MOVE CORR:' 'ACCOUNT: ' ACCOUNT OF DETAIL-LINE 000255- ' ACCT-NAME:' ACCT-NAME OF DETAIL-LINE ‘AMOUNT:' 000256- AMOUNT IN DETAIL-LINE 000257 . 000258 * 000259 STOP RUN.
5.11.9 运行结果(MOVE语句)
下面是使用各种MOVE语句的程序的运行结果:
000001 *MAGIC REPORT(MOVE)* 000002 *COMMENTS* SOURCE PIC SOURCE DATA DEST. PIC DEST. DATA *** WARNING *** 000003 NORMAL PIC X(11) SZ AMAZING! PIC X(11) SZ AMAZING! 000004 S-SHORTER PIC X(06) NEWMAN PIC X(11) NEWMAN FILL BLANK 000005 S-LONGER PIC X(12) SZ AMAZING!* PIC X(11) SZ AMAZING! TRUNCATED! 000006 NORMAL ZEROS 00000000.00 PIC9(8).99 00000000.00 000007 NORMAL PIC9(8).9900012345.67 PIC9(8).99 00012345.67 000008 DEC LONGER 9(8).99900012345.678 PIC9(8).99 00012345.67 DEC TRUNCATED 000009 INT LONGER 9(9).99 123456789.01 PIC9(8).99 23456789.01 INT TRUNCATED 000010 S INSERT 9(8).99 00123456.00 999,999,999 000,123,456 000011 S INSERT PIC 9(8) 00001234.00 ZZZ,ZZZ,ZZZ 1,234 000012 S INSERT PIC 9(8) 00001234.00 ***,***,*** ******1,234 000013 SP INSET 9(8).9(2) 00001234.56 9999,999.99 0001,234.56 000014 SP INSET 9(8).9(2) 00001234.56 9,999,999.9 0,001,234.5 DEC TRUNCATED 000015 FIX INSET 9(8).9(2) 00001234.56 9999999.99- 0001234.56 000016 FIX INSET 9(8).9(2) 00001234.56-999999.99DB 001234.56DB 000017 F INSET 9(8).9(2) 00001234.56 $$$,999.99 $1,234.56 000018 F INSET S9(8).9(2) 00001234.56- +++++++++99 -1234 DEC TRUNCATED 000019 S & R 9(8).9(2) 00001234.56 ZZZZ,ZZZ.99 1,234.56 000020 S & R S9(8).9(2) 00001234.56- ZZZ,ZZZ.99- 1,234.56- 000021 BELOW 2 RECORDS ARE IN FREE FORMAT: 000022 SUBSTRING MOVE:FNAME:1STNAME!!! LNAME:LASTNAME!!! 000023 MOVE CORR:ACCOUNT:123456789 ACCT-NAME:NEWMAN BANKAMOUNT: 168.98