2

本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取和存储每个策略组,以便一次只在表中存储 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                                                    
....

我可以通过让我的表 OCCUR 5 TIMES 将前 5 条记录加载到一个表中,但我不知道我将如何继续。我的代码如下。(我写它只是为了看看它是否工作正常,但它会打印带有前 4 条记录的标题行,而不仅仅是前 5 条) 01 TABLES。

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我知道我需要做什么我只是不知道如何去做bc我的教科书和课程笔记对我来说毫无用处。我已经坚持了一段时间,我尝试的任何方法都不起作用。

4

2 回答 2

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
    ...

您的处理段落将访问字帖记录中的数据。

于 2013-11-14T19:01:01.610 回答
2

你有教科书、课程笔记、手册、编辑器、JCL 和计算机。

所有这些都会对你有用,但你也必须让自己像你应该编程的那样思考。

你的任务是读取一个文件,将五个记录加载到一个表中,对它们做一些事情,然后把它们写出来。

您将执行许多任务,包括读取文件、执行操作和写入文件。

那么如何先把文件处理下来呢?

使用 FILE STATUS 定义文件

PERFORM OPEN-INPUT-POLICY-MASTER
PERFORM OPEN-OUTPUT-NEW-POLICY-MASTER

在这些段落(或部分,取决于您的站点标准)中打开文件,检查文件状态,如果不是“00”则异常终止。

您将需要一个 READ 段落。在那里阅读,检查文件状态,注意“10”是有效的并且它表示文件结束(所以你不需要AT END和END-READ)。计算读取的所有记录(文件状态“00”)。

您将需要一个 WRITE 段落。检查文件状态。只有“00”有效。计算写入的记录。

PERFORM PRIMING-READ-OF-POLICY-MASTER

该段落需要做的就是执行阅读段落。把它放在自己的一段中是一种记录它所做的事情的方式。告诉下一个人。

它有什么作用?读取或尝试读取第一条记录。如果文件为空,您将获得文件状态“10”。如果文件不应该为空,则异常终止。您现在已经处理了一个空文件,而不会影响您的处理逻辑。

PERFORM PROCESS-POLICY-MASTER UNTIL END-OF-POLICY-MASTER

或者

PERFORM UNTIL END-OF-POLICY-MASTER
    ....
END-PERFORM

我更喜欢第一个,以避免主要逻辑“传播”,但如果你喜欢/它适合你的课程,可以从第二个开始。

段落中或 END-PERFORM 之前的最后一件事是 READ 的 PERFORM。

然后您可以执行 CLOSE-INPUT-POLICY-MASTER,对输出文件进行类似操作。

然后检查计数是否相等。如果没有,请放弃。在这个例子中这是微不足道的,但随着你的逻辑变得更加复杂,事情可能会出错。

始终提供计数以协调您的输入与输出、计数添加、删除。单独计算更新以获取信息。让你的程序检查它可以做什么。如果您有比输入记录更多的更新,请识别并异常终止。让您的程序进行尽可能多的验证。

您现在将拥有一个简单的程序,它读取文件、写入文件、尽可能多地检查,只是缺少处理逻辑。

您可以将该程序用作读取一个文件和写入另一个文件的所有任务的基础。

所有这些东西都可以在您的新程序中运行,而您无需做任何事情。

您现在需要的逻辑是将数据存储在表中。

好的,正如吉尔伯特正确表明的那样,在您的实际情况下,存储在表格中没有意义。但是,这是要求。你也需要擅长桌子。

您的表定义不正确。尝试这个:

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。

将项目存储在表中后,您需要再次获取它们。再次将索引设置为 1,您可以引用第一个条目。连续设置索引 UP BY 1 以访问其他条目。

在开始处理之前将索引设置为 1。将零移动到表条目的计数。进入您的文件处理循环。

在那里,计算您存储的内容,每当您的表条目计数达到 5 时,执行一段以输出您的记录并将索引设置为 1。如果计数不是 5,则将索引设置为 1。

在要输出记录的段落中,使用 PERFORM VARYING 您的索引从 1 BY 1 直到 GREATER THAN 5。在 PERFORM 中,使用当前表条目作为记录源执行您的 WRITE 段落。

您现在将有两个程序,它们都读取输入文件并生成相同的输出文件。

然后你可以做你的验证逻辑。

如果你把所有东西都分解了,把它们分开,保持简单,把它们命名好,你将开始编写除了特定业务逻辑之外相同的 COBOL 程序。所有标准的东西,所有无聊的东西,如果你喜欢,所有的基本结构都保持不变。您编写的新代码只是下一个任务的细节。

是的,您将阅读更多文件,作为参考文件或作为多个输入。您将有多个输出。但是您可以以完全相同的方式构建所有这些的基础。然后,您将有更多示例作为您未来程序的基础。

一旦你有了基本的东西,你就不需要再编码了。您只需复制并申请。

有了好名字,你的程序就会告诉你它们在做什么。

您实际编写的代码将是“有趣”的东西,而不是您“每次”都做的东西。

我刚刚为你“设计”了这个。它不是唯一可行的设计。我就是这样做的,并且已经这样做了一段时间。您还应该设计处理的每个部分。在编写代码之前,您应该知道它在做什么。

举一个简单的循环为例。想象一下你将如何测试它。表中的条目为零,会发生什么?带一个?有中间数?比最大值少一?最大值?比最大值多一个?超过最大值10?然后编写代码,知道您需要知道如何处理这些情况。

随着时间的推移,您会在编写代码时考虑低级设计。在更多的时间里,你也会以这种方式进行高级设计。在足够的时间里,你只会设计你以前不需要处理的东西,其余的你已经知道了。

你有教科书、课程笔记、手册、编辑器、JCL 和计算机。我给了你一些想法。看看它们是否对你有用。我想你现在有些沮丧。编写一些基本程序,然后将它们应用到您的任务中。

于 2013-11-15T01:32:10.467 回答