求下述Easytrieve REPORT语句在COBOL中的替代实现
Easytrieve报表代码的COBOL等效实现解释
原Easytrieve代码功能解析(中文翻译)
这段Easytrieve代码用于生成一份分组汇总报表,具体逻辑如下:
- 报表名称为
RPT2,输出目标为打印机PRT2 - 启用汇总模式,基于汇总文件、交易数据和控制规则生成报表,同时保留明细数据副本
- 数据按
EXT-FUND-NO(外部基金编号)、EXT-TRAN-CODE(外部交易代码)排序,并以此两个字段作为分组控制键 - 报表每行输出分组的基金编号、交易代码、该组的记录总数(
TALLY),以及加元价格、股份数量、实际金额字段
COBOL替代实现代码
以下是对应功能的COBOL代码,分模块说明:
1. 环境部
定义输入文件、排序文件和打印机输出:
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO "INPUT.DAT" ORGANIZATION IS LINE SEQUENTIAL. SELECT SORTED-FILE ASSIGN TO "SORTED.DAT" ORGANIZATION IS LINE SEQUENTIAL. SELECT PRINTER-FILE ASSIGN TO PRT2 ORGANIZATION IS LINE SEQUENTIAL. SELECT SORT-FILE ASSIGN TO SORTWK01 ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-SORT-STATUS.
2. 数据部
定义数据结构、汇总变量和报表格式:
DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 INPUT-RECORD. 05 EXT-FUND-NO PIC X(10). 05 EXT-TRAN-CODE PIC X(05). 05 EXT-CAN-PRICE PIC 9(05)V99. 05 EXT-NO-SHARES PIC 9(08). 05 EXT-REAL-AMT PIC 9(07)V99. FD SORTED-FILE. 01 SORTED-RECORD PIC X(32). *> 长度与INPUT-RECORD一致 FD PRINTER-FILE. 01 PRINTER-RECORD PIC X(80). SD SORT-FILE. 01 SORT-RECORD. 05 EXT-FUND-NO-S PIC X(10). 05 EXT-TRAN-CODE-S PIC X(05). 05 REST-OF-RECORD PIC X(17). WORKING-STORAGE SECTION. 01 WS-CONTROL-VARS. 05 WS-PREV-FUND-NO PIC X(10) VALUE SPACES. 05 WS-PREV-TRAN-CODE PIC X(05) VALUE SPACES. 05 WS-TALLY PIC 9(04) VALUE ZERO. 05 WS-SORT-STATUS PIC X(02) VALUE SPACES. 01 WS-REPORT-LINE. 05 FILLER PIC X(05) VALUE SPACES. 05 WS-FUND-NO PIC X(10). 05 FILLER PIC X(03) VALUE SPACES. 05 WS-TRAN-CODE PIC X(05). 05 FILLER PIC X(03) VALUE SPACES. 05 WS-TALLY-DISP PIC ZZ99. 05 FILLER PIC X(03) VALUE SPACES. 05 WS-CAN-PRICE PIC $$999.99. 05 FILLER PIC X(03) VALUE SPACES. 05 WS-NO-SHARES PIC Z,ZZZ,ZZ9. 05 FILLER PIC X(03) VALUE SPACES. 05 WS-REAL-AMT PIC $$999,999.99.
3. 过程部
实现排序、分组汇总和报表输出逻辑:
PROCEDURE DIVISION. MAIN-LOGIC. PERFORM SORT-INPUT-DATA. PERFORM PROCESS-SORTED-DATA. STOP RUN. SORT-INPUT-DATA. SORT SORT-FILE ON ASCENDING KEY EXT-FUND-NO-S ON ASCENDING KEY EXT-TRAN-CODE-S USING INPUT-FILE GIVING SORTED-FILE IF WS-SORT-STATUS NOT = '00' DISPLAY "SORT FAILED WITH STATUS: " WS-SORT-STATUS STOP RUN. PROCESS-SORTED-DATA. OPEN INPUT SORTED-FILE OUTPUT PRINTER-FILE. READ SORTED-FILE AT END MOVE 'Y' TO WS-END-OF-FILE. PERFORM UNTIL WS-END-OF-FILE = 'Y' MOVE EXT-FUND-NO TO WS-FUND-NO MOVE EXT-TRAN-CODE TO WS-TRAN-CODE. *> 初始化分组计数器 MOVE 1 TO WS-TALLY. *> 读取同组后续记录 PERFORM READ-NEXT-RECORD UNTIL EXT-FUND-NO NOT = WS-PREV-FUND-NO OR EXT-TRAN-CODE NOT = WS-PREV-TRAN-CODE OR WS-END-OF-FILE = 'Y'. *> 填充并输出报表行 MOVE WS-TALLY TO WS-TALLY-DISP MOVE EXT-CAN-PRICE TO WS-CAN-PRICE MOVE EXT-NO-SHARES TO WS-NO-SHARES MOVE EXT-REAL-AMT TO WS-REAL-AMT MOVE WS-REPORT-LINE TO PRINTER-RECORD WRITE PRINTER-RECORD. *> 更新上一组控制键 MOVE EXT-FUND-NO TO WS-PREV-FUND-NO MOVE EXT-TRAN-CODE TO WS-PREV-TRAN-CODE. END-PERFORM. CLOSE SORTED-FILE PRINTER-FILE. READ-NEXT-RECORD. READ SORTED-FILE AT END MOVE 'Y' TO WS-END-OF-FILE NOT AT END ADD 1 TO WS-TALLY.
内容的提问来源于stack exchange,提问作者mahesh
相关产品推荐
相关产品推荐

