本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便一次只存储5个记录而不是整个文件。
所以我需要读取一个5个记录的策略组,进行处理,然后读取接下来的5个记录等,直到文件结束..
This is the input file.
10A 011111 2005062520060625
20A 011111000861038
32A 011111 79372
60A 0111112020 6 4
94A 011111 080 1
10A 02222 2005082520060825
20A 022221000187062
32A 022221 05038
60A 0222212003 6 4
94A 022221 090 1
....
我能够通过让我的表发表5次来将前5条记录加载到表中,但我不知道如何继续这样做。我的代码如下。 (我写它只是为了看它是否正常工作,但它打印的标题行与前4个记录,而不是只是前5个) 01表。
05 T1-RECORD-TABLE.
10 T1-ENTRY OCCURS 5 TIMES
INDEXED BY T1-INDEX.
15 RECORD-TYPE-10 PIC X(80).
15 RECORD-TYPE-20 PIC X(80).
15 RECORD-TYPE-32 PIC X(80).
15 RECORD-TYPE-60 PIC X(80).
15 RECORD-TYPE-94 PIC X(80).
copy trnrec10.
COPY TRNREC20.
COPY TRNREC32.
COPY TRNREC60.
COPY TRNREC94.
.....
Z200-READ-FILES.
READ DISK-IN INTO T1-ENTRY(T1-INDEX)
AT END MOVE 'YES' TO END-OF-FILE-SW.
WRITE PRINT-RECORD FROM T1-ENTRY(T1-INDEX).
我不想一步一步为此(尽管那很好:P)bc我知道我需要做什么我只是不知道怎么做我的教科书和课程笔记都没用对我来说。我已经坚持了一段时间,没有尝试过。
答案 0 :(得分:5)
我假设每个政策组都有5条记录,其中包含5种记录类型。
您可以像这样设置工作存储空间。
05 T1-RECORD.
10 T1-RECORD-TYPE PIC XX.
10 FILLER PIC X(78).
COPY TRNREC10.
COPY TRNREC20.
COPY TRNREC32.
COPY TRNREC60.
COPY TRNREC94.
然后您的阅读段落将如下所示。我假设TRNREC10-RECORD是TRNREC10字帖的01级。如果没有,请替换以下代码中的实际01级别。
2200-READ-FILE.
READ DISK-IN INTO T1-RECORD
AT END MOVE 'YES' TO END-OF-FILE-SW.
IF END-OF-FILE-SW = 'NO'
IF T1-RECORD-TYPE = '10'
MOVE T1-RECORD TO TRNREC10-RECORD
END-IF
IF T1-RECORD-TYPE = '20'
MOVE T1-RECORD TO TRNREC20-RECORD
END-IF
...
END-IF.
你的写段落看起来像这样
2400-WRITE-FILE.
WRITE PRINT-RECORD FROM TRNREC10-RECORD
WRITE PRINT-RECORD FROM TRNREC20-RECORD
...
您的处理段落将访问副本记录中的数据。
答案 1 :(得分:2)
您有教科书,课程笔记,手册,编辑器,JCL和计算机。
所有这些对你来说都会有用,但是你也必须让自己像你应该的程序一样思考。
你的任务是读取一个文件,将五个记录加载到一个表中,对它们做一些事情,然后把它们写出来。
您将有许多任务,您可以在其中读取文件,执行某些操作并编写文件。
那么如何先将文件处理下来?
使用FILE STATUS
定义文件PERFORM OPEN-INPUT-POLICY-MASTER
PERFORM OPEN-OUTPUT-NEW-POLICY-MASTER
在这些段落(或SECTION中,取决于您的站点标准)打开文件,检查文件状态,如果不是,则异常终止" 00"。
您需要一个READ段落。在那里阅读,检查文件状态,意识到" 10"是有效的,它表示文件结束(所以你不需要AT END和END-READ)。计算所有读取的记录(文件状态" 00")。
您需要一个WRITE段落。检查文件状态。只有" 00"已验证。计算所写的记录。
PERFORM PRIMING-READ-OF-POLICY-MASTER
该段落需要做的就是执行READ段落。将它放在自己的段落中是一种记录它的作用的方法。告诉下一个人。
它做什么?读取或尝试读取第一条记录。如果文件为空,您将获得文件状态" 10"。如果文件不应为空,则异常终止。您现在处理的是一个空文件,而不会影响您的处理逻辑。
PERFORM PROCESS-POLICY-MASTER UNTIL END-OF-POLICY-MASTER
或
PERFORM UNTIL END-OF-POLICY-MASTER
....
END-PERFORM
我更喜欢第一种,以避免主要逻辑"传播",但如果您愿意/它适合您的课程,则可以从第二种开始。
段落中或END-PERFORM之前的最后一件事是READ的表现。
然后您可以执行CLOSE-INPUT-POLICY-MASTER,类似于输出文件。
然后检查计数是否相等。如果没有,abend。在这个例子中这是微不足道的,但随着你的逻辑变得越来越复杂,事情就会出错。
始终提供计数以协调您的输入与输出,计数添加,删除。分别计算更新以获取信息。让您的程序检查它可以做什么。如果您有比输入记录更多的更新,请识别并异常终止。让您的程序尽可能多地进行验证。
现在您将拥有一个简单的程序,它可以读取文件,写入文件,尽可能多地检查,并且只是缺少处理逻辑。
您可以将该程序用作读取一个文件和编写另一个文件的所有任务的基础。
所有这些东西都可以在你的新程序中使用,而无需你做任何事情。
您现在需要的逻辑是将数据存储在表格中。
好吧,正如吉尔伯特正确地表明的那样,在实际情况下存储在一张桌子里并不合理。但是,这是要求。你也需要擅长表格。
您的表格未正确定义。试试这个:
01 T1-RECORD-TABLE.
05 T1-ENTRY OCCURS 5 TIMES
INDEXED BY T1-INDEX.
10 POLICY-RECORD.
15 POLICY-RECORD-TYPE PIC XX.
15 POLICY-RECORD-DATA PIC X(78).
为每种记录类型在POLICY-RECORD-TYPE下面放置一个88。将88描述为业务功能,不要只说" RECORD-IS-TYPE-10"。
您正在使用索引来引用表格中的项目。在将第一个条目放入表中之前,必须将索引设置为1.要访问下一个条目,必须将索引设置为UP BY。
将商品存储在表格中后,您需要再次访问它们。再次将索引设置为1,您可以引用第一个条目。串行设置索引UP BY 1以访问其他条目。
在开始处理之前将索引设置为TO 1。将0移至表条目计数。进入你的文件处理循环。
在那里,计算你存储的内容,每次你的表条目数达到5时,执行一个段落输出你的记录并将你的索引设置为1.如果计数不是五,则设置你的索引UP BY 1。 / p>
在您的段落中输出记录,使用PERFORM VARYING您的索引FROM 1 BY 1 UNTIL GREATER THAN 5.在PERFORM中,使用当前表条目作为记录来源执行WRITE段落。
您现在将拥有两个程序,这两个程序都读取输入文件并生成相同的输出文件。
然后你可以做你的验证逻辑。
如果你把一切都搞砸了,把事情分开,保持简单,命名好,你就会开始编写除特定业务逻辑之外的相同的COBOL程序。所有标准的东西,所有无聊的东西,如果你愿意,所有的基本结构保持不变。您编写的新代码只是下一个任务的具体细节。
是的,您可以阅读更多文件,作为参考文件或多个输入。您将拥有多个输出。但是你可以用完全相同的方式构建所有这些的基础知识。然后,您将有更多示例以您未来的计划为基础。
一旦你掌握了基本的东西,你就再也不需要再编码了。你只需要复制并申请。
有了好名字,你的程序就会告诉他们在做什么。
您实际编写的代码将是"有趣的"东西,而不是你做的东西"每次"。
我只是"设计"这个给你。它不是唯一可行的设计。我是这样做的,已经做了一段时间了。您还应该设计处理的每个部分。在编写代码之前,您应该知道它在做什么。
举个例子,采取一个简单的循环。想象一下你将如何测试它。如果表中没有条目,会发生什么?有一个?有中间号码?比最大值少一个?最大值?超过最大值?比最大值多10?然后编写代码,知道你需要知道如何处理这些情况。
在不久的将来,您在编写代码时会考虑低级设计。在更长的时间内,您也可以通过这种方式进行高级设计。在足够的时间内,你只会设计你以前不必处理的东西,你已经知道的其余部分。
您有教科书,课程笔记,手册,编辑器,JCL和计算机。我给了你一些想法。看看如果把它们放在一起它们对你有用。我觉得你现在有点沮丧。写一些基本程序,然后将它们应用到你的任务中。