需要看看我是否可以使用我的读取语句来完成3种类型的输出?

时间:2014-04-08 21:47:06

标签: cobol

我被要求编写程序来处理 2个输入文件(客户和员工),匹配两个文件的键并生成以下 3个输出文件:< / p>

  • 文件-1:两个文件
  • 上的记录
  • 文件-2:客户文件中的记录,但不包含员工文件
  • 文件-3:员工文件中的记录,但不包含客户文件

设置我的循环,以便它针对员工文件中的每条记录检查客户文件中的一条记录,然后从获取另一个密钥对值客户文件并启动该过程。

目前:

  1. 匹配记录 - 必须位于File1和File2(此方法)
  2. 在File1中但不在File2中的记录(不工作)
  3. File2中的记录但不在File1(不工作)
  4. 问题:有没有办法使用与我目前同时完成所有任务相同的读取段落,而无需为每个文件比较类型重新运行JCL

    我发布的代码仅适用于匹配的案例

    代码:(记录布局 - 这一切都有效)

    01  MAIN-LINE1.                                  
        05 FILLER               PIC X(03). <-- won't use in comparison          
        05 ID-1                 PIC X(09).           
        05 FILLER               PIC X(01).           
        05 KEY-1                PIC X(20).           
        05 FILLER               PIC X(47).           
    
    01  MAIN-LINE2.                                  
        05 ID-2                 PIC X(09).           
        05 FILLER               PIC X(55).           
        05 KEY-2                PIC X(20).           
        05 FILLER               PIC X(66).           
    

    阅读以下陈述。这是从一个Perform Match-Infile1中调用的......它确实有效。

    以下代码适用于文件中的匹配情况。

    MATCH-INFILE1.                                                   
        READ INFILE1 INTO MAIN-LINE1                                 
           AT END                                                    
              MOVE 'Y' TO EOF1                                       
              GO TO X-INFILE1                                        
           NOT AT END                                                
              PERFORM READ-INFILE2 THRU X-INFILE2 UNTIL EOF2 = 'Y'   
        END-READ.                                                    
    X-INFILE1. EXIT.                                                 
    
    READ-INFILE2.                                                    
        READ INFILE2 INTO MAIN-LINE2                                 
          AT END                                                     
             MOVE 'Y' TO EOF2                                        
             GO TO X-INFILE2                                         
          NOT AT END                                                 
    
             PERFORM COMP-FILE THRU X-COMP-FILE  <-- I did not include this because 
                                                     I forgot to but can add it in in 
                                                     the morning when I have access 
                                                     to the mainframe. (simple compare)                     
        END-READ.                                                    
    X-INFILE2. EXIT.
    

    记录布局

    客户布局:

    **107458982**       ****FM00000000000713432****CH   <-- discard the CH
    

    员工布局: (丢弃SD两字节字段)

    SD  **331067113**  **FFM00000000004556402**
    

1 个答案:

答案 0 :(得分:2)

我认为用你当前的代码完成所有三项任务是不可能的。如果文件包含 1,000,000条记录,会发生什么情况。您将读取 1,000,000次的文件。 永远完成(假设硬盘存活)。


对于这种类型的处理,我建议进行排序合并过程:

  • 将文件排序为按键顺序
  • 对2个文件执行合并(对于3个文件,流程类似,您只有更复杂的评估)。

按键顺序中2个文件的处理逻辑变为:

 while not eof
    evaluate true
       when key-file1 < key-file2
         Write file1-record to output-file-2
         read file1
       when key-file1 > key-file2
         Write file2-record to output-file-3
         read file2
       when key-file1 = key-file2
            /* match processing, 
               will involve reading at least one of the files */     
            move key-file1              to hold-key
            while key-file1 =  hold-key
               Write Output-File-1
               read file1
            end
            while key-file2 =  hold-key
               read file2
            end
      end
 end

中将添加文件结尾逻辑

注意:从问题中不清楚应该如何处理同一个密钥的多个条目