IDENTIFICATION DIVISION.  
PROGRAM-ID. CLBLHO2CJ-V. 
AUTHOR.     GO, CATHRINA JANE B.
      *>*********************************************************    
      *> PROGRAM ID CLBLHO2CJ-V                                          
      *> PURPOSE : VALIDARE ENROLLEE FILE            
      *> DATASETS USED :                                             
      *>   TRAN-FILE : INPUT                                         
      *>   PROV-FILE : OUTPUT                                        
      *> REPORTS:                                                    
      *>   UPDATE REGISTER: OUTREP-FILE                              
      *> AMENDMENT HISTORY                                           
      *> PROG          DATE              DESCRIPTION                 
      *> AAV           2022/10/20        INITIAL CODE                
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
 SOURCE-COMPUTER.     JDOODLE.
 OBJECT-COMPUTER.     BPI-MF.
INPUT-OUTPUT SECTION.
            

FILE-CONTROL.
 SELECT STUD-FILE ASSIGN TO "/uploads/mp.txt"
                 ORGANIZATION IS LINE SEQUENTIAL
                 ACCESS IS SEQUENTIAL
                 FILE STATUS IS STUD-STAT.
 SELECT VALIDATED ASSIGN TO "/myfiles/Enrollee-Validated-Upload-File.txt" 
                 ORGANIZATION IS LINE SEQUENTIAL
                 ACCESS IS SEQUENTIAL
                 FILE STATUS IS VALIDATED-STAT.
 SELECT PROOFLIST-REPORT ASSIGN TO "/myfiles/Validation-Prooflist.txt" 
                 ORGANIZATION IS LINE SEQUENTIAL
                 ACCESS IS SEQUENTIAL
                 FILE STATUS IS PROOFLIST-REPORT-STAT.                 
                 

DATA DIVISION.
FILE SECTION.
FD   STUD-FILE
        BLOCK CONTAINS 0
        RECORD CONTAINS 200
        LABEL RECORDS OMITTED.
01      STUD-REC.
        05 Header-Date.   
           10 Stud-HD-YYYY     PIC X(04).
           10 Stud-HD-MM       PIC X(02).
           10 Stud-HD-DD       PIC X(02).
           10 FILLER           PIC X(108).
        05 STUD-INPUT-REC REDEFINES Header-Date. 
          10 Stud-School       PIC X(25).
          10 Stud-Number       PIC 9(06).
          10 Stud-TransCode    PIC X(01).
          10 Stud-Name.        
             15 Stud-Surname   PIC X(20).
             15 Stud-FirstName PIC X(20).
             15 Stud-MI        PIC X(02).
          10 Stud-ContacInfo   PIC X(18).
          10 Stud-DateofBirth.  
             15 DOB-YYYY       PIC X(04).
             15 DOB-MM         PIC X(02).
             15 DOB-DD         PIC X(02).
          10 Stud-Course       PIC X(16).
     
FD   VALIDATED
        BLOCK CONTAINS 0
        RECORD CONTAINS 200
        LABEL RECORDS OMITTED.
        
01      STUD-VALIDATED-REC.
        05 Stud-Validated-Header-Date.   
          10 Stud-Validated-Date  PIC X(08).
          10 FILLER               PIC X(108).
          05 Stud-Validated-Details-Record REDEFINES Stud-Validated-Header-Date.    
          10 Stud-Validated-School       PIC X(25).
          10 Stud-Validated-Number       PIC 9(06).
          10 Stud-Validated-TransCode    PIC X(01).
          10 Stud-Validated-Name.        
             15 Stud-Validated-Surname   PIC X(20).
             15 Stud-Validated-FirstName PIC X(20).
             15 Stud-Validated-MI        PIC X(02).
          10 Stud-Validated-ContacInfo   PIC X(18).
          10 Stud-Validated-DateofBirth  PIC X(08).
          10 Stud-Validated-Course       PIC X(16).
        
FD   PROOFLIST-REPORT
        BLOCK CONTAINS 0
        RECORD CONTAINS 200
        LABEL RECORDS OMITTED.

01      STUD-REPREC.
        05 PROOFLIST-REC PIC X(132).
                
WORKING-STORAGE SECTION.
77      FILLER         PIC X(72)   VALUE
       'THIS IS THE START OF WORKING-STORAGE'.

01      WS-VAR2.
        05 STUD-STAT        PIC X(02)   VALUE SPACES.
        05 VALIDATED-STAT   PIC X(02)   VALUE SPACES.  
        05 PROOFLIST-REPORT-STAT  PIC X(02)   VALUE SPACES. 
        05 VALID-FLAG       PIC X       VALUE 'N'.
        05 STUD-HEADER      PIC 9(08).
        05 STUD-DOB         PIC 9(08).
        05 STUD-DOB-YYYY    PIC 9(04).
        05 STUD-YYYY         PIC 9(04).
        05 highdd           pic x(02).  
        05 WS-YYYY          PIC 9(04).
        05 CURR-DATE        PIC 9(08).
        05 TOTALNO        PIC 9(8)V99.
        05 EOF-SW         PIC X       VALUE 'N'.
              88 END-FILE VALUE 'Y'.
       
01      REMARKS-ARR OCCURS 09 TIMES.
        05 REMARKS      PIC X(26).
        
77      LINE-COUNT PIC 99 VALUE 00.
77      PAGE-COUNT PIC 99 VALUE 0000.
77      current-record PIC 99 VALUE 00.
77      TREAD-COUNT  PIC 99 VALUE 00.
77      INVALID-COUNT  PIC 99 VALUE 00.
77      VALID-COUNT  PIC 99 VALUE 00.
77      AGE  PIC 99 VALUE 00.
77      z  PIC 99 VALUE 00.
77      y  PIC 99 VALUE 00.
77      x  PIC 99 VALUE 00.
77      z1  PIC 99 VALUE 00.
77      y1  PIC 99 VALUE 00.
77      x1  PIC 99 VALUE 00.
77      INDEX-CTR PIC 99 VALUE 00.

01   WS-DATE.
     05 WS-DATE-YYYY     PIC X(04).  
     05 WS-DATE-MM       PIC X(02).
     05 WS-DATE-DD       PIC X(02). 

01   WS-LITERAL-CONSTANTS.
     05 WS-ERROR-HEADER          PIC X(80) 
      VALUE 'CBLHO2 : Error in file : CBLHO2I1 '.  
     05 WS-ERROR-STATUS-CODE     PIC X(30) 
     VALUE 'CBLHO2: File Status is'.  
     05 WS-ERROR-STATUS-CODE1    PIC X(80) 
     VALUE 'CBLHO2: Processing Terminated'.  
     05 WS-NORMAL-PROCESSING     PIC X(30) 
     VALUE 'CBLHO1CJ successfully executed'.
     05 WS-ERROR-HEADER1          PIC X(30) 
      VALUE 'INVALID HEADER RECORD - '.  
     05 WS-ERROR-HEADER2     PIC X(80) 
     VALUE 'NVALID HEADER RECORD - HEADER-DATE MUST <= CURRENT DATE '.  
     05 WS-ERROR-HEADER3    PIC X(30) 
     VALUE 'PROCESSING TERMINATED'. 
     05 WS-ERROR-INVALID   PIC X(30) 
     VALUE 'has invalid format'. 
     05 WS-ERROR-INVALID1   PIC X(30) 
     VALUE 'is required'. 
     
01  WS-DTL3.
    05 FILLER        PIC X(96) VALUE SPACES.
    05 DTL-REMARKS3  PIC X(26).
01  WS-DTL4.
    05 FILLER        PIC X(96) VALUE SPACES.
    05 DTL-REMARKS4  PIC X(26).
01  WS-DTL5.
    05 FILLER        PIC X(96) VALUE SPACES.
    05 DTL-REMARKS5  PIC X(26).
01  WS-DTL6.
    05 FILLER        PIC X(96) VALUE SPACES.
    05 DTL-REMARKS6  PIC X(26).
01  WS-DTL7.
    05 FILLER        PIC X(96) VALUE SPACES.
    05 DTL-REMARKS7  PIC X(26).    
01  WS-DTL8.
    05 FILLER        PIC X(96) VALUE SPACES.
    05 DTL-REMARKS8  PIC X(26). 
01  WS-DTL9.
    05 FILLER        PIC X(96) VALUE SPACES.
    05 DTL-REMARKS9  PIC X(26). 
    
    

01   PROOFLIST-HEAD1.
     05 FILLER   PIC X(17) VALUE 'PROGRAM :CBLHO2CJ'.
     05 FILLER   PIC X(21) VALUE SPACES.
     05 FILLER   PIC X(19) VALUE 'MINERVA POLYTECHNIC'.
     05 FILLER          PIC X(40) VALUE  'PAGE '. 
     05 PAGE-NO         PIC ZZ99.
 
01   PROOFLIST-HEAD2.
     05 TODAY-DATE-MM   PIC X(02).
     05 FILLER          PIC X(01) VALUE '/'.
     05 TODAY-DATE-DD   PIC X(02).
     05 FILLER          PIC X(01) VALUE '/'.
     05 TODAY-DATE-YYYY PIC X(04).
     05 FILLER          PIC X(29) VALUE SPACES.
     05 FILLER          PIC X(20) 
        VALUE  'VALIDATION PROOFLIST'.

01   PROOFLIST-HEAD3.
     05 FILLER          PIC X(03) VALUE SPACES.
     05 FILLER          PIC X(03) VALUE  'EMP'.     
     05 FILLER          PIC X(03) VALUE SPACES.
     05 FILLER          PIC X(02) VALUE  'TC'.    
     05 FILLER          PIC X(30) VALUE SPACES.
     05 FILLER          PIC X(13) VALUE  'STUDENT NAME/'.   
     05 FILLER          PIC X(35) VALUE SPACES.
     05 FILLER          PIC X(05) VALUE  'BIRTH'. 
     05 FILLER          PIC X(11) VALUE SPACES.
     05 FILLER          PIC X(35) VALUE  'COURSE'. 
     05 FILLER          PIC X(10) VALUE SPACES.
     05 FILLER          PIC X(40) VALUE  'REMARKS'.

01   PROOFLIST-HEAD4.
     05 FILLER          PIC X(03) VALUE SPACES.
     05 FILLER          PIC X(03) VALUE  'NUM'.     
     05 FILLER          PIC X(32) VALUE SPACES.
     05 FILLER          PIC X(28) VALUE  'CONTACT INFORMATION'.   
     05 FILLER          PIC X(24) VALUE SPACES.
     05 FILLER          PIC X(04) VALUE  'DATE'. 
  
01   PROOFLIST-DETAIL1.
     05 ASTERISK-STUD-NO     PIC X(01).
     05 PROOFLIST-STUD-NO    PIC 9(06).       
     05 FILLER               PIC X(02) VALUE SPACES.
     05 ASTERISK-STUD-TC     PIC X(01).
     05 PROOFLIST-STUD-TC    PIC X(01).       
     05 FILLER               PIC X(03) VALUE SPACES.
     05 ASTERISK-STUD-LNAME   PIC X(01). 
     05 PROOFLIST-STUD-LNAME  PIC X(20).  
     05 FILLER               PIC X(01) VALUE SPACES.
     05 ASTERISK-STUD-FNAME PIC X(01). 
     05 PROOFLIST-STUD-FNAME PIC X(20).  
     05 FILLER               PIC X(01) VALUE SPACES.
     05 ASTERISK-STUD-MI     PIC X(01). 
     05 PROOFLIST-STUD-MI    PIC X(02).
     05 FILLER               PIC X(01) VALUE SPACES.
     05 FILLER               PIC X(02) VALUE SPACES.
     05 ASTERISK-STUD-DOB    PIC X(01).
     05 PROOFLIST-STUD-DOB   PIC X(08).  
     05 FILLER               PIC X(15) VALUE SPACES.     
     05 ASTERISK-STUD-COURSE  PIC X(01).
     05 PROOFLIST-STUD-COURSE PIC X(16).
     05 FILLER               PIC X(09) VALUE SPACES.     
     05 PROOFLIST-REMARKS1    PIC X(50).
 01   PROOFLIST-DETAIL2.
     05 FILLER            PIC X(14).
     05 ASTERISK-STUD-CI     PIC X(01).
     05 PROOFLIST-STUD-CI    PIC X(18).
     05 FILLER            PIC X(40).
     05 PROOFLIST-REMARKS2 PIC X(50).
 01   PROOFLIST-DETAIL3.
     05 FILLER            PIC X(134).
     05 PROOFLIST-REMARKS3 PIC X(50).
 01   PROOFLIST-DETAIL4.
     05 FILLER            PIC X(134).
     05 PROOFLIST-REMARKS4 PIC X(50).
 01   PROOFLIST-DETAIL5.
     05 FILLER            PIC X(134).
     05 PROOFLIST-REMARKS5 PIC X(50).
 01   PROOFLIST-DETAIL6.
     05 FILLER            PIC X(134).
     05 PROOFLIST-REMARKS6 PIC X(50).
 01   PROOFLIST-DETAIL7.
     05 FILLER            PIC X(134).
     05 PROOFLIST-REMARKS7 PIC X(50).
   01   PROOFLIST-DETAIL8.
     05 FILLER            PIC X(134).
     05 PROOFLIST-REMARKS8 PIC X(50).   
 01   PROOFLIST-DETAIL9.
     05 FILLER            PIC X(134).
     05 PROOFLIST-REMARKS9 PIC X(50).
 01   PROOFLIST-DETAIL10.
     05 FILLER            PIC X(134).
     05 PROOFLIST-REMARKS10 PIC X(50).     
     





01 PROOFLIST-TOTAL-READ.
   05 FILLER                        PIC X(14).
   05 FILLER                        PIC X(38) 
      VALUE 'TOTAL NUMBER OF RECORDS READ         :'.
   05 READ-COUNTER                 PIC 9(03).
     

01 PROOFLIST-VALID.
   05 FILLER                        PIC X(14).
   05 FILLER                        PIC X(40) 
      VALUE 'TOTAL NUMBER OF VALID RECORDS         :'.
   05 VALID-COUNTER                 PIC 9(03).

01 PROOFLIST-INVALID.
   05 FILLER                        PIC X(14).
   05 FILLER                        PIC X(38) 
      VALUE 'TOTAL NUMBER OF INVALID RECORDS: '.
   05 INVALID-COUNTER               PIC 9(03).

01 PROOFLIST-LASTPAGE.
   02 FILLER                        PIC X(60).
   02 FILLER                        PIC X(30) VALUE '--END OF REPORT—'.
     
PROCEDURE DIVISION.
0000-MAIN.
    ACCEPT WS-DATE FROM DATE YYYYMMDD
    MOVE WS-DATE-MM TO TODAY-DATE-MM
    MOVE WS-DATE-DD TO TODAY-DATE-DD
    MOVE WS-DATE-YYYY TO TODAY-DATE-YYYY
    OPEN INPUT STUD-FILE
    IF STUD-STAT NOT = '00' THEN
       DISPLAY WS-ERROR-STATUS-CODE
       DISPLAY WS-ERROR-STATUS-CODE1, STUD-STAT
       DISPLAY WS-ERROR-STATUS-CODE1
       STOP RUN
    END-IF
    OPEN OUTPUT VALIDATED
    IF VALIDATED-STAT NOT = '00' THEN
      DISPLAY WS-ERROR-STATUS-CODE
      DISPLAY WS-ERROR-STATUS-CODE1, VALIDATED-STAT
      DISPLAY WS-ERROR-STATUS-CODE
      STOP RUN
    END-IF
     OPEN OUTPUT PROOFLIST-REPORT
    IF PROOFLIST-REPORT-STAT NOT = '00' THEN
      DISPLAY WS-ERROR-STATUS-CODE
      DISPLAY WS-ERROR-STATUS-CODE1,  PROOFLIST-REPORT-STAT
      DISPLAY WS-ERROR-STATUS-CODE
      STOP RUN
    END-IF
    PERFORM 1000-VALIDATE-HEADING
    DISPLAY WS-NORMAL-PROCESSING
    CLOSE STUD-FILE VALIDATED PROOFLIST-REPORT
    STOP RUN.
0000-EXIT.    
    EXIT.
     
1000-VALIDATE-HEADING.
    READ STUD-FILE 
         AT END 
         SET END-FILE TO TRUE
    END-READ
    PERFORM 1100-VALIDATE-HEADER-DATE
    IF VALID-FLAG = 'Y' THEN
    PERFORM 1200-VALIDATE-RECORDS
    END-IF.
1000-EXIT.
    EXIT.

1100-VALIDATE-HEADER-DATE.
     MOVE STUD-HD-YYYY TO STUD-YYYY
     MOVE Header-Date TO STUD-HEADER
     IF Header-Date = SPACES  THEN
       DISPLAY WS-ERROR-HEADER1, 'HEADER-DATE REQUIRED'
       DISPLAY WS-ERROR-HEADER3
     ELSE
      IF STUD-HEADER IS NOT NUMERIC AND STUD-HEADER IS NOT ALPHABETIC THEN 
      DISPLAY WS-ERROR-HEADER1,  'HEADER-DATE IS NOT NUMERIC'
      DISPLAY WS-ERROR-HEADER3
       ELSE
      IF STUD-HEADER IS ALPHABETIC THEN 
      DISPLAY WS-ERROR-HEADER1,  'HEADER-DATE IS NOT NUMERIC'
      DISPLAY WS-ERROR-HEADER3
      ELSE
      IF STUD-HEADER < FUNCTION LENGTH(STUD-HEADER) THEN
      DISPLAY WS-ERROR-HEADER1,  'HEADER-DATE LENGTH INVALID'
      DISPLAY WS-ERROR-HEADER3  
      ELSE
      PERFORM 1110-VALIDATE-DATE
      END-IF
      END-IF
       END-IF
      END-IF.
1100-EXIT.
    EXIT.
    
1110-VALIDATE-DATE.
IF STUD-HD-YYYY >= '1800' and  STUD-HD-YYYY <= 9999 THEN
          IF  STUD-HD-MM = '01' OR '03' OR '05' OR '07' OR '08' OR '10' OR '12' 
           IF  STUD-HD-DD <= 31
         MOVE 'Y' TO VALID-FLAG
        ELSE
        DISPLAY WS-ERROR-HEADER1,  'INVALID DAY FORMAT'
        DISPLAY WS-ERROR-HEADER3
         END-IF
   ELSE
       IF STUD-HD-MM =  '04' OR '06' OR '09' OR '11'
        IF STUD-HD-DD <= 30 
        MOVE 'Y' TO VALID-FLAG
     END-IF
           ELSE
           DISPLAY WS-ERROR-HEADER1,  'INVALID DAY FORMAT'
           DISPLAY WS-ERROR-HEADER3
         END-IF
   ELSE
      IF STUD-HD-MM = '02' then
*>      checking of leap year
          DIVIDE STUD-YYYY BY 400 GIVING z REMAINDER z1
           IF z1 = 0 
              MOVE 29 TO highdd 
           ELSE
            DIVIDE  STUD-YYYY BY 4 GIVING y REMAINDER y1
           IF y1 = 0 
            DIVIDE  STUD-YYYY BY 100 GIVING x REMAINDER x1
             IF x1 = 0
                   MOVE '28' TO highdd 
               ELSE 
                    MOVE '29' TO highdd 
             
         IF STUD-HD-DD <= highdd then
         IF Header-Date <= WS-DATE
          MOVE 'Y' TO VALID-FLAG
            ELSE
            DISPLAY WS-ERROR-HEADER1,  'INVALID DAY FORMAT'
            DISPLAY WS-ERROR-HEADER3
     END-IF
   ELSE
            DISPLAY WS-ERROR-HEADER1,  'INVALID DAY FORMAT'
            DISPLAY WS-ERROR-HEADER3
    ELSE
            DISPLAY WS-ERROR-HEADER1,  'INVALID MONTH FORMAT'
            DISPLAY WS-ERROR-HEADER3
    ELSE
            DISPLAY WS-ERROR-HEADER1,  'INVALID YEAR FORMAT'
            DISPLAY WS-ERROR-HEADER3
            END-IF
     END-IF.
1110-EXIT.
    EXIT.
    
1200-VALIDATE-RECORDS.
   IF Header-Date <= WS-DATE
     MOVE Header-Date TO Stud-Validated-Date
     Write STUD-VALIDATED-REC 
     ADD 1 TO VALID-COUNT
     MOVE 'VALID' TO REMARKS(1)
     READ STUD-FILE INTO  STUD-REC
     
     PERFORM UNTIL END-FILE
     IF current-record <> 1
      IF Stud-School = 'MINERVA POLYTECHNIC'
      ADD 1 TO TREAD-COUNT
      ADD 1 TO LINE-COUNT
       DISPLAY PROOFLIST-DETAIL1
        DISPLAY PROOFLIST-DETAIL2
      PERFORM 1220-WRITE-PROOFLIST
      MOVE STUD-INPUT-REC TO Stud-Validated-Details-Record
      WRITE STUD-VALIDATED-REC
      PERFORM 1210-VALIDATE-REC
    END-IF
    READ STUD-FILE 
            AT END 
            SET END-FILE TO TRUE
    END-PERFORM
    
   ELSE
     DISPLAY WS-ERROR-HEADER2
     DISPLAY WS-ERROR-HEADER3
      END-IF.
1200-EXIT.
    EXIT.
    
1210-VALIDATE-REC. 
      PERFORM 1212-VALIDATE-TC.
      PERFORM 1214-WRITE-DETAILS.
1210-EXIT.
    EXIT.
    
1212-VALIDATE-TC.
        IF Stud-TransCode <> 'A' AND 'W' AND 'E'
        MOVE Stud-TransCode TO PROOFLIST-STUD-TC
        MOVE '*' TO ASTERISK-STUD-TC
       MOVE 'TC INVALID FORMAT' TO REMARKS(INDEX-CTR)
       ELSE
        IF Stud-TransCode = 'A'
       MOVE Stud-TransCode TO PROOFLIST-STUD-TC
       PERFORM 1300-VAL-STUDENT-NUMBER
       PERFORM 1400-VAL-LNAME
       PERFORM 1500-VAL-FNAME
       PERFORM 1600-VAL-MI
       PERFORM 1700-VAL-CI
       PERFORM 1800-VAL-DOB
       PERFORM 1900-VAL-COURSE
       PERFORM 2000-TC-A
       ELSE
        IF Stud-TransCode = 'W'
       MOVE Stud-TransCode TO PROOFLIST-STUD-TC
       PERFORM 1300-VAL-STUDENT-NUMBER
       PERFORM 1400-VAL-LNAME
       PERFORM 1500-VAL-FNAME
       PERFORM 1600-VAL-MI
       PERFORM 2100-TC-W
       ELSE
        IF Stud-TransCode= 'E'
        MOVE Stud-TransCode TO PROOFLIST-STUD-TC
         PERFORM 1300-VAL-STUDENT-NUMBER
         PERFORM 1400-VAL-LNAME
        PERFORM 1500-VAL-FNAME
    PERFORM 1600-VAL-MI
    PERFORM 1700-VAL-CI
    PERFORM 1800-VAL-DOB
    PERFORM 1900-VAL-COURSE
    PERFORM 2200-TC-E
   ELSE
    MOVE '  ' TO ASTERISK-STUD-TC
    MOVE ' ' TO REMARKS(INDEX-CTR)
    END-IF.
1212-EXIT.
    EXIT.


1300-VAL-STUDENT-NUMBER.
    MOVE Stud-Number TO PROOFLIST-STUD-NO
    IF Stud-Number = SPACES THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO  ASTERISK-STUD-NO
    MOVE 'STUDENT NUMBER IS REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE
    IF Stud-Number IS NOT NUMERIC THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO  ASTERISK-STUD-NO
    MOVE 'STUDENT NUMBER NOT NUMERIC' TO REMARKS(INDEX-CTR)
    ELSE
    IF Stud-Number  <> SPACES THEN
    MOVE ' ' TO ASTERISK-STUD-NO
    MOVE ' ' TO REMARKS(INDEX-CTR).
1300-EXIT.
 EXIT.
 
1400-VAL-LNAME.
    MOVE Stud-Surname TO PROOFLIST-STUD-LNAME
    IF Stud-Surname = SPACES THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO ASTERISK-STUD-LNAME
    MOVE 'STUDENT SURNAME IS REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE
    MOVE ' ' TO ASTERISK-STUD-LNAME
    MOVE ' ' TO REMARKS(INDEX-CTR).
1400-EXIT.
 EXIT.
 
1500-VAL-FNAME.
    MOVE Stud-Firstname TO PROOFLIST-STUD-FNAME
    IF Stud-Firstname = SPACES THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO ASTERISK-STUD-FNAME
    MOVE 'STUDENT FIRSTNAME IS REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE
    IF Stud-Firstname IS NOT ALPHABETIC THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO  ASTERISK-STUD-FNAME
    MOVE 'STUDENT FIRSTNAME IS NOT ALPHABETIC' TO REMARKS(INDEX-CTR)
    ELSE
    MOVE ' ' TO ASTERISK-STUD-FNAME
    MOVE ' ' TO REMARKS(INDEX-CTR).
1500-EXIT.
 EXIT.
 
1600-VAL-MI.
    MOVE Stud-MI TO PROOFLIST-STUD-MI
    IF Stud-MI = SPACES THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO ASTERISK-STUD-MI 
    MOVE 'STUDENT MI IS REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE
    IF Stud-MI IS NOT ALPHABETIC THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO  ASTERISK-STUD-MI 
    MOVE 'STUDENT MI IS NOT ALPHABETIC' TO REMARKS(INDEX-CTR)
    ELSE
    IF  Stud-MI <> SPACES THEN
    MOVE ' ' TO ASTERISK-STUD-MI 
    MOVE ' ' TO REMARKS(INDEX-CTR).
1600-EXIT.
 EXIT.
 
1700-VAL-CI.
    MOVE Stud-ContacInfo TO PROOFLIST-STUD-CI
    IF Stud-ContacInfo = SPACES THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO ASTERISK-STUD-CI 
    MOVE 'STUDENT CONTACTINFO IS REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE
    IF  Stud-ContacInfo <> SPACES THEN
    MOVE ' ' TO ASTERISK-STUD-CI 
    MOVE ' ' TO REMARKS(INDEX-CTR).
1700-EXIT.
 EXIT.
 
1800-VAL-DOB.
     MOVE Stud-DateofBirth TO  PROOFLIST-STUD-DOB
        MOVE DOB-YYYY TO STUD-DOB-YYYY
     MOVE Stud-DateofBirth TO STUD-DOB
     IF Stud-DateofBirth = SPACES THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO ASTERISK-STUD-DOB
    MOVE 'STUDENT DATEOFBIRTH IS REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE
    IF STUD-DOB IS NOT NUMERIC THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO  ASTERISK-STUD-DOB
    MOVE 'STUDENT DATEOFBIRTH IS NOT NUMERIC' TO REMARKS(INDEX-CTR)
    ELSE
    IF  Stud-DateofBirth <> SPACES THEN
    MOVE ' ' TO ASTERISK-STUD-DOB
    MOVE ' ' TO REMARKS(INDEX-CTR)
    IF DOB-YYYY >= '1800' and  DOB-YYYY <= 9999 THEN
          IF  DOB-MM = '01' OR '03' OR '05' OR '07' OR '08' OR '10' OR '12' 
           IF  DOB-DD <= 31
         MOVE 'Y' TO VALID-FLAG
        ELSE
        ADD 1 TO INDEX-CTR
         MOVE 'INVALID DAY FORMAT' TO REMARKS(INDEX-CTR)
       
         END-IF
   ELSE
       IF DOB-MM =  '04' OR '06' OR '09' OR '11'
        IF DOB-DD <= 30 
        MOVE 'Y' TO VALID-FLAG
     END-IF
           ELSE
           ADD 1 TO INDEX-CTR
            MOVE 'INVALID DAY FORMAT' TO REMARKS(INDEX-CTR)
         
         END-IF
   ELSE
      IF DOB-MM = '02' then
*>      checking of leap year
          DIVIDE STUD-DOB-YYYY BY 400 GIVING z REMAINDER z1
           IF z1 = 0 
              MOVE 29 TO highdd 
           ELSE
            DIVIDE  STUD-DOB-YYYY BY 4 GIVING y REMAINDER y1
           IF y1 = 0 
            DIVIDE STUD-DOB-YYYY BY 100 GIVING x REMAINDER x1
             IF x1 = 0
                   MOVE '28' TO highdd 
               ELSE 
                    MOVE '29' TO highdd 
             
         IF DOB-DD <= highdd then
          ADD 1 TO VALID-COUNT
          MOVE 'Y' TO VALID-FLAG
          
   ELSE
   ADD 1 TO INDEX-CTR
             MOVE 'INVALID DAY FORMAT' TO REMARKS(INDEX-CTR)
         
    ELSE
    ADD 1 TO INDEX-CTR
     MOVE 'INVALID MONTH FORMAT' TO REMARKS(INDEX-CTR)
           
    ELSE
    ADD 1 TO INDEX-CTR
     MOVE 'INVALID YEAR FORMAT' TO REMARKS(INDEX-CTR)
           
            END-IF
               
      END-IF
      END-IF
     END-IF.    

1800-EXIT.
 EXIT.

1900-VAL-COURSE.
    MOVE Stud-Course TO  PROOFLIST-STUD-COURSE
    IF Stud-Course = '  ' THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO ASTERISK-STUD-COURSE
    MOVE 'STUDENT COURSE IS REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE 
  IF Stud-Course = 'AUTOMOTIVE' OR Stud-Course = 'MACHINERY' OR  Stud-Course = 'COMP TECH' 
        OR Stud-Course = 'ELECTRICAL' OR Stud-Course = 'DRESSMAKING' OR Stud-Course = 'COSMETOLOGY'
        OR Stud-Course = 'HAIRDRESSING' THEN
    MOVE ' ' TO ASTERISK-STUD-COURSE
    MOVE 'VALID ' TO REMARKS(INDEX-CTR)
     ELSE
   IF Stud-Course <> 'AUTOMOTIVE' OR Stud-Course <> 'MACHINERY' OR  Stud-Course <> 'COMP TECH' 
        OR Stud-Course <> 'ELECTRICAL' OR Stud-Course <> 'DRESSMAKING' OR Stud-Course <> 'COSMETOLOGY'
        OR Stud-Course <> 'HAIRDRESSING' THEN
    ADD 1 TO INDEX-CTR
    MOVE '*' TO  ASTERISK-STUD-COURSE
    MOVE 'STUDENT COURSE INVALID FORMAT' TO REMARKS(INDEX-CTR).
     
1900-EXIT.
    EXIT.

2000-TC-A.
    IF Stud-Number = SPACES 
        MOVE '*' TO ASTERISK-STUD-NO
         MOVE 'ALL FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE
    IF Stud-Surname = SPACES
        MOVE '*' TO ASTERISK-STUD-LNAME
         MOVE 'ALL FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE    
    IF Stud-FirstName  = SPACES 
        MOVE '*' TO ASTERISK-STUD-FNAME
         MOVE 'ALL FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE    
    IF Stud-MI  = SPACES 
        MOVE '*' TO ASTERISK-STUD-MI
         MOVE 'ALL FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
        
    ELSE    
    IF Stud-ContacInfo  = SPACES  
        MOVE '*' TO ASTERISK-STUD-CI
         MOVE 'ALL FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
        
    ELSE    
    IF Stud-DateofBirth  = SPACES
        MOVE '*' TO ASTERISK-STUD-DOB
         MOVE 'ALL FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
        
    ELSE    
    IF Stud-Course  = SPACES
        MOVE '*' TO ASTERISK-STUD-COURSE
         MOVE 'ALL FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
        
    ELSE
         MOVE ' ' TO ASTERISK-STUD-NO
         MOVE ' ' TO ASTERISK-STUD-LNAME
         MOVE ' ' TO ASTERISK-STUD-FNAME
         MOVE ' ' TO ASTERISK-STUD-MI
         MOVE ' ' TO ASTERISK-STUD-CI
         MOVE ' ' TO ASTERISK-STUD-DOB
         MOVE ' ' TO ASTERISK-STUD-COURSE
         MOVE ' ' TO REMARKS(INDEX-CTR)
        
         END-IF.
2000-EXIT.
    EXIT.
    
2100-TC-W.
 IF Stud-Number = SPACES AND Stud-Surname = SPACES AND  Stud-FirstName  = SPACES AND Stud-MI  = SPACES 
        MOVE '*' TO ASTERISK-STUD-NO
         MOVE '*' TO ASTERISK-STUD-LNAME
         MOVE '*' TO ASTERISK-STUD-FNAME
         MOVE '*' TO ASTERISK-STUD-MI
         MOVE 'STUDENT NUMBER AND NAME ONLY REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE
        MOVE ' ' TO ASTERISK-STUD-NO
         MOVE ' ' TO ASTERISK-STUD-LNAME
         MOVE ' ' TO ASTERISK-STUD-FNAME
         MOVE ' ' TO ASTERISK-STUD-MI.

2100-EXIT.
    EXIT.
    
2200-TC-E.
    IF Stud-Number = SPACES THEN
          MOVE '*' TO ASTERISK-STUD-NO
          MOVE 'STUDENT NUMBER ARE REQUIRED' TO REMARKS(INDEX-CTR)
    IF Stud-Surname = SPACES 
        MOVE '*' TO ASTERISK-STUD-LNAME
         MOVE 'ATLEAST ONE FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE    
    IF Stud-FirstName  = SPACES 
        MOVE '*' TO ASTERISK-STUD-FNAME
         MOVE 'ATLEAST ONE FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE    
    IF Stud-MI  = SPACES 
        MOVE '*' TO ASTERISK-STUD-MI
         MOVE 'ATLEAST ONE FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
        
    ELSE    
    IF Stud-ContacInfo  = SPACES  
        MOVE '*' TO ASTERISK-STUD-CI
         MOVE 'ATLEAST ONE FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
        
    ELSE    
    IF Stud-DateofBirth  = SPACES
        MOVE '*' TO ASTERISK-STUD-DOB
         MOVE 'ATLEAST ONE FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
        
    ELSE    
    IF Stud-Course  = SPACES
        MOVE '*' TO ASTERISK-STUD-COURSE
         MOVE 'ATLEAST ONE FIELDS ARE REQUIRED' TO REMARKS(INDEX-CTR)
    ELSE
    MOVE ' ' TO ASTERISK-STUD-NO
    MOVE ' ' TO ASTERISK-STUD-LNAME
    MOVE ' ' TO ASTERISK-STUD-FNAME
    MOVE ' ' TO ASTERISK-STUD-MI
    MOVE ' ' TO ASTERISK-STUD-DOB
    MOVE ' ' TO ASTERISK-STUD-COURSE
    MOVE ' ' TO REMARKS(INDEX-CTR).
2200-EXIT.
    EXIT.
    
    
1214-WRITE-DETAILS. 
    
1214-EXIT.
    EXIT.
    
1220-WRITE-PROOFLIST.
IF LINE-COUNT = 01 OR LINE-COUNT = 66
       COMPUTE PAGE-COUNT = PAGE-COUNT + 1
       MOVE PAGE-COUNT TO PAGE-NO
DISPLAY PROOFLIST-HEAD1
WRITE STUD-REPREC FROM PROOFLIST-HEAD1
DISPLAY PROOFLIST-HEAD2
WRITE STUD-REPREC FROM PROOFLIST-HEAD2
DISPLAY PROOFLIST-HEAD3
WRITE STUD-REPREC FROM PROOFLIST-HEAD3
DISPLAY PROOFLIST-HEAD4
WRITE STUD-REPREC FROM PROOFLIST-HEAD4.
1220-EXIT.
    EXIT.
     

COBOL online compiler

Write, Run & Share COBOL code online using OneCompiler's COBOL online compiler for free. It’s a reliable and accessible playground to practice and run COBOL code with ease. The compiler supports classic COBOL syntax and is great for learning, teaching, and experimenting with business logic programs.

About COBOL

COBOL (Common Business-Oriented Language) is a high-level programming language developed in the 1950s. It is primarily used in business, finance, and administrative systems for companies and governments. COBOL is known for its English-like syntax and is still widely used in legacy enterprise systems.

Sample Code

The following is a simple COBOL program that prints a greeting:

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
    DISPLAY "Hello, OneCompiler!".
    STOP RUN.

Taking inputs

In COBOL, input is typically handled using the ACCEPT keyword. Here’s an example that takes user input and prints it back.

IDENTIFICATION DIVISION.
PROGRAM-ID. GREET.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USER-NAME PIC A(30).

PROCEDURE DIVISION.
    DISPLAY "Enter your name: ".
    ACCEPT USER-NAME.
    DISPLAY "Hello, " USER-NAME "!".
    STOP RUN.

Syntax Basics

Program Structure

COBOL programs are divided into four divisions:

  • IDENTIFICATION DIVISION: Program metadata
  • ENVIRONMENT DIVISION: Machine/environment details (optional)
  • DATA DIVISION: Variable declarations
  • PROCEDURE DIVISION: Actual program logic

Variables

Variables are declared in the DATA DIVISION using PIC clauses.

01 AGE        PIC 99.
01 NAME       PIC A(20).
01 SALARY     PIC 9(5)V99.

Displaying and Accepting Data

DISPLAY "Welcome to COBOL!".
ACCEPT USER-INPUT.

Conditional Statements

IF AGE >= 18
    DISPLAY "Eligible to vote."
ELSE
    DISPLAY "Not eligible."
END-IF.

Loops (PERFORM)

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
    DISPLAY "Count: " I
END-PERFORM.

This guide provides a quick reference to COBOL programming syntax and features. Start coding in COBOL using OneCompiler’s COBOL online compiler today!