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