Joined: 08 May 2005 Posts: 26 Topics: 12 Location: pune
Posted: Thu Jun 01, 2006 7:53 am Post subject: filling the missing fields with a value
Hi,
I have an input file like this
2006052 4405A551117386.054009780432805400
2006052 4405A551117386.054009780432805401
2006052 4405A551117386.054009780532905402 AAA
2006052 4405A551117386.054009780667805400 OOB
2006052 40540097963724.054009796372405400 CDF
2006052 40540097963724.054009796372405405 OOB
2006052 40540097963724.054009796372405406
I have to check for 'OOB' value in the particular field , and write that value to records having equal account numbers if that particular field have spaces , account numbers are 4405A551117386 , 40540097963724 as mentioned.Same account number may contain other value in that particular field, as 'AAA' that should not be replaced.
output should look like this
2006052 4405A551117386.054009780432805400 OOB
2006052 4405A551117386.054009780432805401 OOB
2006052 4405A551117386.054009780532905402 AAA
2006052 4405A551117386.054009780667805400 OOB
2006052 40540097963724.054009796372405400 CDF
2006052 40540097963724.054009796372405405 OOB
2006052 40540097963724.054009796372405406 OOB
Please provide me solution in COBOL. _________________ Regards,
Chandu
Joined: 26 Nov 2002 Posts: 12378 Topics: 75 Location: San Jose
Posted: Thu Jun 01, 2006 8:19 am Post subject:
Chandra,
Run a sort step and pull all 'OOB' records into a seperate file. Now read this file and match it against the original file on the Account number and if matched move 'OOB' to the output file.
If 'OOB' records are less you can even load them up in an internal table.
SELECT INPUT-FILE1 ASSIGN TO INFILE1
FILE STATUS IS INPUT-FILE1-STATUS.
SELECT INPUT-FILE2 ASSIGN TO INFILE2
FILE STATUS IS INPUT-FILE2-STATUS.
SELECT REPORT-FILE ASSIGN TO RPTFILE
FILE STATUS IS REPORT-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD INPUT-FILE1
RECORDING MODE IS F
BLOCK CONTAINS 0 CHARACTERS
DATA RECORD IS INPUT-REC1.
01 INPUT-REC1.
05 A PIC X(07).
05 FILLER PIC X(01).
05 B PIC X(14).
05 FILLER PIC X(01).
05 C PIC X(18).
05 FILLER PIC X(01).
05 D PIC X(03).
05 FILLER PIC X(35).
FD INPUT-FILE2
RECORDING MODE IS F
BLOCK CONTAINS 0 CHARACTERS
DATA RECORD IS INPUT-REC2.
01 INPUT-REC2.
05 A PIC X(07).
05 FILLER PIC X(01).
05 B PIC X(14).
05 FILLER PIC X(01).
05 C PIC X(18).
05 FILLER PIC X(01).
05 D PIC X(03).
05 FILLER PIC X(35).
FD REPORT-FILE
RECORDING MODE IS F
BLOCK CONTAINS 0 CHARACTERS
DATA RECORD IS REPORT-LINE.
01 WS-FILE-STATS.
05 INPUT-FILE1-STATUS PIC X(02) VALUE ZERO.
88 INPUT-FILE1-IO-OKAY VALUE '00'.
88 INPUT-FILE1-END VALUE '10'.
05 INPUT-FILE2-STATUS PIC X(02) VALUE ZERO.
88 INPUT-FILE2-IO-OKAY VALUE '00'.
88 INPUT-FILE2-END VALUE '10'.
05 REPORT-FILE-STATUS PIC X(02) VALUE ZERO.
88 REPORT-FILE-IO-OKAY VALUE '00'.
88 REPORT-FILE-END VALUE '10'.
01 WS-FLAGS.
05 INPUT-EOF1-SWITCH PIC X(01) VALUE SPACE.
88 INPUT-NOT-EOF1 VALUE 'Y'.
88 INPUT-EOF1 VALUE 'N'.
05 INPUT-EOF2-SWITCH PIC X(01) VALUE SPACE.
88 INPUT-NOT-EOF2 VALUE 'Y'.
88 INPUT-EOF2 VALUE 'N'.
PROCEDURE DIVISION.
******************************************************************
* *
* P R O C E D U R E D I V I S I O N *
* *
******************************************************************
000-MAINLINE.
******************************************************************
* THIS PROCEDURE CONTROLS MAIN PROCESSING OF THE PROGRAM. *
******************************************************************
D DISPLAY 'ENTRY TO SAMPPGM '.
******************************************************************
* THIS PARAGRAPH PERFORMS ALL NECESSARY HOUSEKEEPING *
* WORK.THIS INCLUDES INITIALIZING WORKING-STORAGE VARIABLES *
* AND OPENING FILES REQUIRED FOR PROGRAM PROCESSING. *
******************************************************************
100-STARTUP.
D DISPLAY '100-STARTUP'.
OPEN INPUT INPUT-FILE1.
EVALUATE INPUT-FILE1-STATUS
WHEN '00'
CONTINUE
WHEN OTHER
DISPLAY '*********** ERROR *******************'
MOVE '100:OPEN FAILED FOR INPUT-FILE' TO ABEND-MSG
MOVE INPUT-FILE1-STATUS TO ABEND-STATUS
DISPLAY "*********** ERROR *******************"
PERFORM 999-ABEND-ERROR THRU 999-ABEND-ERROR-EXIT
END-EVALUATE.
OPEN INPUT INPUT-FILE2.
EVALUATE INPUT-FILE2-STATUS
WHEN '00'
CONTINUE
WHEN OTHER
DISPLAY '*********** ERROR *******************'
MOVE '100:OPEN FAILED FOR INPUT-FILE' TO ABEND-MSG
MOVE INPUT-FILE2-STATUS TO ABEND-STATUS
DISPLAY "*********** ERROR *******************"
PERFORM 999-ABEND-ERROR THRU 999-ABEND-ERROR-EXIT
END-EVALUATE.
OPEN OUTPUT REPORT-FILE.
EVALUATE REPORT-FILE-STATUS
WHEN '00'
CONTINUE
WHEN OTHER
DISPLAY '*********** ERROR *******************'
MOVE '100 :OPEN FAILED FOR REPORT FILE' TO ABEND-MSG
MOVE REPORT-FILE-STATUS TO ABEND-STATUS
DISPLAY '*********** ERROR *******************'
PERFORM 999-ABEND-ERROR THRU 999-ABEND-ERROR-EXIT
END-EVALUATE.
D DISPLAY '100-STARTUP-EXIT'.
100-STARTUP-EXIT.
EXIT.
110-READ-INPUT-FILE1.
******************************************************************
* THIS PROCEDURE *
* CALLS: *
* CALLED BY: 200-PROCESS-DATA *
******************************************************************
D DISPLAY '110-READ-INPUT-FILE1'.
INITIALIZE INPUT-REC1.
READ INPUT-FILE1
AT END
SET INPUT-EOF1 TO TRUE
NOT AT END
IF INPUT-FILE1-STATUS IS EQUAL TO '00'
CONTINUE
ELSE
MOVE '110:READ FAILED FOR INPUT FILE' TO ABEND-MSG
MOVE INPUT-FILE1-STATUS TO ABEND-STATUS
PERFORM 999-ABEND-ERROR THRU 999-ABEND-ERROR-EXIT
END-IF
END-READ.
D DISPLAY '110-READ-INPUT-FILE1-EXIT'.
110-READ-INPUT-FILE1-EXIT.
EXIT.
120-READ-INPUT-FILE2.
******************************************************************
* THIS PROCEDURE *
* CALLS: *
* CALLED BY: 400-PROCESS-DATA *
******************************************************************
D DISPLAY '120-READ-INPUT-FILE2'.
INITIALIZE INPUT-REC2.
READ INPUT-FILE2
AT END
SET INPUT-EOF2 TO TRUE
NOT AT END
IF INPUT-FILE2-STATUS IS EQUAL TO '00'
CONTINUE
ELSE
MOVE '120:READ FAILED FOR INPUT FILE' TO ABEND-MSG
MOVE INPUT-FILE2-STATUS TO ABEND-STATUS
PERFORM 999-ABEND-ERROR THRU 999-ABEND-ERROR-EXIT
END-IF
END-READ.
D DISPLAY '120-READ-INPUT-FILE2-EXIT'.
120-READ-INPUT-FILE2-EXIT.
EXIT.
200-PROCESS-DATA.
******************************************************************
* THIS PROCEDURE CONTROLS THE MAIN PROCESS *
* CALLS: *
* CALLED BY: 000-MAINLINE *
******************************************************************
D DISPLAY '200-PROCESS-DATA'.
SET INPUT-NOT-EOF1 INPUT-NOT-EOF2 TO TRUE.
PERFORM 110-READ-INPUT-FILE1 THRU 110-READ-INPUT-FILE1-EXIT.
PERFORM 120-READ-INPUT-FILE2 THRU 120-READ-INPUT-FILE2-EXIT.
PERFORM UNTIL INPUT-EOF1
PERFORM UNTIL INPUT-EOF2
IF B OF INPUT-REC2 EQUAL B OF INPUT-REC1 OR
B OF INPUT-REC2 NOT EQUAL B OF INPUT-REC1
IF D OF INPUT-REC2 = SPACES
MOVE A OF INPUT-REC2 TO R-A OF REPORT-REC
MOVE B OF INPUT-REC2 TO R-B OF REPORT-REC
MOVE C OF INPUT-REC2 TO R-C OF REPORT-REC
MOVE 'OOB' TO R-D OF REPORT-REC
MOVE SPACES TO REPORT-REC(8:1)
REPORT-REC(42:1)
REPORT-REC(46:35)
WRITE REPORT-LINE FROM REPORT-REC
ELSE
MOVE A OF INPUT-REC2 TO R-A OF REPORT-REC
MOVE B OF INPUT-REC2 TO R-B OF REPORT-REC
MOVE C OF INPUT-REC2 TO R-C OF REPORT-REC
MOVE D OF INPUT-REC2 TO R-D OF REPORT-REC
MOVE SPACES TO REPORT-REC(8:1)
REPORT-REC(42:1)
REPORT-REC(46:35)
WRITE REPORT-LINE FROM REPORT-REC
END-IF
END-IF
PERFORM 120-READ-INPUT-FILE2 THRU
120-READ-INPUT-FILE2-EXIT
END-PERFORM
MOVE SPACES TO B OF INPUT-REC1
B OF INPUT-REC2
PERFORM 110-READ-INPUT-FILE1 THRU
110-READ-INPUT-FILE1-EXIT
END-PERFORM.
D DISPLAY '200-PROCESS-DATA-EXIT'.
200-PROCESS-DATA-EXIT.
EXIT.
300-FINISH.
******************************************************************
* THIS PROCEDURE *
* CALLS: *
* CALLED BY: 000-MAINLINE *
******************************************************************
D DISPLAY '300-FINISH'.
CLOSE INPUT-FILE1.
IF INPUT-FILE1-IO-OKAY
CONTINUE
ELSE
DISPLAY '************************************'
MOVE '800: CLOSE FAILED FOR INPUT FILE' TO ABEND-MSG
MOVE INPUT-FILE1-STATUS TO ABEND-STATUS
DISPLAY '************************************'
PERFORM 999-ABEND-ERROR THRU 999-ABEND-ERROR-EXIT
END-IF.
CLOSE INPUT-FILE2.
IF INPUT-FILE2-IO-OKAY
CONTINUE
ELSE
DISPLAY '************************************'
MOVE '800: CLOSE FAILED FOR INPUT FILE' TO ABEND-MSG
MOVE INPUT-FILE2-STATUS TO ABEND-STATUS
DISPLAY '************************************'
PERFORM 999-ABEND-ERROR THRU 999-ABEND-ERROR-EXIT
END-IF.
CLOSE REPORT-FILE.
IF REPORT-FILE-IO-OKAY
CONTINUE
ELSE
DISPLAY '*********** ERROR *******************'
MOVE '800 :CLOSE FAILED FOR REPORT FILE' TO ABEND-MSG
MOVE REPORT-FILE-STATUS TO ABEND-STATUS
DISPLAY '*********** ERROR *******************'
PERFORM 999-ABEND-ERROR THRU 999-ABEND-ERROR-EXIT
END-IF.
D DISPLAY '800-FINISH-EXIT'.
300-FINISH-EXIT.
EXIT.
999-ABEND-ERROR.
******************************************************************
* THIS PROCEDURE CAUSES THE PROGRAM TO STOP IN THE EVENT OF AN *
* ERROR AND INHIBITS FURTHER PROCESSING. *
* CALLS: STOP-RUN. *
******************************************************************
D DISPLAY '999-ABEND-ERROR'.
DISPLAY '*************ERROR*********************'.
DISPLAY 'SAMPPGM ENCOUNTERED A FATAL ERROR'.
DISPLAY ABEND-MSG.
IF ABEND-STATUS IS NOT = SPACES
DISPLAY 'ABEND-STATUS = ', ABEND-STATUS
END-IF.
PERFORM STOP-RUN.
D DISPLAY '999-ABEND-ERROR-EXIT'.
999-ABEND-ERROR-EXIT.
EXIT.
Joined: 26 Nov 2002 Posts: 12378 Topics: 75 Location: San Jose
Posted: Fri Jun 02, 2006 7:57 am Post subject:
Shekhar123,
The program looks good, but you are missing the Top-down approach. Your program should flow from top to bottom and it will be easier to understand and maintain.
On second thoughts, I just realized that you really don't need 2 files to get the desired results.
Just sort the file on the field B ascending and field D descending. By doing so all the space records are sorted to the bottom for each key.
Now store the 'oob' value and the key value in a working-storage section. Now match the record read from the file to working-storage variables and if the field is a space on the record read just move '00b'.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum