在COBOL中输出带有子标题的报告

时间:2014-10-30 00:58:02

标签: cobol gnucobol

输入文件的格式如下:

Region  ******* Company Name  
  A               
  B            
  C            
  A          
  C      

有很多行。
我需要获取一个输出文件来重新排列文件,如下所示:

Company in Region A:  
name  
name  
name...  

Company in Region B:  
name  
name  
name..  

Company in Region C:  
name  
name  
name..  

我的问题是因为输入文件中的区域没有排序。如何将第二个A区公司添加回标题“A区公司”?我只能读取一次文件(我不能先用区域A做所有行,然后重新打开文件再读一遍)。我只能有1个输出文件。

3 个答案:

答案 0 :(得分:3)

您可以使用排序动词和输入/输出程序将文件排序为区域序列。

您可以在Google中找到许多示例。 This ShorExample有一个简短的排序示例, 还有更多信息here 您可能需要input输出程序

排序示例:

PROCEDURE DIVISION. 
000-SORT SECTION. 
010-DO-THE-SORT. 
    SORT SORT-FILE ON ASCENDING KEY SORT-KEY-1 
                   ON DESCENDING KEY SORT-KEY-2 
                   USING INPUT-FILE 
                   OUTPUT PROCEDURE IS 200-WRITE-OUTPUT 
                                  THRU 230-DONE-OUTPUT. 
    DISPLAY "END OF SORT". 
    STOP RUN. 
200-WRITE-OUTPUT SECTION. 
210-OPEN-OUTPUT. 
    OPEN OUTPUT OUTPUT-FILE. 
220-GET-SORTED-RECORDS. 
    RETURN SORT-FILE AT END 
        CLOSE OUTPUT-FILE 
        GO TO 230-DONE-OUTPUT. 
    MOVE SORT-RECORD TO OUTPUT-RECORD. 
    WRITE OUTPUT-RECORD. 
    GO TO 220-GET-SORTED-RECORDS. 
230-DONE-OUTPUT SECTION. 
240-EXIT-OUTPUT. 
    EXIT. 

答案 1 :(得分:1)

如果你正在做作业,请记住,家庭作业的目标不是解决问题,而是要证明你已经学习了课程材料。因此,如果这是家庭作业,请根据您的教学内容创建自己的解决方案。如果您正在尝试解决现实生活中的问题,下面的示例可能会帮助您找到正确的方向。如果您没有使用输出程序教授排序,您不希望使用下面的示例来完成您的作业。也就是说,以下程序使用GNUCobol显示的示例数据。请特别注意SORT如何使用段落OUTPUT-CO-BY-REGION-REPORT。

---样本数据文件COMPANY.DAT ---

的内容
A WAL-MART
B EXXON
C CHEVRON
B BERKSHIRE
A APPLE
C GENERAL MOTORS

   IDENTIFICATION DIVISION.
   PROGRAM-ID. COMPANY-BY-REGION.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.

   SELECT COMPANY-FILE
       ASSIGN TO 'COMPANY.DAT'
       ORGANIZATION IS LINE SEQUENTIAL.

   SELECT COMPANY-SORT-FILE
       ASSIGN TO DISK.

   SELECT REGION-REPORT-FILE
       ASSIGN TO 'COMPANY-BY-REGION.RPT'
       ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.

   FD  COMPANY-FILE.
   01  COMPANY-RECORD.
       02  COM-REGION                   PIC X.
       02  FILLER                       PIC X.
       02  COM-NAME                     PIC X(20).

   SD  COMPANY-SORT-FILE.
   01  COMPANY-SORT-RECORD.
       02  SORT-REGION                  PIC X.
       02  FILLER                       PIC X.
       02  SORT-NAME                    PIC X(20).

   FD  REGION-REPORT-FILE.
   01  REGION-REPORT-RECORD             PIC X(20).

   WORKING-STORAGE SECTION.

   01  SORTED-DATA-REMAINS              PIC X VALUE 'Y'.
       88  NO-SORTED-DATA-REMAINS       VALUE 'N'.

   01  WS-SORTED-RECORD.
       02  WS-REGION                    PIC X.
       02  FILLER                       PIC X.
       02  WS-NAME                      PIC X(20).

   01  REGION-REPORT-HEADER.
       02  FILLER PIC X(18) VALUE 'COMPANY IN REGION '.
       02  HEAD-REGION                  PIC X VALUE SPACE.
       02  FILLER                       PIC X VALUE ':'.

   01  REGION-DETAIL.
       02  DET-NAME                     PIC X(20).

   01  PRIOR-REGION                     PIC X.

   PROCEDURE DIVISION.
   WRITE-COMPANY-BY-REGION-REPORT.
       SORT COMPANY-SORT-FILE
           ASCENDING KEY SORT-REGION
                         SORT-NAME
           USING COMPANY-FILE
           OUTPUT PROCEDURE OUTPUT-CO-BY-REGION-REPORT
       STOP RUN
       .

   OUTPUT-CO-BY-REGION-REPORT.
       OPEN OUTPUT REGION-REPORT-FILE
       PERFORM UNTIL NO-SORTED-DATA-REMAINS
           RETURN COMPANY-SORT-FILE INTO WS-SORTED-RECORD 
               AT END SET NO-SORTED-DATA-REMAINS TO TRUE
               NOT AT END
                   PERFORM WRITE-COMPANY-RECORD
       END-PERFORM
       CLOSE REGION-REPORT-FILE
       .

   WRITE-COMPANY-RECORD.
       IF HEAD-REGION = SPACE 
       OR WS-REGION NOT = PRIOR-REGION
           PERFORM PRINT-HEADER
       END-IF
       MOVE WS-NAME TO DET-NAME
       WRITE REGION-REPORT-RECORD FROM REGION-DETAIL
       .

   PRINT-HEADER.
       IF HEAD-REGION NOT = SPACE
           MOVE SPACES TO REGION-REPORT-RECORD 
           WRITE REGION-REPORT-RECORD
       END-IF
       MOVE WS-REGION TO HEAD-REGION
                         PRIOR-REGION
       WRITE REGION-REPORT-RECORD FROM REGION-REPORT-HEADER
       .

答案 2 :(得分:0)

您应该在文件的一次传递中执行此操作。而不是一次只检查一个项目,在单次通过中检查所有项目......