一个COBOL的编程实例

zmz82

贡献于2012-06-19

字数:13222 关键词:

一个COBOL的编程实例 通常一个程序分为几个处理过程,然后有序地组合起来使用,以实现我们所希望的处理结果。 这里,给出一个销售公司对销售数据处理的范例,通过实际的编程,掌握COBOL编程的技巧和步骤。 销售数据处理系统简介 Ø 用户需求 (1) 某销售公司有若干个销售商店,公司想获得每个商品的销售去向和每个商店的销售额等信息。 (2) 商品的库存管理在一个固定地方进行管理。经营者为掌握库存销售情况,想及时获得有关定货信息。 为满足上述(1)和(2)的需求,首先: ① 需要具体地确定什么样的信息,采用什么样的手段来获取。例如,定货信息包含什么内容、日处理做什么、月处理做什么等。 ② 需要搞清为获取①中所需信息,什么样的数据适合作为输入数据来使用。 ③ 决定②中数据文件格式,讨论处理顺序,进而决定程序处理所用的文件。(过程设计、文件设计) ④ 处理过程中,如果需要进行数据合并、排序的话,必须进行数据代码化处理(代码设计) 根据上述思考,决定编程的具体工作。 此例题是一个批处理例题。既将每周一次从销售店收集到的销售数据进行汇总合计,作成销售额统计表,然后根据销售额统计表获取库存主文件、供货商主文件信息后打印定货清单。 注:此程序的部分编程技巧不是最优,但可以分为如下四个处理步骤来实现。 l 处理步骤1:数据合法性检查和排序处理 从商店获取的数据可能有非法数据,所以必须进行数据合法性检查。对查出的错误数据,将其打印到“错误数据清单”上并要求修改这些错误数据。对检查无误(正确)的数据,按商品代码进行排序,以便进行后续处理。 l 处理步骤2:统计报表的制作 将输入的销售信息作成统计表。统计表上要打印出各商店按商品代码汇总的销售额,并把商店总销售额用”*”表示出来。 l 处理步骤3:更新处理库存主文件 把按商品代码排序的销售文件作为交易,更新库存主文件的当前库存量。由于在销售文件中,可能存在同一商品代码的多条数据记录,所以需要做N:1的数据合并处理。 l 处理步骤4:制作定货清单 在处理步骤3中,当新库存主文件产生的同时,要将当前库存量 与最低库存量进行比较后,将需要定货的商品代码清单打印出来。 阅读如下处理内容,编制处理步骤1的流程图。 [处理内容] 处理步骤1就是先前所述的一系列处理程序的入口,它为后续处理提供必要的数据。具体说来,就是对输入文件的数据进行合法性检查和排序处理。 l 数据检查项有如下3种: ① 销售金额的数据合法性检查 ② 销售数量的数据合法性检查 ③ 商店代码存在与否的检查 对第③项加以说明,如果在商店代码参数表中无法查到所读入的商店代码,则认为所读入的商店代码无效。检查出的所有错误数据都要输出到“错误数据清单”上。一条数据记录有多个数据项出现错误时,要对每个数据项进行标识,并在其数据项后打印“*”。 l 处理步骤1的输入/输出数据格式如下所示,输入文件的各记录上写明了每个商店的商店代码。 ★输出文件的格式与输入文件的格式相同 l 错误数据清单的输出格式如下所示,每页打印15条记录。 l 商店代码的格式如下,商店代码参数表按升序排列已被存储于磁盘中。 l 为了方便处理步骤2以后的处理,将已检查无误的数据(正确数据),以商品代码为键值升序排列。 l 排序处理过程,请使用COBOL的排序语句。 解说 抓住程序处理特征,考虑程序处理效率 在处理步骤1的数据检查处理中,当一条记录出现多个数据项错误时,为了象差错表清单那样,在每个错误数据项下打印“*”号,可以进行串行数据检查处理。通常,如果使用了过多的改变处理流程的开关(流程图上,为检出有错误数据而设置的错误标志)会导致程序处理流程的复杂化。开关是为了使程序处理清晰化而使用的东西。 再有,查错③的处理中,需要对表进行检索处理。对表的检索处理有如下两种方式: 一种是在程序中使用下标对表的元素进行控制,另一种则是使用含有索引的SEARCH语句来检索。索引即不能用于表操作以外,也不能用于所定义的表以外,因此它对表的检索效率最高,并且不容易引起程序错误。在这个处理中,由于商店代码参数表是按升序排列,所以使用了检索速度比较快的对分查找方式(SEARCH ALL)。 【解答例】 根据解说过的流程图,编写处理步骤1的程序(过程部)。 [程序说明] l 使用下面已定义好的数据部。 l 使用SEARCH ALL语句对表进行检索 l 使用COMPUTE 语句进行运算处理 l 使用=,< , > ,NOT进行数据项间的比较处理 [数据部定义] DATA DIVISION。 FILE SECTION。 FD IN-F LABEL RECORD STANDARD。 01 IN-REC。 定义输入文件 02 SYOU-CODE PIC X(6)。 02 URI-KIN PIC 9(7)。 02 URI-SU PIC 9(6)。 02 MISE-CODE PIC X(2)。 FD ON-F LABEL RECORD STANDARD。 01 ON-REC PIC X(21)。 SD SORT-F。 01 SORT-REC。 02 SYOU-CODE PIC X(6)。 02 URI-KIN PIC 9(7)。 定义排序用工作文件 02 URI-SU PIC 9(6)。 02 MISE-CODE PIC X(2)。 WORKING-STORAGE SECTION。 01 MIDASHI-REC PIC X(132) VALUE “ 差 错 清 单 ” 01 MEISAI-1。 02 FILLER PIC X(2) VALUE SAPCE。 02 SYOU-CODE PIC X(6)。 02 FILLER PIC X(2) VALUE SAPCE。 02 URI-KIN PIC X(7) 02 FILLER PIC X(2) VALUE SAPCE。 02 URI-SU PIC X(6) 02 FILLER PIC X(2) VALUE SAPCE。 02 MISE-CODE PIC X(2) 01 MEISAI-2。 02 FILLER PIC X(10) VALUE SAPCE。 02 EM-URI-KIN PIC X(7)。 02 FILLER PIC X(2) VALUE SAPCE。 02 EM-URI-SU PIC X(6)。 02 FILLER PIC X(2) VALUE SAPCE。 02 EM-MISE-CODE PIC X(2)。 01 ER-FLG PIC 9。 错误标志 01 LINE-CNT PIC 99 VALUE 20。 行计数器 01 MISE-TAB VALUE “AABBCCDDEEFFGGHHIIJJ”。 02 MISE-ELT PIC X(2) OCCURS 10 定义商店代码 INDEXED BY I ASCENDING KEY MISE-ELT。 解说 介绍并掌握排序处理的描述形式和检索表的方法 ★ SORT语句和输入输出过程 SORT语句中使用SD语句定义排序用工作文件。在排序处理前,为进行必要的处理而使用INPUT PROCEDURE(输入过程)语句。输出时由于没有特殊的处理,所以直接使用GIVINIG语句即可。这里可以看出,根据输入/输出过程的缺省,SORT语句的描述形式是不一样的。 ★ 用SEARCH语句查表 由于使用了SEARCH ALL语句对表进行搜索,所以查表处理就简单多了。在这里值得注意是,使用SEARCH语句时,对索引赋初值是必要的。 【解答例】 (注)程序中所用的MOVE语句中出现了CORR(corresponding),表示一个集团项间的数据向另外一个集团中同名的数据基本项(数据项)传递数据。 阅读如下处理内容,编写处理步骤2的流程图。 [处理内容] 处理步骤2是从销售数据中收集销售信息的处理。具体的说,以销售店为单位,按商品代码汇总各商品销售合计金额并制成报表。再依据各销售店的总合计金额,制成柱状图,处理的前提条件如下。 ● 输入文件是处理步骤1中输出的文件,它已按商店代码、商品代码这一顺序分别升序排列。 记录格式如下: ● 输出的销售信息格式如下 ● 所谓柱状图,就是把各店的销售合计金额以10万日元作为1个单位,让它对应出一个“*”的表达图。如遇10万日元以下的金额要做四舍五入处理。 解说 控制要素的保存和结束时的处理 此问题是按组分类汇总处理的问题。分组的控制键为商店代码和商品代码这两个。做多个控制键分组判定处理时,一般从较大的控制键(此例题为店代码)开始,一旦较大的控制键值发生变化,即事先保存在工作区的较大控制键值与新读入记录中的较大控制键值不相等时,小的控制键也被看作发生变化,这时,也要进行小控制键的处理。 当这种控制键变化时,需要输出组合计、做总汇总、设置下一个控制键、将汇总合计区域清零等。再有,需要考虑何时输出哪些汇总项目,以及何时必须计算这些汇总项目。 再一个重要的就是文件处理结束时的处理。为了输出最后一组数据,必须把文件处理结束处理视同控制键值发生变化来处理。为此,重要的是,必须将汇总合计处理、输出处理等进行模块化编程处理。 掌握分组合计的方法,对今后的编程应用会起到重大作用的。因此,我们一定要掌握它。 按照解答范例的流程图,编制处理步骤2的程序(过程部)。 [程序说明] ● 使用下面给出的数据部定义。 ● 运算时使用COMPUTE语句,比较大小时,使用=,<,>,NOT。 [数据部定义] DATA DIVISION。 FILE SECTION。 FD IN-F LABEL RECORD STANDARD。 01 IN-REC。 02 SYOU-CODE PIC X(6)。 02 URI-KIN PIC 9(7)。 定义输入文件的记录 02 URI-SU PIC 9(6)。 02 MISE-CODE PIC X(2)。 FD OT-REC LABEL RECORD STANDARD。 01 OT-REC PIC X(132)。 WORKING-STORAGE SECTION。 01 MIDASI-REC PIC X(132) VALUE “ 销售 合计 清单”。 01 MIDASI-1。 02 FILLER PIC X(12) VALUE SPACE。 02 OT-SYOU-CODE PIC X(6)。 02 FILLER PIC X(2) VALUE SPACE。 02 OT-MISE-CODE PIC X(2)。 02 FILLER PIC X(2) VALUE SPACE。 02 OT-URI-KIN PIC 9(7)。 02 FILLER PIC X(2) VALUE SPACE。 02 OT-URI-SU PIC 9(6)。 01 GOKEI-1。 02 FILLER PIC X(5) VALUE SPACE。 02 GT-MSG PIC X(10)。 02 FILLER PIC X(2) VALUE SPACE。 02 GT-GOKEI-KIN PIC Z(8)9。 02 FILLER PIC X(2) VALUE SPACE。 02 GT-GOKEI-SU PIC Z(7)9。 02 FILLER PIC X(2) VALUE SPACE。 01 LINE-CNT PIC 99 VALUE 20。 行计数器 01 GOKEI-AREA USING COMP。 02 SYOU-KIN-GOKEI PIC 9(8) VALUE 0。 商品合计 02 MISE-KIN-GOKEI PIC 9(9) VALUE 0。 店合计 02 SYOU-SU-GOKEI PIC 9(8) VALUE 0。 商品数量合计 02 MISE -SU-GOKEI PIC 9(9) VALUE 0。 店数量合计 01 KEY-AREA。 02 K-MISE-CODE PIC X(2)。 店代码保存区域 02 K-SYOU-CODE PIC X(6)。 商品代码保存区域 01 KIN-TABLE VALUE ALL ZERO。 定义保存 02 KIN-ELT PIC 9(9) OCCURS 10 INDEXED BY I L。 店合计的 01 NN PIC 9(3) VALUE 0。 表 01 N PIC 9(3) VALUE 0。 01 AST-GYO。 02 FILLER PIC X(5) VALUE SPACE。 为柱状图打印而 02 AST-GOKEI PIC ZZ9。 准备的区域 02 FILLER PIC X(5) VALUE SPACE。 02 AST-ELT PIC X OCCURS 100。 解说 关注程序构造,编写易读易懂的程序 ★ 分组合计控制键值变化时的控制点 分组合计处理中的控制键值发生变化时,应该注意的地方,在前边已经说过了。在这里还需要关注的是:最初控制键值保存的时机、换页的时机。除此,为了打印柱状图,需要把汇总数值保存在内存表中。因此,有必要掌握对该表操作的下标初始值和其变化情况。 ★ 新COBOL语法上的关注点 1988年新出台的COBOL规则中,允许在含有OCCURS语句的数据项目中(甚至从属数据项目中)用VALUE语句赋初值。此时所有用OCCURS语句重复的数据项都为同一值。再有,PERFORM语句也使用了明确范围的(END-PERFORM)标识,这样就限制了PERFORM语句所处理的范围,使得程序更容易按结构化编程。 ★ 部分引用的方法 程序中为打印柱状图(带“*”的行),需要使用MOVE语句一个“*”号,一个“*”号地对位(数)传输,而新COBOL中使用字符的部分引用方法,简单地就可以处理了,以下是部分引用的方法和使用部分引用的程序范例。 除此之外,有关新COBOL追加、变更的其它内容,最好参照本讲座和相关参考资料来学习。 [解答例] PROCEDURE DIVISION。 L-0. OPEN INPUT IN-F OUTPUT OT-F。 SET 1 TO I。 READ IN-F AT END GO TO L-END。 MOVE MISE-CODE TO K-MISE-CODE。 设置第一条记录的控制键 MOVE SYOU-CODE TO K- SYOU -CODE。 L-1. IF MISE-CODE > K-MISE-CODE PERFORM SYOU-P 店代码不一致时的处理 PERFORM MISE-P ELSE IF SYOU-CODE 〉 K- SYOU –CODE 商品代码不一致时的处理 PERFORM SYOU-P。 COMPUTE SYOU-KIN-GOKEI = SYOU-KIN-GOKEI + URI-KIN。 汇总计算 COMPUTE SYOU-SU-GOKEI = SYOU-SU-GOKEI + URI-SU。 READ IN-F AT END GO TO L-2。 GO TO L-1。 L-2. PERFORM SYOU-P。 文件结 PERFORM MISE-P。 束时的 PERFORM L-3 VARYING L FROM 1 BY 1 UNTIL L > I。 处理 L-END。 CLOSE IN-P OT-P。 STOP RUN。 MISE-P。 MOVE MISE-KIN-GOKEI TO GT- GOKEI-KIN。 MOVE MISE-SU-GOKEI TO GT- GOKEI-SU。 COMPUTE LINE-CNT = LINE-CNT + 1。 WRITE OT-REC FROM GOKEI-1。 MOVE SPACE TO OT-REC。 按商店汇总合计处理 WRITE OT-REC AFTER 1。 MOVE MISE-CODE TO K-MISE-CODE。 MOVE MISE-KIN-GOKEI TO KIN-ELT (I)。 MOVE 0 TO MISE-KIN-GOKEI MISE-SU-GOKEI。 SET I UP BY 1。 SYOU-P。 MOVE SYOU -KIN-GOKEI TO OT- URI-KIN。 按商品种类 MOVE SYOU -SU-GOKEI TO OT- URI -SU。 汇总合计 COMPUTE MISE-KIN-GOKEI = MISE-KIN-GOKEI + SYOU -KIN-GOKEI。 COMPUTE MISE-SU-GOKEI = MISE-SU-GOKEI + SYOU -SU-GOKEI。 MOVE K-SYOU-CODE TO OT-SYOU-CODE。 MOVE K-MISE-CODE TO OT-MISEU-CODE。 IF LINE-CNT < 20 WRITE OT-REC FROM MIDASI-REC AFTER PAGE MOVE 0 TO LINE-CNT MOVE SPACE TO OT-REC WRITE OT-REC AFTER 1。 WRITE OT-REC FROM MEISAI-1。 COMPUTE LINE-CNT = LINE-CNT + 1。 MOVE 0 TO SYOU-KIN-GOKEI SYOU-SU-GOKEI。 MOVE SYOU-CODE TO K-SYOU-CODE。 L-3. MOVE SPACE TO AST-GYO。 COMPUTE N = KIN-ELT (L) / 100000 ROUNDED。 PERFORM VARYING NN FROM 1 BY 1 UNTIL NN > N 打印柱状 MOVE “*” TO AST-ELT (NN) 图处理 END-PERFORM。 MOVE N TO AST-GOKEI。 WRITE OT-REC FROM AST-GYO。 阅读以下处理内容,编写处理步骤3的流程图 [处理内容] 将处理步骤1输出的销售文件作为交易,更新库存主文件的当前库存数。更新时,当前库存量低于最低库存量时,要打印定货信息清单。再有,可能会出现销售文件内的商品代码与商品主文件不匹配的现象。为此,需要做一致性检查。当出现不一致的情况时,要输出错误信息。 下面给出处理步骤3的前提条件。 ● 销售文件,库存主文件都是顺序文件,它已按商品代码升序排列。 ● 销售文件中会存在多条具有同一商品代码的数据记录。 ● 库存主文件的当前库存量不能为负数。 ● 输入/输出文件的记录格式如下: 解说 控制键的比较结果和执行处理结果间的关系 ★ 匹配控制键的比较和处理结果 文件的更新处理,是通过主文件与交易文件双方的匹配控制键大小来进行的。由此可以产生三种不同的处理分支。 处理步骤3的匹配控制键是商品代码,它已升序排列完毕。销售文件,旧库存主文件的匹配控制键分别为T-KEY,M-KEY,解析其处理结果如下: ★ M-KEY = T-KEY 使用销售记录的内容更新库存主文件记录。但是,由于相同商品代码的销售记录可能会有多条记录存在,此时还不能直接向新库存主文件输出。 ★ M-KEY < T-KEY 销售文件中不存在与主记录相对应的记录,此时,可以考虑对库存主记录实施更新处理。为此,要把更新处理完的库存主记录内容向新库存主文件输出。当更新处理记录与当前库存量低于最低库存量时,打印定货清单。 ★ M-KEY > T-KEY 由于不存在与销售记录内的商品代码相一致的库存主记录,因此要输出“销售记录错”信息。 各项处理结束后,接着要输入后续应该处理的记录,此时。。。。。。。。。。。。。P29 ★ 文件结束时的处理 将所有顺序文件的库存主文件的记录输出到新库存主文件上。再有,销售文件的内容也必须处理完。因此,处理结束的标志是这两个文件的输入操作都完成。 为此,这两个文件中的其中任何一个文件处理结束后,必须等待另一个文件的正确处理结束。为保障正常的处理,有必要对输入已结束的文件匹配控制键赋予合适的值。通常,输入文件通过匹配控制键来排序。与此相对应,HIGH-VALUE用于升序,LOW-VALUE用于降序。 向新库存主文件的输出条件是M-KEY < T-KEY。此时应该注意的是已经读取了一条销售文件记录。 [解答例] 根据解答例的流程图,编制处理步骤3地程序(过程部) [程序说明] ★ 使用下面定义好的数据部。 ★ 输出的错误信息为:*** 商品代码不匹配(商品代码)*** ★ 运用使用COMPUTE语句,比较使用=,<,>,NOT [定义的数据部] DATA DIVISION。 FILE SECTION。 FD URIAGE-FILE BLOCK CONTAINS 3 RECORDS LABEL RECORD STANDARD DATA RECORD URI-REC。 01 URI-REC PIC X(21)。 FD ZAIKO-MASTER BLOCK CONTAINS 3 RECORDS LABEL RECORD STANDARD DATA RECORD ZAIKO-REC。 01 ZAIKO -REC PIC X(28)。 FD NEW-ZAIKO-MASTER BLOCK CONTAINS 3 RECORDS LABEL RECORD STANDARD 定义输入/输出文件 DATA RECORD NEW-ZAIKO -REC。 01 NEW-ZAIKO -REC PIC X(28)。 FD HACHUU-FILE BLOCK CONTAINS 3 RECORDS LABEL RECORD STANDARD DATA RECORD HACHUU-REC。 01 HACHUU-REC。 02 H-SHIIRE-CODE PIC X(6)。 02 H-SYOHIN-CODE PIC X(6)。 02 H-GEN-ZAIKO PIC X(8)。 02 H-SAITEI-CODE PIC X(8)。 WORKING-STORAGE SECTION。 01 URIAGE-WORK。 02 T-SYOHIN-CODE PIC X(6)。 02 T- URIAGE PIC 9(7)。 定义交易记录 02 T-SURYO PIC 9(6)。 02 T-TEN-CODE PIC X(2)。 01 ZAIKO-WORK。 02 M-SYOHIN-CODE PIC X(6)。 02 M- ZAIKO PIC 9(8)。 定义主文件记录 02 M-SAITEI-ZAIKO PIC 9(8)。 02 M-SHIIRE-CODE PIC X(6)。 解说 工作单元的使用方法 商品代理,定货代码等,这些代码尽管都是由数字所构成,但不用于参加运算处理,所以使用数字型X来定义。这样做,是为了避免跟数字型9的定义发生冲突。常数HIGH-VALUE,LOW-VALUE这样的常数都不能使用数字型9。 文件输入结束时,最好避免直接对输入域内的匹配控制键赋HIGH-VALUE值,这是因为每个机器的COBOL编译器要求不同,有些机器不支持这样做的缘故。因此,最好在输入后传送到工作单元中进行处理为好。这样就还输入区以本来的功能设计面貌了。 输入后马上使用READ命令中的INTO子句把数据转移到工作单元中。 READ 文件名 [INTO 工作单元 [AT END 无条件命令] 再有,也可以使用WRITE命令把工作单元的内容向输出区传送输出。 WRITE 记录名 [FROM 工作单元] [解答例] PROCEDURE DIVISION。 PROGRAM-START。 OPEN INPUT URIAGE-FILE ZAIKO-MASTER OUTPUT NEW- ZAIKO-MASTER HACHUU-FILE。 PERFORM ZAIKO-MASTER-INPUT-SYORI。 PERFORM URIAGE-FILE-INPUT-SYORI。 * PERFORM KOUSIN-LOOP UNTIL T-SYOHIN-CODE = HIGH-VALUE AND M-SYOHIN-CODE = HIGH-VALUE * CLOSE URIAGE-FILE ZAIKO-MASTER NEW- ZAIKO-MASTER HACHUU-FILE。 STOP RUN。 KOUSIN-LOOP。 IF M-SYOHIN-CODE = T-SYOHIN-CODE THEN COMPUTE M-ZAIKO = M-ZAIKO + T-SURYO PERFORM URIAGE-FILE-INPUT-SYORI ELSE IF M-SYOHIN-CODE < T-SYOHIN-CODE 更新输出处理 THEN WRITE NEW- ZAIKO-REC FROM ZAIKO-WORK IF M-ZAIKO NOT > M-SAITEI-ZAIKO 输出定货信息 THEN MOVE M-SHIIRE-CODE TO H-SHIIRE-CODE MOVE M-SYOHIN-CODE TO H-SYOHIN -CODE MOVE M-ZAIKO TO H-GEN- ZAIKO MOVE M-SAITEI-ZAIKO TO H-SAITEI-ZAIKO WRITE HACHUU-REC ELSE CONTINUE END-IF PERFORM ZAIKO-MASTER-INPUT-SYORI ELSE DISPLAY “***商品代码不匹配 (” T-SYOHIN-CODE 显示错误信息 “)***” PEFORM URIAGE-FILE-INPUT-SYORI END-IF END-IF。 ZAIKO-MASTER-INPUT-SYORI。 READ ZAIKO-MASTER INTO ZAIKO-WORK AT END MOVE HIGH-VALUE TO M-SYOHIN-CODE。 URIAGE-FILE-INPUT-SYORI。 READ URIAGE-FILE INTO URIAGE -WORK AT END MOVE HIGH-VALUE TO T-SYOHIN-CODE。 阅读以下内容,制作处理步骤4的流程图。 [处理内容] 根据处理步骤3输出的订货信息文件,按供货商代码产生订货清单。为在订货清单上打印出供货商的名称,需要使用供货商主文件。供货商主文件是以供货商代码为索引的索引文件。处理步骤4的前提条件如下: ● 订货信息文件是按供货商代码升序排列。 ● 供货商主文件,依据订货信息记录条数而随便读取 ● 一定存在与订货信息记录中的供货商代码相对应的供货商主文件记录。 ● 订货信息文件以及供货商主文件的记录格式如下所示。 ● 订货清单的输出格式如下所示。 解说 索引文件的特征 ★ 索引文件的处理 在这里所使用的供货商主文件是索引文件。索引文件就像百科全书那样,分成索引部分和数据部分。索引部分有识别记录的控制键,该控制键一定预先定义在记录中的相应位置中,按键值升序排列。数据部就是记录本身。 COBOL可以使用带有多个控制键的索引文件。把多个控制键中唯一能识别各记录的控制键叫做主键(RECORD KEY),该主键只能有一个。可以使用这个主键,对索引文件作生成、更新和检索处理。主键以外的键,叫副键(ALTERNATE RECODE KEY),可以定义多个。副键允许键值重复。因此,只能用于检索处理。 索引文件的读写方法,即可以按主键或副键的顺序读出,也可以与主键或副键顺序无关的随机读出,还可以并用上述两种读出方法,灵动机动地读出。 ★ 随机读取 每次输入订货信息文件,基本上都是以供货商代码作为索引键,读取供货商主文件的。在处理步骤4中,由于订货信息文件按供货商代码排序过,所以在处理同一供货商的订货记录中,没必要每次都读取供货商主文件。为此,需要增加判定条件,判定与先前所读取订货记录中的供货商代码是否一致,如果不一致就需要从供货商主文件中读取新的记录。 再有,随机读取处理中,不用考虑文件的结束处理,决定文件结束处理的条件是:订货信息文件全部输入结束。 根据解答例的流程图,编写处理步骤4的程序(过程部)。 [程序说明] ● 使用下面给出的环境部和数据部的定义。 ● 运算过程使用COMPUTE语句,比较时使用=,<,>,NOT [环境部以及数据部的定义] ENVIRONMENT DIVISION。 INPUT-OUTPUT SECTION。 FILE-CONTROL。 SELECT HACHUU-FILE ASSIGN TO DISC。 SELECT SHIIRE-MASTER ASSIGN TO DISC ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORDE KEY SHIIRE-CODE ALLKTERNAME RECORDE KEY IS TORI-GINKOU-CODE WITH DUPLICATES。 SELECT HACHUU-LIST ASSIGN TO PRINTER。 DATA DIVISION。 FILE SECTION。 FD HACHUU-FILE BLOCK CONTAINS 3 RECORDS LABEL RECORD STANDARD DATA RECORD HACHUU-REC。 01 HACHUU-REC。 02 H-SHIIRE-CODE PIC X(6)。 02 H-SYOHIN-CODE PIC X(6)。 02 H-GEN-ZAIKO PIC 9(8)。 02 H-SAITEI-ZAIKO PIC 9(8)。 FD SHIIRE-MASTER BLOCK CONTAINS 3 RECORDS LABEL RECORD STANDARD DATA RECORD SHIIRE-REC。 01 SHIIRE -REC。 02 SHIIRE-CODE PIC X(6)。 02 TORI-GINKOU-CODE PIC X(6)。 02 SHIIRE-SAKI-MEI PIC 9(8)。 02 H-SAITEI-ZAIKO PIC 9(8)。 FD HACHUU-LIST LABEL RECORD OMITTED DATA RECORD LIST-REC。 01 SHIIRE –REC PIC(132)。 WORKING-STORAGE SECTION。 01 SAGYOU-AREA。 02 FILE-END PIC 9(1)。 02 MAE-CODE PIC X(6)。 02 PAGE-COUNT PIC 9(3)。 02 LINE-COUNT PIC 9(2)。 01 PAGE-MIDASHI。 02 FILLER PIC X(20) VALUE SPACE。 02 FILLER PIC X(16) VALUE “*** 定货清单 ***”。 02 FILLER PIC X(24) VALUE SPACE。 02 FILLER PIC X(03) VALUE “(P。”。 02 FILLER PIC ZZ9。 02 FILLER PIC X(01) VALUE “)”。 02 FILLER PIC X(65) VALUE SPACE。 01 MIDASHI。 02 FILLER PIC X(04) VALUE SPACE。 02 FILLER PIC X(08) VALUE “供货商名”。 02 FILLER PIC X(12) VALUE SPACE。 02 FILLER PIC X(05) VALUE “商品”。 02 FILLER PIC X(07) VALUE SPACE。 02 FILLER PIC X(08) VALUE “当前库存”。 02 FILLER PIC X(07) VALUE SPACE。 02 FILLER PIC X(08) VALUE “最低库存”。 02 FILLER PIC X(73) VALUE SPACE。 01 HENSYUU-AREA。 02 FILLER PIC X(02)。 02 P-SHIIRE-SAKI PIC X(20)。 02 FILLER PIC X(02)。 02 P-SYOHIN-CODE PIC X(06)。 02 FILLER PIC X(03)。 02 P-GEN-ZAIKO PIC ZZ,ZZZ,ZZ9。 02 FILLER PIC X(05)。 02 P-SAITEI-ZAIKO PIC ZZ,ZZZ,ZZ9。。 02 FILLER PIC X(74) VALUE SPACE。 解说 掌握索引文件的处理方法 使用索引文件的关键在于主键、副键的定义。主键、副键的定义以及读取方法被描述在环境部的文件管理节中。 处理步骤4中,即时不使用副键,也必须要符合索引文件生成定义。主键、副键的数据区域定义在输入区内。输入区内所处的位置必须与索引文件生成时的位置一致。随机读取索引文件记录时要使用READ命令,此时一定要使用INVALID KEY子句,如要使用IF语句,那么最好要使用END-READ语句。 随机读取供货商主文件时,要在执行READ命令前一定要设定好想输入的供货商代码的键值。 ● INITIALIZE语句 此命令是对满足所指定的区域内各字段的数字型进行初始化处理,具体使用例如下: [解答例] PROCEDURE DIVISION。 PROGRAM-START。 OPEN INPUT HACHUU-FILE SHIIRE-MASTER OUTPUT HACHUU-LIST。 INITIALIZE SAGYOU-AREA HENSYUU-AREA 。 赋初值 PERFORM HACHUU-FILE-INPUT。 PERFORM UNTIL FILE-END = 1 PERFORM HACHUU-LIST-OUT-SYORI 循环打印 PERFORM HACHUU-FILE-INPUT END-PERFORM。 CLOSE HACHUU-FILE SHIIRE-MASTER HACHUU-LIST。 STOP RUN。 HACHUU-LIST-OUT-SYORI。 输入索引文件 IF H-SHIIRE-CODE NOT = MAE-CODE THEN MOVE H-SHIIRE-CODE TO SHIIRE-CODE READ SHIIRE—MASTER KEY IS SHIIRE-CODE INVALID KEY STOP RUN ENDREAD MOVE SHIIRE-CODE TO MAE-CODE MOVE 21 TO LINE-COUNT 定货清单输出处理 END-IF。 IF LINE-COUNT NOT < 20 换页前的控制 THEN COMPUTE PAGE-COUNT = PAGE-COUNT + 1 MOVE PAGE-COUNT TO P-PAGE WRITE LIST-REC FROM PAGE-MIDASHI AFTER PAGE WRITE LIST-REC FROM MIDASHI AFTER 2 MOVE 0 TO LINE-COUNT MOVE SHIIRE-SAKI-MEI TO P-SHIIRE-SAKI 编辑打印明细行 END-IF。 MOVE H-SYOHIN-CODE TO P- SYOHIN-CODE MOVE H-GEN-ZAIKO TO P- SYOHIN-CODE MOVE H-SAITEI-ZAIKO TO P- SAITEI-ZAIKO WRITE LIST-REC FROM HENSYUU-AREA AFTER 2。 COMPUTE LINE-COUNT = LINE-COUNT + 1。 MOVE SPACE TO HENSYUU-AREA。 HACHUU-FILE-INPUT。 READ HACHUU-FILE AT END MOVE 1 TO FILE-END。 (完)

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ]
2 人已下载

下载文档

相关文档