我有一个主文件,主文件中的一条记录在详细文件中将有多条记录。
例如:主文件中的一条记录可能在详细文件中有20条记录。我必须将master与detail的记录计数作为报告进行匹配。
要求更详细的形式:
根据检查主文件和相应详细信息文件中的信息,编写一个程序,在基本报告中提供以下信息。
要求1:对于主服务器上的每个不同银行代码,报告遇到的每个检查状态以及该状态的检查数。例如,银行代码BC有45个未完成的支票。
要求2:对于按银行代码(未付款,无效,已付款等)的每个支票状态,报告与这些状态对应的详细主记录的数量。例如,银行BC只能有1个未完成的支票,对应于详细文件中的45条记录。
您应该可以通过1次传递来对齐检查主机来完成上述操作。
我编写程序来执行上述操作,但我的程序是循环的,并且不存在主文件文件结尾,并且详细文件中的记录计数也不匹配。请帮我解决循环以获得所需的输出而且我不要不知道如何编码要求2。
FILE-CONTROL.
SELECT SIR-MASTER-FILE ASSIGN TO VXSIRCKF
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS SIRM-KEY
FILE STATUS IS SIRM-FILE-STATUS.
SELECT SIR-DETAIL-FILE ASSIGN TO VXSIRDEF
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS SIRD-KEY
FILE STATUS IS SIRD-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD SIR-MASTER-FILE.
01 SIR-MASTER-REC.
02 SIRM-KEY.
03 SIRM-CLIENT PIC X(02).
03 SIRM-PLAN PIC X(02).
03 SIRM-REGION PIC X(02).
03 SIRM-BANK-CODE PIC X(05).
03 SIRM-CK-ACH-NBR PIC 9(10).
03 SIRM-RECORD-NBR PIC 9(05).
03 SIRM-SEQUENCE-NBR PIC 9(02).
02 SIRM-KEY2 PIC X(41).
02 SIRM-KEY3-4.
03 SIRM-KEY3.
05 SIRM-RECIP-CLM PIC X(20).
05 SIRM-KEY4 PIC X(35).
02 SIRM-LRECL PIC 9(04).
02 SIRM-DATA.
03 FILLER PIC X(01)
OCCURS 374 TO 3722 DEPENDING ON SIRM-LRECL.
COPY VXSIRHDR.
FD SIR-DETAIL-FILE.
01 SIR-DETAIL-REC.
02 SIRD-KEY.
03 SIRD-BANK-CODE PIC X(05).
03 SIRD-CHECK-NBR PIC 9(10).
03 SIRD-CLAIM-NBR PIC X(25).
03 SIRD-SEQ-NBR PIC 9(07).
02 SIRD-DATE-MOVED PIC 9(08).
02 SIRD-LRECL PIC 9(04).
02 SIRD-DATA.
03 FILLER PIC X(01)
OCCURS 1 TO 2330 DEPENDING ON SIRD-LRECL.
WORKING-STORAGE SECTION.
01 WS-FILE-STATUS.
05 SIRM-FILE-STATUS PIC X(02).
05 SIRD-FILE-STATUS PIC X(02).
01 WS-WORK-AREA.
05 ABEND-RESULT PIC 9(01).
05 ZERO-VAR PIC 9(01) VALUE 0.
01 EOF-SIRM-SW PIC X(01) VALUE 'N'.
88 EOF-SIRM VALUE 'Y'.
01 EOF-SIRD-SW PIC X(01) VALUE 'N'.
88 EOF-SIRD VALUE 'Y'.
01 WS-TABLE.
02 BANK-INFO OCCURS 500
INDEXED BY B-IDX.
03 WS-BANK-CODES PIC X(05).
02 STATUS-INFO OCCURS 500
INDEXED BY S-IDX.
03 WS-STATUS-CODES PIC X(3).
02 COUNTER PIC 9(5).
01 HEADING-LINE1.
05 FILLER PIC X(20) VALUE SPACES.
05 FILLER PIC X(36) VALUE
'CHECK MASTER VS DETAIL COUNT REPORT '.
01 DESIGN.
05 FILLER PIC X(20) VALUE SPACES.
05 FILLER PIC X(36) VALUE
'************************************'.
01 HEADING-LINE2.
05 FILLER PIC X(5) VALUE SPACES.
05 FILLER PIC X(9) VALUE 'BANK CODE'.
05 FILLER PIC X(1) VALUE SPACES.
05 FILLER PIC X(12) VALUE 'CHECK STATUS'.
05 FILLER PIC X(2) VALUE SPACES.
05 FILLER PIC X(11) VALUE 'STATUS CODE'.
05 FILLER PIC X(2) VALUE SPACES.
05 FILLER PIC X(20) VALUE 'DETAIL NO OF RECORDS'.
01 DETAIL-LINE.
05 FILLER PIC X(5) VALUE SPACES.
05 DET-BANK-CODE PIC X(05).
05 FILLER PIC X(5) VALUE SPACES.
05 DET-CHK-NBR PIC 9(10).
05 FILLER PIC X(5) VALUE SPACES.
05 DET-STATUS-CODE PIC X(3).
05 FILLER PIC X(10) VALUE SPACES.
05 DET-DETAIL-COUNT PIC 9(5).
COPY VXSIRDTL.
PROCEDURE DIVISION.
PERFORM INTALIZATION
PERFORM OPEN-DETAIL
PERFORM PRINT
PERFORM INIT
PERFORM TERMINATION
GOBACK.
INTALIZATION.
OPEN INPUT SIR-MASTER-FILE
IF SIRM-FILE-STATUS IS NOT EQUAL TO '00'
THEN
GO TO ERROR-EXIT
END-IF.
OPEN-DETAIL.
OPEN INPUT SIR-DETAIL-FILE
IF SIRD-FILE-STATUS IS NOT EQUAL TO '00'
THEN
GO TO ERROR-EXIT
END-IF.
PRINT.
DISPLAY HEADING-LINE1.
DISPLAY DESIGN.
DISPLAY HEADING-LINE2.
INIT.
INITIALIZE WS-TABLE.
SET B-IDX TO 1.
SET S-IDX TO 1.
PERFORM READ-PAR
PERFORM LOAD .
PERFORM UNTIL EOF-SIRM
MOVE SIRM-BANK-CODE TO WS-BANK-CODES(B-IDX)
SET B-IDX UP BY 1
MOVE SIR-STATUS-CODE TO WS-STATUS-CODES(S-IDX)
SET S-IDX UP BY 1
MOVE 'N' TO EOF-SIRD-SW
PERFORM UNTIL EOF-SIRD
PERFORM READ-DETAIL
IF SIRM-BANK-CODE = SIRD-BANK-CODE AND
SIRM-CK-ACH-NBR = SIRD-CHECK-NBR
THEN
ADD 1 TO COUNTER
ELSE
MOVE SIRM-BANK-CODE TO DET-BANK-CODE
MOVE SIRM-CK-ACH-NBR TO DET-CHK-NBR
MOVE SIR-STATUS-CODE TO DET-STATUS-CODE
MOVE COUNTER TO DET-DETAIL-COUNT
DISPLAY DETAIL-LINE
MOVE 0 TO COUNTER
MOVE 'Y' TO EOF-SIRD-SW
END-IF
END-PERFORM
PERFORM READ-PAR
END-PERFORM.
TERMINATION.
CLOSE SIR-MASTER-FILE.
CLOSE SIR-DETAIL-FILE.
READ-PAR.
READ SIR-MASTER-FILE NEXT RECORD
AT END
MOVE 'Y' TO EOF-SIRM-SW
DISPLAY '*******************************************'
NOT AT END
IF SIRM-FILE-STATUS IS NOT EQUAL TO '00'
THEN
GO TO ERROR-EXIT
END-IF
END-READ.
READ-DETAIL.
READ SIR-DETAIL-FILE NEXT RECORD
AT END
MOVE 'Y' TO EOF-SIRD-SW
NOT AT END
IF SIRD-FILE-STATUS IS NOT EQUAL TO '00'
THEN
GO TO ERROR-EXIT
END-IF
END-READ.
ERROR-EXIT.
DISPLAY 'INSIDE ERROR '
DISPLAY '*************************************************'.
DISPLAY '* PROGRAM1 IS ABENDING ABNORMALLY *'.
DISPLAY '*************************************************'.
COMPUTE ABEND-RESULT = 1 / ZERO-VAR.
END-ERROR.
the values in the detail record is wrong in the below result
CHECK MASTER VS DETAIL COUNT REPORT
************************************
BANK CODE CHECK STATUS STATUS CODE DETAIL NO OF RECORDS
BC 2100000074 000 00079
BC 2100000074 902 00000
BC 2100000074 902 00000
BC 2100000074 902 00000
BC 2100000075 000 00014
BC 2100000075 903 00000
BC 2100000076 000 00049
BC 2100000076 902 00000
BC 2100000076 902 00000
BC 2100000077 000 00014
BC 2100000077 902 00000
BC 2100000078 000 00051
BC 2100000078 902 00000
BC 2100000078 902 00000
BC 2100000078 902 00000
BC 2100000079 000 00610
BC 2100000079 902 00000
BC 2100000079 902 00000
BC 2100000079 902 00000
BC 2100000079 902 00000
BC 2100000079 902 00000
BC 2100000079 902 00000
BC 2100000079 902 00000
BC 2100000079 902 00000
BC 2100000079 902 00000