You are on page 1of 149

School of MAINFRAMES Email : schoolofmainframes@gmail.

com Ph : 040-64515137

COBOL Programs
By Madhu Padala

1
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Basic requirement to write and execute a COBOL program


1. Create a Source Library and Load Library.
2. Write a program in a member of source PDS.
3. Prepare a compile JCL in one of the below methods. It is one time process.
A. Create a compile jcl in another member of source library
B. Copy it from other's PDS.
C. Ask the system programmer for sample compile jcl.
D. Copy it from internet.
4. Compile source program with compile jcl to generate load module in the load library.
5. Create run JCL to execute load module of your COBOL program.
6. Prepare test data into input files and execute run JCL then check the output.

First Program
Purpose : To know about a basic COBOL program, compilation and its execution.
Requirement : Display the below string in program and check the string in SYSOUT after run.
THIS IS MY FIRST PROGRAM
Program:
IDENTIFICATION DIVISION.
PROGRAM-ID. PGM1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.

PROCEDURE DIVISION.

DISPLAY 'THIS IS MY FIRST PROGRAM'

STOP RUN.

Compile JCL :
//IBMUSERS JOB 'MADHU PADALA',NOTIFY=&SYSUID,MSGLEVEL=(1,1),REGION=2M JOB03606
//*
//IGYWCL PROC SRCLIB=,
// COBCOPY=,
// LOADLIB=,
// PGMNAME=
//*
//COMPILE EXEC PGM=IGYCRCTL,PARM=(LIB,SSRANGE,LIST,TEST)
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSNAME=&&LOADSET,UNIT=SYSALLDA,
// DISP=(MOD,PASS),SPACE=(TRK,(3,3)),
// DCB=(BLKSIZE=3200)
//SYSUT1 DD UNIT=SYSALLDA,SPACE=(TRK,(1,1))
//SYSUT2 DD UNIT=SYSALLDA,SPACE=(TRK,(1,1))
//SYSUT3 DD UNIT=SYSALLDA,SPACE=(TRK,(1,1))
//SYSUT4 DD UNIT=SYSALLDA,SPACE=(TRK,(1,1))
//SYSUT5 DD UNIT=SYSALLDA,SPACE=(TRK,(1,1))
//SYSUT6 DD UNIT=SYSALLDA,SPACE=(TRK,(1,1))
//SYSUT7 DD UNIT=SYSALLDA,SPACE=(TRK,(1,1))
//SYSIN DD DSN=&SRCLIB(&PGMNAME),DISP=SHR
//SYSLIB DD DSN=&COBCOPY,DISP=SHR
//*

2
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

//LINKED EXEC PGM=HEWL,COND=(4,LT),PARM='XREF',REGION=1024K


//SYSLMOD DD DSN=&LOADLIB(&PGMNAME),DISP=SHR
//SYSLIB DD DSN=&LOADLIB,DISP=SHR
// DD DSN=CEE.SCEELKED,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSN=&&LOADSET,DISP=(OLD,DELETE)
//SYSUT1 DD UNIT=SYSDA,SPACE=(TRK,(2,2)),DISP=NEW
//IGYWCL PEND
//*
//STEP1 EXEC IGYWCL,
// SRCLIB=IBMUSER.SMF.BOOK, USE YOUR SRCLIB
// COBCOPY=IBMUSER.SMF.BOOK, USE YOUR COPYLIB
// LOADLIB=IBMUSER.SMF.LOADLIB, USE YOUR LOADLIB
// PGMNAME=REPORTZ USE YOUR PROGRAM

Run JCL:
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=PGM1
//SYSOUT DD SYSOUT=*

Output:
THIS IS MY FIRST PROGRAM

3
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Accept &Display
Purpose : To know about how to accept data from SYSIN.
Requirement : Accept first name and last name and display full name.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. PGM2.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME.
05 FIRST-NAME PIC X(10).
05 LAST-NAME PIC X(10).

PROCEDURE DIVISION.

ACCEPT FIRST-NAME
ACCEPT LAST-NAME

DISPLAY 'THIS PROGRAM IS WRITTEN BY:' WS-NAME

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=PGM2
//SYSOUT DD SYSOUT=*
//SYSIN DD *
MADHU
PADALA
/*

Output :
THIS PROGRAM IS WRITTEN BY:MADHU PADALA

4
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Structures
Purpose : To know about layout, level numbers and how to pass data on assumed decimal
from sysin.
Requirement : Accept data into group item and display all elementary items.
Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. STRUC1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 EMP-REC.
05 EMP-ID PIC X(04).
05 EMP-NAME.
10 FIRST-NAME PIC X(10).
10 LAST-NAME PIC X(10).
05 EMP-STATUS PIC X(01).
05 DOJ PIC 9(08).
05 BASIC-SAL PIC 9(7)V99.
05 HRA-PERCENT PIC 9(3)V99.
05 ALLOWANCE-PERCENT PIC 9(3)V99.
05 BONUS-AMT PIC 9(5)V99.
PROCEDURE DIVISION.
ACCEPT EMP-REC.
DISPLAY 'EMP-ID :' EMP-ID
DISPLAY 'EMP-NAME :' EMP-NAME
DISPLAY 'FIRST-NAME :' FIRST-NAME
DISPLAY 'LAST-NAME :' LAST-NAME
DISPLAY 'EMP-STATUS :' EMP-STATUS
DISPLAY 'DOJ :' DOJ
DISPLAY 'BASIC-SAL :' BASIC-SAL
DISPLAY 'HRA-PERCENT :' HRA-PERCENT
DISPLAY 'ALLOWANCE-PERCENT :' ALLOWANCE-PERCENT
DISPLAY 'BONUS-AMT :' BONUS-AMT
STOP RUN.
RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=STRUC1
//SYSOUT DD SYSOUT=*
//SYSIN DD *
E001HITHA PADALA A2012101400500000004000070000500000
/*
Output :
EMP-ID :E001
EMP-NAME :HITHA PADALA
FIRST-NAME :HITHA
LAST-NAME :PADALA
EMP-STATUS :A
DOJ :20121014
BASIC-SAL :005000000
HRA-PERCENT :04000
ALLOWANCE-PERCENT :07000
BONUS-AMT :0500000

5
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Data types and its length


Purpose : To find length of each data type.
Requirement : Declare different groups with different data types and display the length of
each group.
Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. TYPELEN.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-GRP1.
05 A PIC 9(03).
05 B PIC S9(03).
05 D PIC S9(03) SIGN LEADING SEPARATE.
05 E PIC S9(03) SIGN TRAILING SEPARATE.
05 F PIC S9(03)V99.

01 WS-GRP2.
05 A PIC S9(01) COMP.
05 B PIC S9(04) COMP.
05 C PIC 9(04) COMP.
05 D PIC S9(05) COMP.
05 E PIC S9(09) COMP.
05 F PIC S9(10) COMP.
05 G PIC S9(18) COMP.

01 WS-GRP3.
05 A PIC 9(7) COMP-3.
05 B PIC S9(7) COMP-3.
05 C PIC S9(6) COMP-3.
05 D PIC S9(7)V99 COMP-3.

01 WS-GRP4.
05 A PIC X(5).
05 B PIC S9(4) COMP.
05 C PIC X(4).

01 WS-GRP5.
05 A PIC X(5).
05 B PIC S9(4) COMP SYNC.
05 C PIC X(4).

01 WS-GRP6.
05 A PIC X(5).
05 B PIC S9(9) COMP SYNC.
05 C PIC X(4).
01 WS-GRP7.
05 A COMP-1.
05 B COMP-2.
01 WS-GRP8.
05 A PIC 9(3).99.
05 B PIC -9(3).99.
05 C PIC 9(3).99-.
05 D PIC ZZ9.99-.
05 E PIC ---9.99.

6
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

PROCEDURE DIVISION.

DISPLAY 'LENGTH OF WS-GRP1:' LENGTH OF WS-GRP1


DISPLAY 'LENGTH OF WS-GRP2:' LENGTH OF WS-GRP2
DISPLAY 'LENGTH OF WS-GRP3:' LENGTH OF WS-GRP3
DISPLAY 'LENGTH OF WS-GRP4:' LENGTH OF WS-GRP4
DISPLAY 'LENGTH OF WS-GRP5:' LENGTH OF WS-GRP5
DISPLAY 'LENGTH OF WS-GRP6:' LENGTH OF WS-GRP6
DISPLAY 'LENGTH OF WS-GRP7:' LENGTH OF WS-GRP7
DISPLAY LENGTH OF A IN WS-GRP7
DISPLAY LENGTH OF B IN WS-GRP7
DISPLAY 'LENGTH OF WS-GRP8:' LENGTH OF WS-GRP8

STOP RUN.
RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=TYPELEN
//SYSOUT DD SYSOUT=*

Output :
LENGTH OF WS-GRP1:000000019
LENGTH OF WS-GRP2:000000030
LENGTH OF WS-GRP3:000000017
LENGTH OF WS-GRP4:000000011
LENGTH OF WS-GRP5:000000012
LENGTH OF WS-GRP6:000000016
LENGTH OF WS-GRP7:000000012
000000004
000000008
LENGTH OF WS-GRP8:000000034

7
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Various ways to pass data to numeric variables


Purpose : To know how to pass values to numeric variables in 4 methods.
1. At declaration with value clause
2. As a literal in the procedure division
3. From SYSIN of JCL
4. From PARM of JCL
Requirement : Declare below 5 numeric variables and pass data in all the above 4 methods then
display its internal data and actual data.

9(3) with 123.


9(5) with 123.
s9(3) with 123.
s9(3) with -123.
s9(3)v99 with -123.45.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. DATA2NUM.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 GROUP1.
05 A PIC 9(03) VALUE 123.
05 FILLER PIC X(01) VALUE ','.
05 B PIC 9(05) VALUE 123.
05 FILLER PIC X(01) VALUE ','.
05 C PIC S9(03) VALUE 123.
05 FILLER PIC X(01) VALUE ','.
05 D PIC S9(03) VALUE -123.
05 FILLER PIC X(01) VALUE ','.
05 E PIC S9(03)V99 VALUE -123.45.

01 GROUP2.
05 F PIC 9(03).
05 FILLER PIC X(01) VALUE ','.
05 G PIC 9(05).
05 FILLER PIC X(01) VALUE ','.
05 H PIC S9(03).
05 FILLER PIC X(01) VALUE ','.
05 I PIC S9(03).
05 FILLER PIC X(01) VALUE ','.
05 J PIC S9(03)V99.

01 GROUP3.
05 K PIC 9(03).
05 FILLER PIC X(01).
05 L PIC 9(05).
05 FILLER PIC X(01).
05 M PIC S9(03).
05 FILLER PIC X(01).
05 N PIC S9(03).
05 FILLER PIC X(01).
05 O PIC S9(03)V99.

8
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

01 GROUP-EDIT.
05 EDIT1 PIC 9(03).
05 FILLER PIC X(01) VALUE ','.
05 EDIT2 PIC 9(05).
05 FILLER PIC X(01) VALUE ','.
05 EDIT3 PIC +9(03).
05 FILLER PIC X(01) VALUE ','.
05 EDIT4 PIC +9(03).
05 FILLER PIC X(01) VALUE ','.
05 EDIT5 PIC +9(03)V99.

LINKAGE SECTION.
01 LS-VAR.
05 LEN PIC S9(04) COMP.
05 GROUP4.
10 P PIC 9(03).
10 FILLER PIC X(01).
10 Q PIC 9(05).
10 FILLER PIC X(01).
10 R PIC S9(03).
10 FILLER PIC X(01).
10 S PIC S9(03).
10 FILLER PIC X(01).
10 T PIC S9(03)V99.

PROCEDURE DIVISION USING LS-VAR.

* MOVE VALUES TO THE ELEMENTARY ITMES IN GROUP2


MOVE 123 TO F
MOVE 123 TO G
MOVE 123 TO H
MOVE -123 TO I
MOVE -123.45 TO J

* ACCEPT SYSIN DATA INTO GROUP3


ACCEPT GROUP3.

* DISPLAY INTERNAL DATA IN ALL GROUPS


DISPLAY 'INTERNAL DATA IN GROUP1:' GROUP1
DISPLAY 'INTERNAL DATA IN GROUP2:' GROUP2
DISPLAY 'INTERNAL DATA IN GROUP3:' GROUP3
DISPLAY 'INTERNAL DATA IN GROUP4:' GROUP4

* DISPLAY ACTUAL DATA IN ALL GROUPS


MOVE A TO EDIT1
MOVE B TO EDIT2
MOVE C TO EDIT3
MOVE D TO EDIT4
MOVE E TO EDIT5
DISPLAY 'ACTUAL DATA IN GROUP1:' GROUP-EDIT

MOVE F TO EDIT1
MOVE G TO EDIT2
MOVE H TO EDIT3
MOVE I TO EDIT4
MOVE J TO EDIT5
DISPLAY 'ACTUAL DATA IN GROUP2:' GROUP-EDIT

9
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

MOVE K TO EDIT1
MOVE L TO EDIT2
MOVE M TO EDIT3
MOVE N TO EDIT4
MOVE O TO EDIT5
DISPLAY 'ACTUAL DATA IN GROUP3:' GROUP-EDIT

MOVE P TO EDIT1
MOVE Q TO EDIT2
MOVE R TO EDIT3
MOVE S TO EDIT4
MOVE T TO EDIT5
DISPLAY 'ACTUAL DATA IN GROUP4:' GROUP-EDIT

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=DATA2NUM,PARM=(123,00123,12C,12L,1234N)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
123,00123,12C,12L,1234N
/*

Output :
INTERNAL DATA IN GROUP1:123,00123,12C,12L,1234N
INTERNAL DATA IN GROUP2:123,00123,12C,12L,1234N
INTERNAL DATA IN GROUP3:123,00123,12C,12L,1234N
INTERNAL DATA IN GROUP4:123,00123,12C,12L,1234N
ACTUAL DATA IN GROUP1:123,00123,+123,-123,-12345
ACTUAL DATA IN GROUP2:123,00123,+123,-123,-12345
ACTUAL DATA IN GROUP3:123,00123,+123,-123,-12345
ACTUAL DATA IN GROUP4:123,00123,+123,-123,-12345

10
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Display Different types of numeric variables


Purpose : To know how the data is displayed in different type of numeric variables.
Requirement : Declare different types of numeric variables with value and then display each
data type.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. DISPNUM.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 A-UNSIGN-ZONED-INT PIC 9(3) VALUE 123.
01 A-UNSIGN-ZONED-DEC PIC 9(3)V99 VALUE 123.45.
01 A-SIGN-ZONED-INT-P PIC S9(3) VALUE 123.
01 A-SIGN-ZONED-INT-N PIC S9(3) VALUE -123.
01 A-SIGN-ZONED-DEC-P PIC S9(3)V99 VALUE 123.45.
01 A-SIGN-ZONED-DEC-N PIC S9(3)V99 VALUE -123.45.
01 A-SIGN-ZONED-DEC-N-T PIC S9(3)V99 SIGN TRAILING SEPARATE
VALUE -123.45.
01 A-SIGN-ZONED-DEC-N-L PIC S9(3)V99 SIGN LEADING SEPARATE
VALUE -123.45.
01 B-UNSIGN-COMP PIC 9(4) USAGE COMP VALUE 1234.
01 B-SIGN-COMP-P PIC S9(4) COMP VALUE 1234.
01 B-SIGN-COMP-N PIC S9(4) COMP VALUE -1234.

01 C-UNSIGN-COMP-3-INT PIC 9(5) COMP-3 VALUE 12345.


01 C-SIGN-COMP-3-INT-P PIC S9(5) COMP-3 VALUE 12345.
01 C-SIGN-COMP-3-INT-N PIC S9(5) COMP-3 VALUE -12345.
01 C-SIGN-COMP-3-DEC-P PIC S9(5)V99 COMP-3 VALUE 12345.67.
01 C-SIGN-COMP-3-DEC-N PIC S9(5)V99 COMP-3 VALUE -12345.67.

01 D-COMP-1-MULT-EXP COMP-1 VALUE +.12345678E+4.


01 D-COMP-1-MULT-EXP-EDIT PIC -999999.99999999999.
01 D-COMP-1-DIV-EXP COMP-1 VALUE +.12345678E-4.
01 D-COMP-1-DIV-EXP-EDIT PIC -999999.99999999999.

01 D-COMP-2-MULT-EXP COMP-1 VALUE +.12345678901E+4.


01 D-COMP-2-MULT-EXP-EDIT PIC -999999.999999999999.
01 D-COMP-2-DIV-EXP COMP-1 VALUE +.12345678901E-4.
01 D-COMP-2-DIV-EXP-EDIT PIC -999999.999999999999.

PROCEDURE DIVISION.

DISPLAY 'A-UNSIGN-ZONED-INT :' A-UNSIGN-ZONED-INT.


DISPLAY 'A-UNSIGN-ZONED-DEC :' A-UNSIGN-ZONED-DEC.
DISPLAY 'A-SIGN-ZONED-INT-P :' A-SIGN-ZONED-INT-P.
DISPLAY 'A-SIGN-ZONED-INT-N :' A-SIGN-ZONED-INT-N.
DISPLAY 'A-SIGN-ZONED-DEC-P :' A-SIGN-ZONED-DEC-P.
DISPLAY 'A-SIGN-ZONED-DEC-N :' A-SIGN-ZONED-DEC-N.
DISPLAY 'A-SIGN-ZONED-DEC-N-T :' A-SIGN-ZONED-DEC-N-T.
DISPLAY 'A-SIGN-ZONED-DEC-N-L :' A-SIGN-ZONED-DEC-N-L.

DISPLAY 'B-UNSIGN-COMP :' B-UNSIGN-COMP.


DISPLAY 'B-SIGN-COMP-P :' B-SIGN-COMP-P.
DISPLAY 'B-SIGN-COMP-N :' B-SIGN-COMP-N.

11
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

DISPLAY 'C-UNSIGN-COMP-3-INT :' C-UNSIGN-COMP-3-INT.


DISPLAY 'C-SIGN-COMP-3-INT-P :' C-SIGN-COMP-3-INT-P.
DISPLAY 'C-SIGN-COMP-3-INT-N :' C-SIGN-COMP-3-INT-N.
DISPLAY 'C-SIGN-COMP-3-DEC-P :' C-SIGN-COMP-3-DEC-P.
DISPLAY 'C-SIGN-COMP-3-DEC-N :' C-SIGN-COMP-3-DEC-N.

DISPLAY 'D-COMP-1-MULT-EXP :' D-COMP-1-MULT-EXP.


MOVE D-COMP-1-MULT-EXP TO D-COMP-1-MULT-EXP-EDIT.
DISPLAY 'D-COMP-1-MULT-EXP-EDIT :' D-COMP-1-MULT-EXP-EDIT.

DISPLAY 'D-COMP-1-DIV-EXP :' D-COMP-1-DIV-EXP.


MOVE D-COMP-1-DIV-EXP TO D-COMP-1-DIV-EXP-EDIT.
DISPLAY 'D-COMP-1-DIV-EXP-EDIT :' D-COMP-1-DIV-EXP-EDIT.

DISPLAY 'D-COMP-2-MULT-EXP :' D-COMP-2-MULT-EXP.


MOVE D-COMP-2-MULT-EXP TO D-COMP-2-MULT-EXP-EDIT.
DISPLAY 'D-COMP-2-MULT-EXP-EDIT :' D-COMP-2-MULT-EXP-EDIT.

DISPLAY 'D-COMP-2-DIV-EXP :' D-COMP-2-DIV-EXP.


MOVE D-COMP-2-DIV-EXP TO D-COMP-2-DIV-EXP-EDIT.
DISPLAY 'D-COMP-2-DIV-EXP-EDIT :' D-COMP-2-DIV-EXP-EDIT.

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=DISPNUM
//SYSOUT DD SYSOUT=*

Output :
A-UNSIGN-ZONED-INT :123
A-UNSIGN-ZONED-DEC :12345
A-SIGN-ZONED-INT-P :12C
A-SIGN-ZONED-INT-N :12L
A-SIGN-ZONED-DEC-P :1234E
A-SIGN-ZONED-DEC-N :1234N
A-SIGN-ZONED-DEC-N-T :12345-
A-SIGN-ZONED-DEC-N-L :-12345
B-UNSIGN-COMP :1234
B-SIGN-COMP-P :1234
B-SIGN-COMP-N :123M
C-UNSIGN-COMP-3-INT :12345
C-SIGN-COMP-3-INT-P :12345
C-SIGN-COMP-3-INT-N :1234N
C-SIGN-COMP-3-DEC-P :1234567
C-SIGN-COMP-3-DEC-N :123456P
D-COMP-1-MULT-EXP : .12345679E 04
D-COMP-1-MULT-EXP-EDIT : 001234.56787000000
D-COMP-1-DIV-EXP : .12345678E-04
D-COMP-1-DIV-EXP-EDIT : 000000.00001234568
D-COMP-2-MULT-EXP : .12345679E 04
D-COMP-2-MULT-EXP-EDIT : 001234.567870000000
D-COMP-2-DIV-EXP : .12345679E-04
D-COMP-2-DIV-EXP-EDIT : 000000.000012345679

12
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Editing characters
Purpose : To know about
1. Different types of numeric and alphanumeric editing characters
2. Difference between numeric and numeric editing characters
Requirement : Declare different types of numeric variables with value and then display.
Move every numeric variable into its corresponding numeric editing variable and
then display.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. EDITNUM.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(5) VALUE 00123.
01 A-EDIT PIC ZZZZ9.
01 B PIC 9(4)V99 VALUE 0123.40.
01 B-EDIT PIC ZZZ9.99.
01 C PIC S9(5)V99 VALUE -01234.50.
01 C-EDIT1 PIC -----9.99.
01 C-EDIT2 PIC ZZZZ9.99-.
01 C-EDIT3 PIC $$$$$9.99-.
01 C-EDIT4 PIC ---,--9.99.
01 C-EDIT5 PIC ***,**9.99-.
01 D PIC S9(5)V99 VALUE 01234.50.
01 D-EDIT1 PIC -----9.99.
01 D-EDIT2 PIC +++++9.99.
01 E PIC S9(5)V99 COMP-3 VALUE -01234.50.
01 E-EDIT PIC -----9.99.
01 F PIC S9(4) COMP VALUE -0123.
01 F-EDIT PIC ----9.
01 G PIC 9(4) VALUE 1234.
01 G-EDIT PIC 9(4).00.
01 H PIC S9(4) VALUE -1234.
01 H-EDIT-CR PIC 9999CR.
01 H-EDIT-DB PIC 9999DB.
01 I PIC S9(4) VALUE +1234.
01 I-EDIT-CR PIC 9999CR.
01 I-EDIT-DB PIC 9999DB.
01 DATE1 PIC 9(8) VALUE 20120806.
01 DATE1-EDIT1 PIC 9999/99/99.
01 DATE1-EDIT2 PIC 9999B99B99.

PROCEDURE DIVISION.
* SUPPRESS LEADING ZEROS
MOVE A TO A-EDIT.
DISPLAY 'A :' A.
DISPLAY 'A-EDIT :' A-EDIT.

* SUPPRESS LEADING ZEROS AND INCLUDE DECIMAL PERIOD


MOVE B TO B-EDIT.
DISPLAY 'B :' B.
DISPLAY 'B-EDIT :' B-EDIT.

13
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

* 1. SUPPRESS LEADING ZEROS, INCLUDE PERIOD, LEADING SIGN ON -VE


* VALUES ONLY.
* 2. SUPPRESS LEADING ZEROS, INCLUDE PERIOD & TRAILING SIGN ON -VE
* VALUES ONLY.
* 3. SUPPRESS LEADING ZEROS, INCLUDE $, PERIOD & TRAIL SIGN ON -VE
* VALUES ONLY.
* 4. SUPPRESS LEADING ZEROS, INCLUDE COMMA, PERIOD &
* LEADING SIGN ON -VE VALUES ONLY.
* 5. REPLACE LEADING ZEROS BY *, INCLUDE COMMA, PERIOD &
* TRAILING SIGN ON -VE VALUES ONLY.

MOVE C TO C-EDIT1
C-EDIT2
C-EDIT3
C-EDIT4
C-EDIT5.
DISPLAY 'C :' C.
DISPLAY 'C-EDIT1 :' C-EDIT1.
DISPLAY 'C-EDIT2 :' C-EDIT2.
DISPLAY 'C-EDIT3 :' C-EDIT3.
DISPLAY 'C-EDIT4 :' C-EDIT4.
DISPLAY 'C-EDIT5 :' C-EDIT5.

* 1. SUPPRESS LEADING ZEROS, INCLUDE PERIOD & LEADING SIGN ON


* -VE VALUES ONLY.
* 2. SUPPRESS LEADING ZEROS, INCLUDE PERIOD & LEADING SIGN ON
* BOTH +VE AND -VE VALUES.

MOVE D TO D-EDIT1
D-EDIT2.
DISPLAY 'D :' D.
DISPLAY 'D-EDIT1 :' D-EDIT1.
DISPLAY 'D-EDIT2 :' D-EDIT2.

* EFFECT OF EDITING CHARACTER ON COMP-3 IS SAME AS DISPLAY ITEMS


MOVE E TO E-EDIT.
DISPLAY 'E :' E.
DISPLAY 'E-EDIT :' E-EDIT.

* EFFECT OF EDITING CHARACTER ON COMP IS SAME AS DISPLAY ITEMS


MOVE F TO F-EDIT.
DISPLAY 'F :' F.
DISPLAY 'F-EDIT :' F-EDIT.

* INSERT EXTRA DECIMAL PERIODS


MOVE G TO G-EDIT.
DISPLAY 'G :' G.
DISPLAY 'G-EDIT :' G-EDIT.

* 1. DISPLAY CR ONLY WHEN VALUE IS -VE


* 2. DISPLAY DB ONLY WHEN VALUE IS -VE
MOVE H TO H-EDIT-CR
H-EDIT-DB.
DISPLAY 'H :' H.
DISPLAY 'H-EDIT-CR :' H-EDIT-CR.
DISPLAY 'H-EDIT-DB :' H-EDIT-DB.

14
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

* 1. DISPLAY CR ONLY WHEN VALUE IS -VE


* 2. DISPLAY DB ONLY WHEN VALUE IS –VE
MOVE I TO I-EDIT-CR
I-EDIT-DB.
DISPLAY 'I :' I.
DISPLAY 'I-EDIT-CR :' I-EDIT-CR.
DISPLAY 'I-EDIT-DB :' I-EDIT-DB.

* 1. INSERT '/' BETWEEN DATE SUB FIELDS


* 2. INSERT SPACE IN THE DATE SUB FIELDS
MOVE DATE1 TO DATE1-EDIT1
DATE1-EDIT2.
DISPLAY 'DATE1 :' DATE1.
DISPLAY 'DATE1-EDIT1 :' DATE1-EDIT1.
DISPLAY 'DATE1-EDIT2 :' DATE1-EDIT2.

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=EDITNUM
//SYSOUT DD SYSOUT=*

Output :
A :00123
A-EDIT : 123
B :012340
B-EDIT : 123.40
C :012345}
C-EDIT1 : -1234.50
C-EDIT2 : 1234.50-
C-EDIT3 : $1234.50-
C-EDIT4 : -1,234.50
C-EDIT5 :**1,234.50-
D :012345{
D-EDIT1 : 1234.50
D-EDIT2 : +1234.50
E :012345}
E-EDIT : -1234.50
F :012L
F-EDIT : -123
G :1234
G-EDIT :1234.00
H :123M
H-EDIT-CR :1234CR
H-EDIT-DB :1234DB
I :123D
I-EDIT-CR :1234
I-EDIT-DB :1234
DATE1 :20120806
DATE1-EDIT1 :2012/08/06
DATE1-EDIT2 :2012 08 06

15
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Accept Date and Time


Purpose : To know how to accept different formats of date and time.
Requirement : Accept date and time and then display.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. DATETIME.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 WS-DATE-YYMMDD PIC 9(6).


01 WS-DATE-YYYYMMDD PIC 9(8).
01 WS-DATE-YYDDD PIC 9(5).
01 WS-DATE-YYYYDDD PIC 9(7).
01 WS-TIME-HHMMSSSS PIC 9(8).
01 WS-DAY-OF-WEEK PIC 9(1).

PROCEDURE DIVISION.

ACCEPT WS-DATE-YYMMDD FROM DATE


ACCEPT WS-DATE-YYYYMMDD FROM DATE YYYYMMDD
ACCEPT WS-DATE-YYDDD FROM DAY
ACCEPT WS-DATE-YYYYDDD FROM DAY YYYYDDD
ACCEPT WS-TIME-HHMMSSSS FROM TIME
ACCEPT WS-DAY-OF-WEEK FROM DAY-OF-WEEK

DISPLAY 'WS-DATE-YYMMDD :' WS-DATE-YYMMDD


DISPLAY 'WS-DATE-YYYYMMDD:' WS-DATE-YYYYMMDD
DISPLAY 'WS-DATE-YYDDD :' WS-DATE-YYDDD
DISPLAY 'WS-DATE-YYYYDDD :' WS-DATE-YYYYDDD
DISPLAY 'WS-TIME-HHMMSSSS:' WS-TIME-HHMMSSSS
DISPLAY 'WS-DAY-OF-WEEK :' WS-DAY-OF-WEEK

EVALUATE WS-DAY-OF-WEEK
WHEN 1
DISPLAY 'DAY OF WEEK IS MONDAY'
WHEN 2
DISPLAY 'DAY OF WEEK IS TUESDAY'
WHEN 3
DISPLAY 'DAY OF WEEK IS WEDNESDAY'
WHEN 4
DISPLAY 'DAY OF WEEK IS THURSDAY'
WHEN 5
DISPLAY 'DAY OF WEEK IS FRIDAY'
WHEN 6
DISPLAY 'DAY OF WEEK IS SATURDAY'
WHEN 7
DISPLAY 'DAY OF WEEK IS SUNDAY'
END-EVALUATE
STOP RUN.

16
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=DATETIME
//SYSOUT DD SYSOUT=*

Output :
WS-DATE-YYMMDD :121028
WS-DATE-YYYYMMDD:20121028
WS-DATE-YYDDD :12302
WS-DATE-YYYYDDD :2012302
WS-TIME-HHMMSSSS:13534136
WS-DAY-OF-WEEK :7
DAY OF WEEK IS SUNDAY

17
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Move on Alphanumeric itmes


Purpose : To know about Rules of MOVE on alphanumeric items.
Requirement : Execute MOVE to check the below.
1. Basic rules of MOVE on alphanumeric items
2. Group to group move
3. Group move with corresponding option
4. Move with reference modification
5. Extra care on move from alphanumeric to numeric
Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. MOVEX.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 A PIC X(4).
01 B PIC X(4) JUSTIFIED RIGHT.
01 C PIC X(4) VALUE 'ABCD'.
01 D PIC X(4) VALUE 'MNOP'.
01 E PIC X(4) VALUE 'ABCD'.
01 F PIC 9(4) VALUE ZEROS.
01 G PIC 9(5) VALUE 12345.
01 H PIC 9(3) VALUE 123.
01 I PIC X(4) VALUE 'ABCD'.
01 J PIC X(4) VALUE '1234'.
01 K PIC 9(4) VALUE 5678.

01 WS-DATE1 VALUE '20121014'.


05 CCYY PIC 9(4).
05 MM PIC 9(2).
05 DD PIC 9(2).

01 WS-DATE2.
05 CCYY PIC 9(4).
05 MM PIC 9(2).
05 DD PIC 9(2).

01 WS-DATE3 VALUE '20121014'.


05 CCYY PIC 9(4).
05 MM PIC 9(2).
05 DD PIC 9(2).

01 WS-DATE4.
05 MM PIC 9(2).
05 FILLER PIC X(1) VALUE '/'.
05 DD PIC 9(2).
05 FILLER PIC X(1) VALUE '/'.
05 CCYY PIC 9(4).

PROCEDURE DIVISION.
*MOVE INTO SAME LENGTH
MOVE 'ABCD' TO A
DISPLAY A

18
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

*MOVE INTO BIGGER LENGTH


MOVE 'ABC' TO A
DISPLAY A

*MOVE INTO SMALLER LENGTH


MOVE 'ABCDE' TO A
DISPLAY A

*MOVE INTO SAME LENGTH FIELD THAT HAS JUSTIFIED RIGHT CLAUSE
MOVE 'ABCD' TO B
DISPLAY B

*MOVE INTO SMALLER LENGTH FIELD THAT HAS JUSTIFIED RIGHT CLAUSE
MOVE 'ABCDE' TO B
DISPLAY B

*MOVE INTO BIGGER LENGTH FIELD THAT HAS JUSTIFIED RIGHT CLAUSE
MOVE 'ABC' TO B
DISPLAY B

*MOVE WITH REFERENCE MODIFICATION


MOVE C(1:2) TO D(3:2)
DISPLAY D

*MOVE ALPHANUMERIC TO NUMERIC


MOVE E TO F
DISPLAY F

*MOVE NUMERIC TO BIGGER ALPHANUMERIC


MOVE G TO A
DISPLAY G

*MOVE NUMERIC TO SMALLER ALPHANUMERIC


MOVE H TO A
DISPLAY H

*GROUP MOVE INTO SAME LENGTH


MOVE WS-DATE1 TO WS-DATE2
DISPLAY WS-DATE2

*GROUP MOVE WITH CORRESPONDING


MOVE CORRESPONDING WS-DATE3 TO WS-DATE4
DISPLAY WS-DATE4

*MOVE ALPHANUMERIC TO NUMERIC BY CHECKING IS NUMERIC


IF I IS NUMERIC
MOVE I TO K
END-IF
DISPLAY K

IF J IS NUMERIC
MOVE J TO K
END-IF
DISPLAY K

STOP RUN.

19
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=MOVEX
//SYSOUT DD SYSOUT=*

Output:
ABCD
ABC
ABCD
ABCD
BCDE
ABC
MNAB
ABC4
12345
123
20121014
10/14/2012
5678
1234

20
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Move on Numeric items


Purpose : To know about Rules of MOVE on numeric items.
Requirement : Check rules of MOVE on numeric items.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. MOVE9.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 A PIC 9(3)V99.
01 A-EDIT PIC 999.99.
01 B PIC 9(5).
01 C PIC X(4) VALUE 'ABCD'.
01 D PIC 9(4).
01 E PIC 9(3)V99 VALUE 123.45.
01 F PIC 9(3)V99 COMP-3.
01 F-EDIT PIC 999.99.
01 G PIC 9(4) VALUE 1234.
01 H PIC 9(4) COMP.

PROCEDURE DIVISION.

* MOVE VALUE TO SAME LENGTH FIELD


MOVE 123.45 TO A
MOVE A TO A-EDIT
DISPLAY A ' : ' A-EDIT

* MOVE SMALLER VALUE TO BIGGER LENGTH FIELD


MOVE 12.3 TO A
MOVE A TO A-EDIT
DISPLAY A ' : ' A-EDIT

* MOVE BIGGER VALUE TO SMALLER LENGTH FIELD


MOVE 1234.567 TO A
MOVE A TO A-EDIT
DISPLAY A ' : ' A-EDIT

* MOVE NEGATIVE VALUE TO UNSIGNED FIELD


MOVE -123.45 TO A
MOVE A TO A-EDIT
DISPLAY A ' : ' A-EDIT

* MOVE INTEGER VALUE TO DECIMAL FIELD


MOVE 12345 TO A
MOVE A TO A-EDIT
DISPLAY A ' : ' A-EDIT

* MOVE DECIMAL VALUE TO INTEGER FIELD


MOVE 123.45 TO B
DISPLAY B

21
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

* MOVE NUMERIC VALUE TO ALPHANUMERIC FIELD


MOVE C TO D
DISPLAY D

* MOVE ZONED DECIMAL TO COMP-3 DECIMAL


MOVE E TO F
MOVE F TO F-EDIT
DISPLAY F-EDIT

* MOVE ZONED INTEGER TO COMP


MOVE G TO H
DISPLAY H

STOP RUN.

RunJCL:
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=MOVE9
//SYSOUT DD SYSOUT=*

Output:
12345 : 123.45
01230 : 012.30
23456 : 234.56
12345 : 123.45
34500 : 345.00
00123
ABC4
123.45
1234

22
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Arithmetic Verbs
Purpose : To know about arithmetic operations on numeric items.
Requirement : Execute all arithmetic verbs with all possible clauses.

Verbs : ADD, SUBTRACT, MULTIPLY, DIVIDE, COMPUTE


Cluases : GIVING, REMAINDER, ROUNDED

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. ARITH.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(4) VALUE ZEROS.
01 B PIC 9(4) VALUE ZEROS.
01 C PIC 9(4) VALUE ZEROS.
01 D PIC 9(4) VALUE ZEROS.
01 E PIC 9(3)V99 VALUE ZEROS.
01 F PIC 9(3)V99 VALUE ZEROS.
01 G PIC 9(3)V9 VALUE ZEROS.

PROCEDURE DIVISION.
MOVE 10 TO A
MOVE 20 TO B
DISPLAY 'BEFORE ADD A TO B :' A ',' B.
ADD A TO B
DISPLAY 'AFTER ADD A TO B :' A ',' B.

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
MOVE 40 TO C
MOVE 60 TO D
DISPLAY 'BEFORE ADD A B C TO D :' A ',' B ',' C ',' D
ADD A B C TO D
DISPLAY 'AFTER ADD A B C TO D :' A ',' B ',' C ',' D

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
MOVE 40 TO C
MOVE 60 TO D
DISPLAY 'BEFORE ADD A B C GIVING D :' A ',' B ',' C ',' D
ADD A B C GIVING D
DISPLAY 'AFTER ADD A B C GIVING D :' A ',' B ',' C ',' D

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
MOVE 40 TO C
DISPLAY 'BEFORE ADD A TO B C :' A ',' B ',' C
ADD A TO B C
DISPLAY 'AFTER ADD A TO B C :' A ',' B ',' C

23
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
DISPLAY 'BEFORE SUBTRACT A FROM B :' A ',' B
SUBTRACT A FROM B
DISPLAY 'AFTER SUBTRACT A FROM B :' A ',' B

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
MOVE 40 TO C
DISPLAY 'BEFORE SUBTRACT A B FROM C :' A ',' B ',' C
SUBTRACT A B FROM C
DISPLAY 'AFTER SUBTRACT A B FROM C :' A ',' B ',' C

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
MOVE 40 TO C
MOVE 60 TO D
DISPLAY 'BEFORE SUBTRACT A B FROM C GIVING D :'
A ',' B ',' C ',' D
SUBTRACT A B FROM C GIVING D
DISPLAY 'AFTER SUBTRACT A B FROM C GIVING D :'
A ',' B ',' C ',' D

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
DISPLAY 'BEFORE MULTIPLY A BY B :' A ',' B
MULTIPLY A BY B
DISPLAY 'AFTER MULTIPLY A BY B :' A ',' B

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
MOVE 40 TO C
DISPLAY 'BEFORE MULTIPLY A BY B GIVING C :' A ',' B ',' C
MULTIPLY A BY B GIVING C
DISPLAY 'AFTER MULTIPLY A BY B GIVING C :' A ',' B ',' C

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
DISPLAY 'BEFORE DIVIDE A INTO B :' A ',' B
DIVIDE A INTO B
DISPLAY 'AFTER DIVIDE A INTO B :' A ',' B

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
MOVE 40 TO C
DISPLAY 'BEFORE DIVIDE A INTO B GIVING C :' A ',' B ',' C
DIVIDE A INTO B GIVING C
DISPLAY 'AFTER DIVIDE A INTO B GIVING C :' A ',' B ',' C

24
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
MOVE 40 TO C
DISPLAY 'BEFORE DIVIDE B BY A GIVING C :' A ',' B ',' C
DIVIDE B BY A GIVING C
DISPLAY 'AFTER DIVIDE B BY A GIVING C :' A ',' B ',' C

DISPLAY ' '


MOVE 10 TO A
MOVE 20 TO B
MOVE 40 TO C
MOVE 60 TO D
DISPLAY 'BEFORE COMPUTE D = (B / A) * C :'
A ',' B ',' C ',' D
COMPUTE D = (B / A) * C
DISPLAY 'AFTER COMPUTE D = (B / A) * C :'
A ',' B ',' C ',' D

DISPLAY ' '


MOVE 10 TO A
MOVE 23 TO B
MOVE 40 TO C
MOVE 60 TO D
DISPLAY 'BEFORE DIVIDE A INTO B GIVING C REMAINDER D :'
A ',' B ',' C ',' D
DIVIDE A INTO B GIVING C REMAINDER D
DISPLAY 'AFTER DIVIDE A INTO B GIVING C REMAINDER D :'
A ',' B ',' C ',' D.
DISPLAY ' '
MOVE 9998 TO A
MOVE 5 TO B
MOVE 40 TO C
DISPLAY 'BEFORE ADD A TO B GIVING C :' A ',' B ',' C
ADD A TO B GIVING C
DISPLAY 'AFTER ADD A TO B GIVING C :' A ',' B ',' C

DISPLAY ' '


MOVE 9998 TO A
MOVE 5 TO B
MOVE 40 TO C
DISPLAY 'BEFORE ADD A TO B GIVING C
ON SIZE ERROR :'
A ',' B ',' C
ADD A TO B GIVING C ON SIZE ERROR DISPLAY 'C IS SMALLER '
DISPLAY 'AFTER ADD A TO B GIVING C ON SIZE ERROR :'
A ',' B ',' C
DISPLAY ' '
MOVE 100.55 TO E
MOVE 100.00 TO F
DISPLAY 'BEFORE ADD E TO F GIVING G :' E ',' F ',' G
ADD E TO F GIVING G
DISPLAY 'AFTER ADD E TO F GIVING G :' E ',' F ',' G

DISPLAY ' '


MOVE 100.55 TO E
MOVE 100.00 TO F
MOVE ZEROS TO G
DISPLAY 'BEFORE ADD E TO F GIVING G ROUNDED :' E ',' F ',' G
ADD E TO F GIVING G ROUNDED
DISPLAY 'AFTER ADD E TO F GIVING G ROUNDED :' E ',' F ',' G

25
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

DISPLAY ' '


MOVE 900.55 TO E
MOVE 100.00 TO F
MOVE ZEROS TO G
DISPLAY 'BEFORE ADD E TO F GIVING G ROUNDED :' E ',' F ',' G
ADD E TO F GIVING G ROUNDED
DISPLAY 'AFTER ADD E TO F GIVING G ROUNDED :' E ',' F ',' G

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=ARITH
//SYSOUT DD SYSOUT=*

Output :
BEFORE ADD A TO B :0010,0020
AFTER ADD A TO B :0010,0030

BEFORE ADD A B C TO D :0010,0020,0040,0060


AFTER ADD A B C TO D :0010,0020,0040,0130

BEFORE ADD A B C GIVING D :0010,0020,0040,0060


AFTER ADD A B C GIVING D :0010,0020,0040,0070

BEFORE ADD A TO B C :0010,0020,0040


AFTER ADD A TO B C :0010,0030,0050

BEFORE SUBTRACT A FROM B :0010,0020


AFTER SUBTRACT A FROM B :0010,0010

BEFORE SUBTRACT A B FROM C :0010,0020,0040


AFTER SUBTRACT A B FROM C :0010,0020,0010

BEFORE SUBTRACT A B FROM C GIVING D :0010,0020,0040,0060


AFTER SUBTRACT A B FROM C GIVING D :0010,0020,0040,0010

BEFORE MULTIPLY A BY B :0010,0020


AFTER MULTIPLY A BY B :0010,0200

BEFORE MULTIPLY A BY B GIVING C :0010,0020,0040


AFTER MULTIPLY A BY B GIVING C :0010,0020,0200

BEFORE DIVIDE A INTO B :0010,0020


AFTER DIVIDE A INTO B :0010,0002

BEFORE DIVIDE A INTO B GIVING C :0010,0020,0040


AFTER DIVIDE A INTO B GIVING C :0010,0020,0002

BEFORE DIVIDE B BY A GIVING C :0010,0020,0040


AFTER DIVIDE B BY A GIVING C :0010,0020,0002

BEFORE COMPUTE D = (B / A) * C :0010,0020,0040,0060


AFTER COMPUTE D = (B / A) * C :0010,0020,0040,0080

26
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

BEFORE DIVIDE A INTO B GIVING C REMAINDER D :0010,0023,0040,0060


AFTER DIVIDE A INTO B GIVING C REMAINDER D :0010,0023,0002,0003

BEFORE ADD A TO B GIVING C :9998,0005,0040


AFTER ADD A TO B GIVING C :9998,0005,0003

BEFORE ADD A TO B GIVING C ON SIZE ERROR :9998,0005,0040


C IS SMALLER
AFTER ADD A TO B GIVING C ON SIZE ERROR :9998,0005,0040

BEFORE ADD E TO F GIVING G :10055,10000,0000


AFTER ADD E TO F GIVING G :10055,10000,2005

BEFORE ADD E TO F GIVING G ROUNDED :10055,10000,0000


AFTER ADD E TO F GIVING G ROUNDED :10055,10000,2006

BEFORE ADD E TO F GIVING G ROUNDED :90055,10000,0000


AFTER ADD E TO F GIVING G ROUNDED :90055,10000,0006

27
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Initialize
Purpose : To know about various options of INITIALIZE statement.
Requirement : Execute Initialize to check the below points.
1. Initialize on elementary items
2. How initialize reduces number of move statement
3. Initialize on group items
4. Initialize on group items that has filler with value clause
5. Initialize with replacing option

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. INIT1.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC X(3) VALUE 'ABC'.
01 B PIC X(3) VALUE '123'.
01 C PIC 9(3) VALUE 123.
01 D PIC S9(3) VALUE -123.
01 E PIC S9(3)V99 VALUE -123.45.

01 WS-GROUP1.
05 FLD1 PIC X(1) VALUE 'A'.
05 FLD2 PIC A(1) VALUE 'B'.
05 FLD3 PIC 9(1) VALUE 5.

01 WS-GROUP2.
05 FLD4 PIC X(1) VALUE 'A'.
05 FLD5 PIC A(1) VALUE 'B'.
05 FLD6 PIC 9(1) VALUE 5.

01 WS-DATE.
05 CCYY PIC 9(4) VALUE 2012.
05 FILLER PIC X(1) VALUE '/'.
05 MM PIC X(2) VALUE '08'.
05 FILLER PIC X(1) VALUE '/'.
05 DD PIC 9(2) VALUE 06.

PROCEDURE DIVISION.

* REPLACES ALPHANUMERIC AND APLHABETIC ITEMS WITH SPACES


* REPLACES NUMERIC ITEMS WITH ZEROS.
INITIALIZE A
B
C
D
E.
DISPLAY 'A:' A.
DISPLAY 'B:' B.
DISPLAY 'C:' C.
DISPLAY 'D:' D.
DISPLAY 'E:' E.

28
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

* ABOVE INITIALIZE CAN BE REPLACED WITH TWO MOVES AS SHOWN BELOW


MOVE SPACES TO A
B.
MOVE ZEROS TO C
D
E.
* INTIALIZE ON GROUP ITEM INITIALIZES ITS ELEMENTARY ITEMS ON
* ITS DATA TYPES BUT NOT INITIALIZE THE GROUP ITEM.
INITIALIZE WS-GROUP1.
DISPLAY 'FLD1:' FLD1.
DISPLAY 'FLD2:' FLD2.
DISPLAY 'FLD3:' FLD3.

* DIFFERENT DATA TYPES UNDER GROUP ITEM CAN BE REPLACED WITH


* DIFFERENT VALUES OTHER THAN DEFAULT VALUES
INITIALIZE WS-GROUP2 REPLACING ALPHANUMERIC DATA BY 'M'
ALPHABETIC DATA BY 'N'
NUMERIC DATA BY 1.

DISPLAY 'FLD4:' FLD4.


DISPLAY 'FLD5:' FLD5.
DISPLAY 'FLD6:' FLD6.

* FILLER WITH VALUE CALUSE UNDER GROUP ITEM CANNOT BE INITIALIZED


INITIALIZE WS-DATE.
DISPLAY 'WS-DATE:' WS-DATE.

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=INIT1
//SYSOUT DD SYSOUT=*

Output :
A:
B:
C:000
D:00{
E:0000{
FLD1:
FLD2:
FLD3:0
FLD4:M
FLD5:N
FLD6:1
WS-DATE:0000/ /00

29
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

If Else
Purpose : To know the difference between continue and next sentence.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. IFELSE.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(2).
01 B PIC 9(2).

PROCEDURE DIVISION.
ACCEPT A
IF A > 20
CONTINUE
ELSE
MOVE ZEROS TO A
END-IF
ADD 15 TO A.
ADD 15 TO A.
DISPLAY A .

ACCEPT B
IF B > 20
NEXT SENTENCE
ELSE
MOVE ZEROS TO B
END-IF
ADD 15 TO B.
ADD 15 TO B.
DISPLAY B .

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=IFELSE
//SYSOUT DD SYSOUT=*
//SYSIN DD *
30
30
/*

Output :
60
45

30
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Nested If and Evaluate

Purpose : To know how to replace nested if with evaluate statement and how to use condition
names.
Requirement : Accept data for EMP-REC as per layout in the program and calculate bonus with
rules given below.
Status Bonus % in salary
Male and Married - 10
Male and Unmarried - 5
Male and Divorced - 7

Female and Married - 15


Female and Unmarried - 8
Female and Divorced - 10

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. NESTEDIF.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 EMP-REC.
05 EMP-NUM PIC X(04).
05 GENDER PIC X(01).
88 FEMALE VALUE 'F'.
88 MALE VALUE 'M'.
05 MARITAL-STATUS PIC X(01).
88 MARRIED VALUE 'M'.
88 UNMARRIED VALUE 'U'.
88 DIVORCED VALUE 'D'.
05 SALARY PIC 9(7)V99.

01 BONUS PIC 9(7)V99 VALUE ZEROS.


01 BONUS-EDIT PIC ZZZZZZ9.99.
01 SALARY-EDIT PIC ZZZZZZ9.99.

PROCEDURE DIVISION.
ACCEPT EMP-REC.
DISPLAY 'EMP-NUM :' EMP-NUM
DISPLAY 'GENDER :' GENDER
DISPLAY 'MARITAL-STATUS:' MARITAL-STATUS
MOVE SALARY TO SALARY-EDIT
DISPLAY 'SALARY :' SALARY-EDIT

*NESTED IF METHOD1
IF GENDER = 'M'
IF MARITAL-STATUS = 'M'
COMPUTE BONUS = SALARY * 0.10
ELSE
IF MARITAL-STATUS = 'U'
COMPUTE BONUS = SALARY * 0.05
ELSE
IF MARITAL-STATUS = 'D'
COMPUTE BONUS = SALARY * 0.07
ELSE

31
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

DISPLAY 'INVALID MARITAL STATUS:' MARITAL-STATUS


END-IF

END-IF
END-IF

ELSE
IF GENDER = 'F'
IF MARITAL-STATUS = 'M'
COMPUTE BONUS = SALARY * 0.15
ELSE
IF MARITAL-STATUS = 'U'
COMPUTE BONUS = SALARY * 0.08
ELSE
IF MARITAL-STATUS = 'D'
COMPUTE BONUS = SALARY * 0.10
ELSE
DISPLAY 'INVALID MARITAL STATUS:' MARITAL-STATUS
END-IF
END-IF
END-IF
ELSE
DISPLAY 'INVALID GENDER:' GENDER
END-IF
END-IF

MOVE BONUS TO BONUS-EDIT


DISPLAY 'BONUS IN NESTED IF METHOD1:' BONUS-EDIT

MOVE ZEROS TO BONUS


*NESTED IF METHOD2 WITH CONDITION NAMES
IF MALE
IF MARRIED
COMPUTE BONUS = SALARY * 0.10
ELSE
IF UNMARRIED
COMPUTE BONUS = SALARY * 0.05
ELSE
IF DIVORCED
COMPUTE BONUS = SALARY * 0.07
ELSE
DISPLAY 'INVALID MARITAL STATUS:' MARITAL-STATUS
END-IF
END-IF
END-IF
ELSE
IF FEMALE
IF MARRIED
COMPUTE BONUS = SALARY * 0.15
ELSE
IF UNMARRIED
COMPUTE BONUS = SALARY * 0.08
ELSE
IF DIVORCED
COMPUTE BONUS = SALARY * 0.10
ELSE
DISPLAY 'INVALID MARITAL STATUS:' MARITAL-STATUS
END-IF
END-IF
END-IF

32
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

ELSE
DISPLAY 'INVALID GENDER:' GENDER
END-IF

END-IF
MOVE BONUS TO BONUS-EDIT
DISPLAY 'BONUS IN NESTED IF METHOD2:' BONUS-EDIT

MOVE ZEROS TO BONUS


*NESTED IF METHOD3 WITH CONDITION NAMES
IF MALE AND MARRIED
COMPUTE BONUS = SALARY * 0.10
ELSE
IF MALE AND UNMARRIED
COMPUTE BONUS = SALARY * 0.05
ELSE
IF MALE AND DIVORCED
COMPUTE BONUS = SALARY * 0.07
ELSE
IF FEMALE AND MARRIED
COMPUTE BONUS = SALARY * 0.15
ELSE
IF FEMALE AND UNMARRIED
COMPUTE BONUS = SALARY * 0.08
ELSE
IF FEMALE AND DIVORCED
COMPUTE BONUS = SALARY * 0.10
ELSE
DISPLAY 'INVLAID GENDER OR MARITAL STATUS:'
GENDER ',' MARITAL-STATUS.
* END-IF
* END-IF
* END-IF
* END-IF
* END-IF
* END-IF

MOVE BONUS TO BONUS-EDIT


DISPLAY 'BONUS IN NESTED IF METHOD3:' BONUS-EDIT
MOVE ZEROS TO BONUS
*EVALUATE METHOD1
EVALUATE GENDER
WHEN 'M'
EVALUATE MARITAL-STATUS
WHEN 'M'
COMPUTE BONUS = SALARY * 0.10
WHEN 'U'
COMPUTE BONUS = SALARY * 0.05
WHEN 'D'
COMPUTE BONUS = SALARY * 0.07
WHEN OTHER
DISPLAY 'INVALID MARITAL STATUS:' MARITAL-STATUS
END-EVALUATE
WHEN 'F'
EVALUATE MARITAL-STATUS
WHEN 'M'
COMPUTE BONUS = SALARY * 0.15
WHEN 'U'
COMPUTE BONUS = SALARY * 0.08

33
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

WHEN 'D'
COMPUTE BONUS = SALARY * 0.10
WHEN OTHER
DISPLAY 'INVALID MARITAL STATUS:' MARITAL-STATUS
END-EVALUATE

WHEN OTHER
DISPLAY 'INVALID GENDER:' GENDER
END-EVALUATE

MOVE BONUS TO BONUS-EDIT


DISPLAY 'BONUS IN EVALUATE METHOD1:' BONUS-EDIT

MOVE ZEROS TO BONUS


*EVALUATE METHOD2 WITH CONDTION NAMES
EVALUATE TRUE
WHEN MALE
EVALUATE TRUE
WHEN MARRIED
COMPUTE BONUS = SALARY * 0.10
WHEN UNMARRIED
COMPUTE BONUS = SALARY * 0.05
WHEN DIVORCED
COMPUTE BONUS = SALARY * 0.07
WHEN OTHER
DISPLAY 'INVALID MARITAL STATUS:' MARITAL-STATUS
END-EVALUATE
WHEN FEMALE
EVALUATE TRUE
WHEN MARRIED
COMPUTE BONUS = SALARY * 0.15
WHEN UNMARRIED
COMPUTE BONUS = SALARY * 0.08
WHEN DIVORCED
COMPUTE BONUS = SALARY * 0.10
WHEN OTHER
DISPLAY 'INVALID MARITAL STATUS:' MARITAL-STATUS
END-EVALUATE
WHEN OTHER
DISPLAY 'INVALID GENDER:' GENDER
END-EVALUATE

MOVE BONUS TO BONUS-EDIT


DISPLAY 'BONUS IN EVALUATE METHOD2:' BONUS-EDIT

MOVE ZEROS TO BONUS


*EVALUATE METHOD3 WITH 'ALSO' AND CONDITION NAMES
EVALUATE TRUE ALSO TRUE
WHEN MALE ALSO MARRIED
COMPUTE BONUS = SALARY * 0.10
WHEN MALE ALSO UNMARRIED
COMPUTE BONUS = SALARY * 0.05
WHEN MALE ALSO DIVORCED
COMPUTE BONUS = SALARY * 0.07
WHEN FEMALE ALSO MARRIED
COMPUTE BONUS = SALARY * 0.15
WHEN FEMALE ALSO UNMARRIED
COMPUTE BONUS = SALARY * 0.08
WHEN FEMALE ALSO DIVORCED
COMPUTE BONUS = SALARY * 0.10

34
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

WHEN OTHER
DISPLAY 'INVLAID GENDER OR MARITAL STATUS:'
GENDER ',' MARITAL-STATUS
END-EVALUATE

MOVE BONUS TO BONUS-EDIT


DISPLAY 'BONUS IN EVALUATE METHOD3:' BONUS-EDIT

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=NESTEDIF
//SYSOUT DD SYSOUT=*
//SYSIN DD *
E001FD005000000
/*

Output :
EMP-NUM :E001
GENDER :F
MARITAL-STATUS:D
SALARY : 50000.00
BONUS IN NESTED IF METHOD1: 5000.00
BONUS IN NESTED IF METHOD2: 5000.00
BONUS IN NESTED IF METHOD3: 5000.00
BONUS IN EVALUATE METHOD1: 5000.00
BONUS IN EVALUATE METHOD2: 5000.00
BONUS IN EVALUATE METHOD3: 5000.00

35
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Without Redefines
Purpose : To know how memory is wasted without redefines on mutually exclusive situations.
Requirement : Accept one record on individual agent and one record on corporate agent into the
below layout. Supply spaces to company-name on individual agent and individual-agent-name on
corporate agent.

01 AGENT-REC.
05 AGENT-ID PIC X(04).
05 INDIVIDUAL-AGENT-NAME.
10 FIRST-NAME PIC X(10).
10 LAST-NAME PIC X(10).
05 COMPANY-NAME PIC X(20).
05 AGENT-TYPE PIC X(1).
88 INDIVIDUAL-AGENT VALUE 'I'.
88 CORPORATE-AGENT VALUE 'C'.
05 DOJ PIC X(08).
05 LAST-TRX-DATE PIC X(08).
Note: Memory is wasted for company-name on individual agent and first-name,
last-name on corporate agent. 20 bytes are wasted in each case.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. NOREDEF.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 AGENT-REC.
05 AGENT-ID PIC X(04).
05 INDIVIDUAL-AGENT-NAME.
10 FIRST-NAME PIC X(10).
10 LAST-NAME PIC X(10).
05 COMPANY-NAME PIC X(20).
05 AGENT-TYPE PIC X(1).
88 INDIVIDUAL-AGENT VALUE 'I'.
88 CORPORATE-AGENT VALUE 'C'.
05 DOJ PIC X(08).
05 LAST-TRX-DATE PIC X(08).

PROCEDURE DIVISION.
ACCEPT AGENT-REC
IF AGENT-TYPE = 'I'
DISPLAY 'FIRST-NAME :' FIRST-NAME ','
'LAST-NAME :' LAST-NAME
ELSE
DISPLAY 'COMPANY-NAME:' COMPANY-NAME
END-IF

ACCEPT AGENT-REC
IF AGENT-TYPE = 'I'
DISPLAY 'FIRST-NAME :' FIRST-NAME ','
'LAST-NAME :' LAST-NAME
ELSE
DISPLAY 'COMPANY-NAME:' COMPANY-NAME
END-IF
STOP RUN.

36
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=NOREDEF
//SYSOUT DD SYSOUT=*
//SYSIN DD *
A001HITHA PADALA I2011010520120506
A002 SRIDURGA&CO PVT.LTD C2009050320120817
/*

Output :
FIRST-NAME :HITHA ,LAST-NAME :PADALA
COMPANY-NAME:SRIDURGA&CO PVT.LTD

37
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

With Redefines
Purpose : To know how the memory is saved with redefines on mutually exclusive situations.
Requirement : Accept individual and corporate agent records to the below layout.

01 AGENT-REC.
05 AGENT-ID PIC X(04).
05 INDIVIDUAL-AGENT-NAME.
10 FIRST-NAME PIC X(10).
10 LAST-NAME PIC X(10).
05 COMPANY-NAME REDEFINES INDIVIDUAL-AGENT-NAME PIC X(20).
05 AGENT-TYPE PIC X(1).
88 INDIVIDUAL-AGENT VALUE 'I'.
88 CORPORATE-AGENT VALUE 'C'.
05 DOJ PIC X(08).
05 LAST-TRX-DATE PIC X(08).
Note: Same memory is used for both Individual-agent-name and company-name because these
are mutually exclusive situations.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. REDEF.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 AGENT-REC.
05 AGENT-ID PIC X(04).
05 INDIVIDUAL-AGENT-NAME.
10 FIRST-NAME PIC X(10).
10 LAST-NAME PIC X(10).
05 COMPANY-NAME REDEFINES INDIVIDUAL-AGENT-NAME PIC X(20).
05 AGENT-TYPE PIC X(1).
88 INDIVIDUAL-AGENT VALUE 'I'.
88 CORPORATE-AGENT VALUE 'C'.
05 DOJ PIC X(08).
05 LAST-TRX-DATE PIC X(08).

PROCEDURE DIVISION.

ACCEPT AGENT-REC
IF AGENT-TYPE = 'I'
DISPLAY 'FIRST-NAME :' FIRST-NAME ','
'LAST-NAME :' LAST-NAME
ELSE
DISPLAY 'COMPANY-NAME:' COMPANY-NAME
END-IF

ACCEPT AGENT-REC
IF AGENT-TYPE = 'I'
DISPLAY 'FIRST-NAME :' FIRST-NAME ','
'LAST-NAME :' LAST-NAME
ELSE
DISPLAY 'COMPANY-NAME:' COMPANY-NAME
END-IF

STOP RUN.

38
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL:
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=REDEF
//SYSOUT DD SYSOUT=*
//SYSIN DD *
A001HITHA PADALA I2011010520120506
A002SRIDURGA&CO PVT.LTD C2009050320120817
/*

Output :
FIRST-NAME :HITHA ,LAST-NAME :PADALA
COMPANY-NAME:SRIDURGA&CO PVT.LTD

39
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Different examples on Redefines


Purpose : To know
1. How to see one layout into another layout.
2. How to see one decimal number into another decimal number.
Requirement : Accept date in yymmdd format and find whether it is leap year or not.
Accept Bonus-percent and display bonus-percent and bonus-rate.
Note: remove ws-comp-eff-date from the program

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. REDEF1.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATE1.
05 CC PIC 9(02) VALUE 20.
05 YYMMDD PIC 9(06).
01 WS-DATE2 REDEFINES WS-DATE1.
05 CCYY PIC 9(04).
05 MM PIC 9(02).
05 DD PIC 9(02).
01 WS-DATE3 REDEFINES WS-DATE1 PIC 9(8).

01 WS-COMP-EFF-DATE PIC 9(8).

01 WS-Q PIC 9(04).


01 WS-R PIC 9(01).

01 BONUS-PERCENT PIC 9(3)V99.


01 BONUS-RATE REDEFINES BONUS-PERCENT PIC 9(1)V9(4).

01 BONUS-EDIT PIC ZZ9.9999.

PROCEDURE DIVISION.
ACCEPT YYMMDD FROM DATE

DIVIDE CCYY BY 4 GIVING WS-Q REMAINDER WS-R


IF WS-R = 0
DISPLAY 'LEAP YEAR'
ELSE
DISPLAY 'NON LEAP YEAR'
END-IF

ACCEPT BONUS-PERCENT
MOVE BONUS-PERCENT TO BONUS-EDIT
DISPLAY 'BONUS PECENT:' BONUS-EDIT
MOVE BONUS-RATE TO BONUS-EDIT
DISPLAY 'BONUS RATE :' BONUS-EDIT

STOP RUN.

40
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=REDEF1
//SYSOUT DD SYSOUT=*
//SYSIN DD *
03350
/*

Output :
LEAP YEAR
BONUS PECENT: 33.5000
BONUS RATE : 0.3350

41
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

String
Purpose : To show all possible options of STRING verb.
1. Delimited by Size
2. Delimited by spaces or any other character
3. With Pointer
Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. STRING1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FULL-NAME.
10 LAST-NAME PIC X(10) VALUE 'EDISON'.
10 MIDDLE-NAME PIC X(10) VALUE 'ALVA'.
10 FIRST-NAME PIC X(10) VALUE 'THOMAS'.
01 NAME-OUT PIC X(21) VALUE SPACES.
01 STR-PTR PIC S9(4) COMP VALUE ZEROS.

PROCEDURE DIVISION.
*DELIMITED BY SIZE
STRING FIRST-NAME DELIMITED BY SIZE,
LAST-NAME DELIMITED BY SIZE
INTO NAME-OUT
DISPLAY 'NAME-OUT:' NAME-OUT

*DELIMITED BY SPACES
MOVE SPACES TO NAME-OUT
STRING FIRST-NAME DELIMITED BY SPACES,
LAST-NAME DELIMITED BY SPACES
INTO NAME-OUT
DISPLAY 'NAME-OUT:' NAME-OUT

*DELIMITED BY BOTH SPACES AND SIZE


MOVE SPACES TO NAME-OUT
STRING FIRST-NAME DELIMITED BY SPACES,
',' DELIMITED BY SIZE,
LAST-NAME DELIMITED BY SPACES
INTO NAME-OUT
DISPLAY 'NAME-OUT:' NAME-OUT

* STRING INTO A FIELD THAT HAS DATA


MOVE 'XXXXXXXXXXXXXXXXXXXXX' TO NAME-OUT
STRING FIRST-NAME DELIMITED BY SPACES,
',' DELIMITED BY SIZE,
LAST-NAME DELIMITED BY SPACES
INTO NAME-OUT
DISPLAY 'NAME-OUT:' NAME-OUT

42
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

* STRING WITH POINTER


MOVE SPACES TO NAME-OUT
MOVE 4 TO STR-PTR
STRING FIRST-NAME DELIMITED BY SPACES,
',' DELIMITED BY SIZE,
LAST-NAME DELIMITED BY SPACES
INTO NAME-OUT WITH POINTER STR-PTR
DISPLAY 'NAME-OUT:' NAME-OUT
STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=STRING1
//SYSOUT DD SYSOUT=*

Output :
NAME-OUT:THOMAS EDISON
NAME-OUT:THOMASEDISON
NAME-OUT:THOMAS,EDISON
NAME-OUT:THOMAS,EDISONXXXXXXXX
NAME-OUT: THOMAS,EDISON

43
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Unstring
Purpose : To show different options of UNSTRING
1. Delimited by spaces or any other character
2. Tallying option to find number of fields received
3. With Pointer
Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRG1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.

01 FULL-NAME1 PIC X(33) VALUE 'THOMAS ALVA EDISON'.


01 FULL-NAME2 PIC X(33) VALUE 'JAMES CAMAROON'.

01 FIRST-NAME PIC X(10).


01 MIDDLE-NAME PIC X(10).
01 LAST-NAME PIC X(10).

01 WS-NAMES-RECEIVED PIC 9(2).


01 STR-PTR PIC S9(4) COMP VALUE ZEROS.

01 WS-DATE1 PIC X(10) VALUE '2011-01-15'.


01 WS-DATE2.
05 WS-YYYY PIC 9(4) VALUE 2010.
05 WS-MM PIC 9(2) VALUE 12.
05 WS-DD PIC 9(2) VALUE 31.

01 CUST-ADDRESS1 PIC X(76).

01 CUST-ADDRESS2.
05 NAME PIC X(20).
05 HOUSE-NUM PIC X(10).
05 STREET PIC X(20).
05 CITY PIC X(15).
05 PIN-CODE PIC X(11).

PROCEDURE DIVISION.

* DELIMITED BY SPACES ON TALLYING OPTION


UNSTRING FULL-NAME1 DELIMITED BY ALL SPACES
INTO FIRST-NAME, MIDDLE-NAME, LAST-NAME
TALLYING IN WS-NAMES-RECEIVED

DISPLAY FIRST-NAME ';' MIDDLE-NAME ';' LAST-NAME


DISPLAY 'NAMES RECEIVED:' WS-NAMES-RECEIVED

* DELIMITED BY SPACES ON TALLYING OPTION


INITIALIZE FIRST-NAME, MIDDLE-NAME, LAST-NAME,
WS-NAMES-RECEIVED

44
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

UNSTRING FULL-NAME2 DELIMITED BY ALL SPACES


INTO FIRST-NAME, MIDDLE-NAME, LAST-NAME
TALLYING IN WS-NAMES-RECEIVED
DISPLAY FIRST-NAME ';' MIDDLE-NAME ';' LAST-NAME
DISPLAY 'NAMES RECEIVED:' WS-NAMES-RECEIVED

* POINTER OPTION
DISPLAY 'BEFORE WS-DATE1:' WS-DATE2
MOVE 6 TO STR-PTR
UNSTRING WS-DATE1 DELIMITED BY '-'
INTO WS-MM, WS-DD
WITH POINTER STR-PTR
DISPLAY 'AFTER WS-DATE1 :' WS-DATE2

* DELIMITED BY COMMA.
ACCEPT CUST-ADDRESS1
UNSTRING CUST-ADDRESS1 DELIMITED BY ','
INTO NAME,
HOUSE-NUM,
STREET,
CITY,
PIN-CODE.

DISPLAY CUST-ADDRESS1
DISPLAY NAME
DISPLAY HOUSE-NUM
DISPLAY STREET
DISPLAY CITY
DISPLAY PIN-CODE.

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=UNSTRG1
//SYSOUT DD SYSOUT=*
//SYSIN DD *
STEPHEN,102/2A,WALL STREET,NEWYORK,212/646/917
//*

Output:
THOMAS ;ALVA ;EDISON
NAMES RECEIVED:03
JAMES ;CAMAROON ;
NAMES RECEIVED:02
BEFORE WS-DATE1:20101231
AFTER WS-DATE1 :20100115
STEPHEN,102/2A,WALL STREET,NEWYORK,212/646/917
STEPHEN
102/2A
WALL STREET
NEWYORK
212/646/917

45
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Inspect
Purpose : To show different options in Inspect
1. Tallying to find number of occurrences
2. Replacing to replace one character/string with another character/string
3. Converting to replace a character in CONVERTING set with the corresponding
character in TO set.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. INSPECT1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.

01 WS-ZIP-CODE PIC X(12) VALUE '132-330-1450'.


01 WS-NAME PIC X(20) VALUE ' RAJA MOULI'.
01 WS-EMAIL1 PIC X(20) VALUE 'HITHA.P~GMAIL.COM'.
01 WS-EMAIL2 PIC X(20) VALUE 'HITHA.P~GMAIL.COM'.
01 WS-COUNT PIC S9(4) COMP VALUE ZEROS.

01 WS-ALPHACHARS.
05 ALPHALOWER PIC X(26) VALUE 'abcdefghijklmnopqrstuvwxyz'.
05 ALPHAUPPER PIC X(26) VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

01 CUSTOMER-ADDRESS1.
05 NAME PIC X(15) VALUE 'John cohanburg'.
05 ADD-LINE1 PIC X(15) VALUE 'kennedy street'.
05 ADD-LINE2 PIC X(10) VALUE 'carmel'.
05 ADD-LINE3 PIC X(15) VALUE 'indiana police'.

01 CUSTOMER-ADDRESS2.
05 NAME PIC X(15) VALUE 'JOHN COHANBURG'.
05 ADD-LINE1 PIC X(15) VALUE 'KENNEDY STREET'.
05 ADD-LINE2 PIC X(10) VALUE 'CARMEL'.
05 ADD-LINE3 PIC X(15) VALUE 'INDIANA POLICE'.

PROCEDURE DIVISION.

* INSPECT WITH TALLYING OPTION FOR ALL


INSPECT WS-ZIP-CODE TALLYING WS-COUNT FOR ALL '-'
DISPLAY 'WS-COUNT:' WS-COUNT

* INSPECT WITH TALLYING OPTION FOR LEADING


INSPECT WS-NAME TALLYING WS-COUNT FOR LEADING ' '
DISPLAY 'WS-COUNT:' WS-COUNT

* INSPECT WITH REPLACING OPTION


DISPLAY 'BEFORE WS-EMAIL1:' WS-EMAIL1
INSPECT WS-EMAIL1 REPLACING ALL '~' BY '@'
DISPLAY 'AFTER WS-EMAIL1 :' WS-EMAIL1

46
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

* REPLACING WITH MANUAL LOOPING


DISPLAY 'BEFORE WS-EMAIL2:' WS-EMAIL2
PERFORM VARYING WS-COUNT FROM 1 BY 1 UNTIL WS-COUNT > 20
IF WS-EMAIL2(WS-COUNT:1) = '~'
MOVE '@' TO WS-EMAIL2(WS-COUNT:1)
END-IF
END-PERFORM
DISPLAY 'AFTER WS-EMAIL2 :' WS-EMAIL2

* INSPECT WITH CONVERTING OPTION


DISPLAY 'BEFORE CUSTOMER-ADDRESS1:' CUSTOMER-ADDRESS1
INSPECT CUSTOMER-ADDRESS1
CONVERTING ALPHALOWER TO ALPHAUPPER
DISPLAY 'AFTER CUSTOMER-ADDRESS1 :' CUSTOMER-ADDRESS1

* INSPECT WITH CONVERTING OPTION


DISPLAY 'BEFORE CUSTOMER-ADDRESS2:' CUSTOMER-ADDRESS2
INSPECT CUSTOMER-ADDRESS2
CONVERTING ALPHAUPPER to ALPHALOWER
DISPLAY 'AFTER CUSTOMER-ADDRESS2 :' CUSTOMER-ADDRESS2

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=INSPECT1
//SYSOUT DD SYSOUT=*

Output :
WS-COUNT:0002
WS-COUNT:0005
BEFORE WS-EMAIL1:HITHA.P~GMAIL.COM
AFTER WS-EMAIL1 :HITHA.P@GMAIL.COM
BEFORE WS-EMAIL2:HITHA.P~GMAIL.COM
AFTER WS-EMAIL2 :HITHA.P@GMAIL.COM
BEFORE CUSTOMER-ADDRESS1:John cohanburg kennedy street carmel indiana police
AFTER CUSTOMER-ADDRESS1 :JOHN COHANBURG KENNEDY STREET CARMEL INDIANA POLICE
BEFORE CUSTOMER-ADDRESS2:JOHN COHANBURG KENNEDY STREET CARMEL INDIANA POLICE
AFTER CUSTOMER-ADDRESS2 :john cohanburg kennedy street carmel indiana police

47
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Calculator

Purpose : To know about


1. How to code a paragraph
2. How to use simple perform
3. How to use perform with THRU option
4. How to use evaluate verb with when other clause
Requirement : Accept num1, num2 and operation from sysin and display the result based on the
value in operation.
Operation Result
+ num1 + num2
- num1 - num2
* num1 * num2
/ num1 / num2
A All the above actions
Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. CALC.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.

WORKING-STORAGE SECTION.
01 NUM1 PIC 9(3) VALUE ZEROS.
01 NUM2 PIC 9(3) VALUE ZEROS.
01 RESULT1 PIC S9(6) VALUE ZEROS.
01 RESULT2 PIC S9(3)V99 VALUE ZEROS.
01 OPERATION PIC X(1) VALUE SPACES.
01 RESULT1-EDIT PIC ------9.
01 RESULT2-EDIT PIC ---9.99.

PROCEDURE DIVISION.
ACCEPT NUM1
ACCEPT NUM2
ACCEPT OPERATION

DISPLAY 'NUM1:' NUM1


DISPLAY 'NUM2:' NUM2
DISPLAY 'OPERATION:' OPERATION

EVALUATE OPERATION
WHEN '+'
PERFORM ADD-PARA
WHEN '-'
PERFORM SUB-PARA
WHEN '*'
PERFORM MULT-PARA
COMPUTE RESULT1 = NUM1 * NUM2
WHEN '/'
PERFORM DIV-PARA
COMPUTE RESULT1 = NUM1 / NUM2
WHEN 'A'
PERFORM ADD-PARA THRU DIV-PARA
COMPUTE RESULT1 = NUM1 / NUM2

48
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

WHEN OTHER
DISPLAY 'INVALID OPERATION'
END-EVALUATE
STOP RUN.

ADD-PARA.
COMPUTE RESULT1 = NUM1 + NUM2
MOVE RESULT1 TO RESULT1-EDIT
DISPLAY ' NUM1 + NUM2 = ' RESULT1-EDIT.
SUB-PARA.
COMPUTE RESULT1 = NUM1 - NUM2
MOVE RESULT1 TO RESULT1-EDIT
DISPLAY ' NUM1 - NUM2 = ' RESULT1-EDIT.
MULT-PARA.
COMPUTE RESULT1 = NUM1 * NUM2
MOVE RESULT1 TO RESULT1-EDIT
DISPLAY ' NUM1 * NUM2 = ' RESULT1-EDIT.
DIV-PARA.
COMPUTE RESULT2 = NUM1 / NUM2
MOVE RESULT2 TO RESULT2-EDIT
DISPLAY ' NUM1 / NUM2 = ' RESULT2-EDIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=CALC
//SYSOUT DD SYSOUT=*
//SYSIN DD *
020
030
+
/*

Output :
NUM1:020
NUM2:030
OPERATION:+
NUM1 + NUM2 = 50

49
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Length of the Name


Purpose : To know about
1. How to code inline perform to scan a string from end to the start
2. How to stop the scan when non space character is found
3. How to use reference modification
Requirement : Accept name from sysin and display the actual length of the data.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. NAMELEN.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COUNT PIC 9(2).
01 WS-NAME PIC X(40).
01 WS-LENTH PIC 9(2).
01 STOP-LOOP PIC X(1).

PROCEDURE DIVISION.

ACCEPT WS-NAME.
MOVE 'N' TO STOP-LOOP.
PERFORM VARYING WS-COUNT FROM 40 BY -1 UNTIL WS-COUNT < 1
OR STOP-LOOP = 'Y'
IF WS-NAME(WS-COUNT:1) > SPACE
MOVE 'Y' TO STOP-LOOP
DISPLAY 'LENTH OF NAME:' WS-COUNT
END-IF
END-PERFORM.
STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//STPE1 EXEC PGM=NAMELEN
//SYSOUT DD SYSOUT=*
//SYSIN DD *
STEPHEN SPEELBERG
/*

Output :
LENTH OF NAME:17

50
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Date Validation
Purpose : To know about
1. How to use perform paragraphs with THRU option.
2. How to jump to the exit para when the succeeding logic is not required.
3. How to execute the same statement for multiple WHEN conditions.
4. How to use IS NUMERIC to find the data is numeric or not
5. How to use Divide verb with remainder option to find leap year or not
6. How to set and reset a switch
Requirement : Accept date from sysin and validate it.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. DATEVAL1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-QUOTIENT PIC S9(4) COMP VALUE ZEROS.
01 WS-REMAINDER PIC S9(4) COMP VALUE ZEROS.

01 WS-DATE.
05 CCYY PIC 9(4).
05 MM PIC 9(2).
05 DD PIC 9(2).

01 WS-IND PIC X(1).

PROCEDURE DIVISION.
ACCEPT WS-DATE
DISPLAY WS-DATE
MOVE 'Y' TO WS-IND

PERFORM 100000-DATE-VALIDATION THRU 100000-EXIT


IF WS-IND = 'Y'
DISPLAY 'DATE IS VALID'
END-IF

STOP RUN.

100000-DATE-VALIDATION.
IF WS-DATE IS NUMERIC
CONTINUE
ELSE
MOVE 'N' TO WS-IND
DISPLAY 'DATE IS NOT NUMERIC'
GO TO 100000-EXIT
END-IF

IF MM >= 1 AND <= 12


CONTINUE
ELSE
MOVE 'N' TO WS-IND
DISPLAY 'MONTH IS OUT OF RANGE'
GO TO 100000-EXIT
END-IF

51
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

DIVIDE CCYY BY 4 GIVING WS-QUOTIENT


REMAINDER WS-REMAINDER
EVALUATE MM
WHEN 01
WHEN 03
WHEN 05
WHEN 07
WHEN 08
WHEN 10
WHEN 12
IF DD >= 1 AND <= 31
CONTINUE
ELSE
DISPLAY 'DAY IS OUT OF RANGE'
MOVE 'N' TO WS-IND
END-IF
WHEN 04
WHEN 06
WHEN 09
WHEN 11
IF DD >= 1 AND <= 30
CONTINUE
ELSE
DISPLAY 'DAY IS OUT OF RANGE'
MOVE 'N' TO WS-IND
END-IF
WHEN 02
IF WS-REMAINDER = 0
IF DD >= 1 AND <= 29
CONTINUE
ELSE
DISPLAY 'DAY IS OUT OF RANGE'
MOVE 'N' TO WS-IND
END-IF
ELSE
IF DD >= 1 AND <= 28
CONTINUE
ELSE
DISPLAY 'DAY IS OUT OF RANGE'
MOVE 'N' TO WS-IND
END-IF
END-IF
END-EVALUATE.
100000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=DATEVAL1
//SYSOUT DD SYSOUT=*
//SYSIN DD *
20080606
/*
Output :
20080606
DATE IS VALID

52
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Diamond

Purpose : To get clear understanding on loops.


Requirement : Accept the size of the diamond and display DIAMOND shape with '*' as shown
below.
*
* *
*
Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. DIAMOND.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 STARS-FIELD PIC X(81) VALUE SPACES.
01 DIAMOND-SIZE PIC 9(2) VALUE 0.
01 MIDDLE-OF-DIAMOND PIC 9(2) VALUE 0.
01 I PIC 9(4) VALUE 0.
01 J PIC 9(4) VALUE 0.
01 LEFT-LIMIT PIC 9(4) VALUE 0.
01 RIGHT-LIMIT PIC 9(6) VALUE 0.

PROCEDURE DIVISION.

ACCEPT DIAMOND-SIZE

IF DIAMOND-SIZE >= 01 AND <= 81


CONTINUE
ELSE
DISPLAY 'INCORRECT DIAMOND SIZE'
STOP RUN
END-IF

COMPUTE MIDDLE-OF-DIAMOND = (DIAMOND-SIZE / 2) + 1


MOVE 40 TO LEFT-LIMIT
RIGHT-LIMIT
PERFORM VARYING I FROM 1 BY 1 UNTIL I > DIAMOND-SIZE

MOVE SPACES TO STARS-FIELD


PERFORM VARYING J FROM LEFT-LIMIT BY 1 UNTIL
J > RIGHT-LIMIT
MOVE '*' TO STARS-FIELD(J:1)
END-PERFORM
DISPLAY STARS-FIELD

IF I < MIDDLE-OF-DIAMOND
SUBTRACT 1 FROM LEFT-LIMIT
ADD 1 TO RIGHT-LIMIT
ELSE
ADD 1 TO LEFT-LIMIT
SUBTRACT 1 FROM RIGHT-LIMIT
END-IF
END-PERFORM.
STOP RUN.

53
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL:
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=DIAMOND
//SYSOUT DD SYSOUT=*
//SYSIN DD *
21
/*
//*ENTER DIAMOND SIZE FROM 03 TO 81

54
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Infinite loop
Purpose : To know how to generate S322 abend.
Requirement : Execute a loop that goes to an infinite loop and check the EXPN-CNT and CPU
% in the DA of the SPOOL while the job is executing.
If EXPN-CNT is unchanged and CPU% is high then it indicates infinite loop.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. INFINITE.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9(1).
01 A PIC X(1).
01 B PIC X(1).

PROCEDURE DIVISION.

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 9


MOVE A TO B
END-PERFORM
STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=INFINITE
//SYSOUT DD SYSOUT=*

55
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Reverse a String
Purpose : To know about
1. How to use inline perform to scan the string from back to front
2. How to use reference modification to handle single character of a string
Requirement : Accept a string from SYSIN, then display string and reverse of a string.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. REVSTR.
AUTHOR. MADHU PADALA.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 STR1 PIC X(20).
01 STR2 PIC X(20).
01 I PIC 9(2).
01 J PIC 9(2) VALUE 20.
01 K PIC 9(2) VALUE 20.

PROCEDURE DIVISION.

ACCEPT STR1.
DISPLAY 'STRING :' STR1.

PERFORM VARYING I FROM 1 BY 1 UNTIL I > K


MOVE STR1(I: 1) TO STR2(J: 1)
COMPUTE J = J - 1
END-PERFORM.

DISPLAY 'REVERSE STRING:' STR2.

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=REVSTR
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SCHOOL OF MAINFRAMES
/*

Output :
STRING :SCHOOL OF MAINFRAMES
REVERSE STRING:SEMARFNIAM FO LOOHCS

56
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Load and Display a Table

Purpose : To know about


1. How to declare a subscripted table.
2. How to load a table and how to display all elements of a table.
Requirement : Accept product details from sysin and load into the table. Then display all
elements of the table.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. OCCUR1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.

WORKING-STORAGE SECTION.
01 I PIC S9(4) COMP VALUE ZEROS.

01 PRODUCT-DETAILS.
05 PRODUCT-TABLE OCCURS 5 TIMES.
10 PRODUCT-CODE PIC X(2).
10 PRODUCT-PRICE PIC 9(3)V99.

PROCEDURE DIVISION.

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5


ACCEPT PRODUCT-TABLE(I)
END-PERFORM

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5


DISPLAY PRODUCT-CODE(I) ',' PRODUCT-PRICE(I)
END-PERFORM

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=OCCUR1
//SYSOUT DD SYSOUT=*
//SYSIN DD *
P110000
P230000
P320000
P430000
P540000
/*

Output :
P1,10000
P2,30000
P3,20000
P4,30000
P5,40000

57
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Search table with loop


Purpose : To know about
1. How to find the matching element from a subscripted table.
2. How to pass the data from PARM to the linkage section.
Requirement : Accept product details from sysin and load into the table. Find product price of
the product code given in parm

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. OCCUR2.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 I PIC S9(4) COMP VALUE ZEROS.
01 PRODUCT-FOUND PIC X(1) VALUE 'N'.
01 PRODUCT-PRICE-EDIT PIC 9(3).99.

01 PRODUCT-DETAILS.
05 PRODUCT-TABLE OCCURS 5 TIMES.
10 PRODUCT-CODE PIC X(2).
10 PRODUCT-PRICE PIC 9(3)V99.

LINKAGE SECTION.
01 LS-VAR.
05 LS-LENGTH PIC S9(4) COMP.
05 LS-PRODUCT-CODE PIC X(2).

PROCEDURE DIVISION USING LS-VAR.

DISPLAY 'PARM PRODUCT OCDE IS:' LS-PRODUCT-CODE

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5


ACCEPT PRODUCT-TABLE(I)
END-PERFORM.

MOVE 'N' TO PRODUCT-FOUND

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5


OR PRODUCT-FOUND = 'Y'
IF PRODUCT-CODE(I) = LS-PRODUCT-CODE
MOVE PRODUCT-PRICE(I) TO PRODUCT-PRICE-EDIT
DISPLAY 'PRODUCT PRICE IS :' PRODUCT-PRICE-EDIT
MOVE 'Y' TO PRODUCT-FOUND
END-IF
END-PERFORM

IF PRODUCT-FOUND = 'N'
DISPLAY 'PRODUCT NOT FOUND'
END-IF

STOP RUN.

58
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=OCCUR2,PARM=(P3)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
P110000
P230000
P320000
P430000
P540000
/*

Output :
PARM PRODUCT OCDE IS:P3
PRODUCT PRICE IS :200.00

59
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Search table with Search Verb

Purpose: To know about


1. How to declare an indexed table
2. How to use SEARCH verb to find the matching element from an indexed table.
3. How to pass the data from PARM to the linkage section.
Requirement : Accept product details from sysin and load into the indexed table. Find product
price of the product code given in parm by using SEARCH verb.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. OCCUR3.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 PRODUCT-PRICE-EDIT PIC 9(3).99.
01 PRODUCT-FOUND PIC X(1) VALUE 'N'.

01 PRODUCT-DETAILS.
05 PRODUCT-TABLE OCCURS 5 TIMES INDEXED BY I.
10 PRODUCT-CODE PIC X(2).
10 PRODUCT-PRICE PIC 9(3)V99.

LINKAGE SECTION.
01 LS-VAR.
05 LS-LENGTH PIC S9(4) COMP.
05 LS-PRODUCT-CODE PIC X(2).

PROCEDURE DIVISION USING LS-VAR.

DISPLAY 'PARM PRODUCT CODE IS:' LS-PRODUCT-CODE

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5


ACCEPT PRODUCT-TABLE(I)
END-PERFORM

SET I TO 1
SEARCH PRODUCT-TABLE
AT END
DISPLAY 'PRODUCT NOT FOUND:'
WHEN PRODUCT-CODE(I) = LS-PRODUCT-CODE
MOVE PRODUCT-PRICE(I) TO PRODUCT-PRICE-EDIT
DISPLAY 'PRODUCT PRICE IS :' PRODUCT-PRICE-EDIT.

STOP RUN.

60
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=OCCUR3,PARM=(P3)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
P110000
P230000
P320000
P430000
P540000
/*

Output :
PARM PRODUCT CODE IS:P3
PRODUCT PRICE IS :200.00

61
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Search table with Searchall Verb

Purpose : To know about


1. How to declare an indexed table with ascending key clause.
2. How to use SEARCH ALL verb to find the matching element from an indexed table.
3. What happens if the data loaded in the table is not in the ascending order.
Requirement : Accept product details from sysin and load into the indexed table. Find product
price of the product code given in parm by using SEARCH ALL verb. Pass the data to the table
in an ascending order of the key otherwise it may give incorrect details.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. OCCUR4.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 PRODUCT-PRICE-EDIT PIC 9(3).99.
01 PRODUCT-FOUND PIC X(1) VALUE 'N'.

01 PRODUCT-DETAILS.
05 PRODUCT-TABLE OCCURS 5 TIMES ASCENDING KEY IS PRODUCT-CODE
INDEXED BY I.
10 PRODUCT-CODE PIC X(2).
10 PRODUCT-PRICE PIC 9(3)V99.

LINKAGE SECTION.
01 LS-VAR.
05 LS-LENGTH PIC S9(4) COMP.
05 LS-PRODUCT-CODE PIC X(2).

PROCEDURE DIVISION USING LS-VAR.

DISPLAY 'PARM PRODUCT CODE IS:' LS-PRODUCT-CODE

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5


ACCEPT PRODUCT-TABLE(I)
END-PERFORM.

SEARCH ALL PRODUCT-TABLE


AT END
DISPLAY 'PRODUCT NOT FOUND:'
WHEN PRODUCT-CODE(I) = LS-PRODUCT-CODE
MOVE PRODUCT-PRICE(I) TO PRODUCT-PRICE-EDIT
DISPLAY 'PRODUCT PRICE IS :' PRODUCT-PRICE-EDIT.

STOP RUN.

62
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=OCCUR4,PARM=(P3)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
P110000
P230000
P320000
P430000
P540000
/*

Output :
PARM PRODUCT CODE IS:P3
PRODUCT PRICE IS :200.00

63
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Two dimensional Table

Purpose : To know about


1. How to declare a two dimensional indexed table.
2. How to load data into two dimensional table.
3. How to search a required element from the two dimensional table.
Requirement : Accept state wise product details from sysin and load into the two dimensional
table. Find product price of the product code in a given state code.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. OCCUR5.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 PRODUCT-PRICE-EDIT PIC 9(3).99.
01 PRODUCT-FOUND PIC X(1) VALUE 'N'.

01 PRODUCT-DETAILS.
05 STATE-TABLE OCCURS 3 TIMES INDEXED BY I.
10 STATE-CODE PIC X(2).
10 PRODUCT-TABLE OCCURS 5 TIMES INDEXED BY J.
15 PRODUCT-CODE PIC X(2).
15 PRODUCT-PRICE PIC 9(3)V99.

LINKAGE SECTION.
01 LS-VAR.
05 LS-LENGTH PIC S9(4) COMP.
05 LS-STATE-CODE PIC X(2).
05 LS-PRODUCT-CODE PIC X(2).

PROCEDURE DIVISION USING LS-VAR.

DISPLAY 'STATE CODE IS:' LS-STATE-CODE


DISPLAY 'PRODUCT CODE IS:' LS-PRODUCT-CODE

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3


ACCEPT STATE-CODE(I)
PERFORM VARYING J FROM 1 BY 1 UNTIL J > 5
ACCEPT PRODUCT-TABLE(I, J)
END-PERFORM
END-PERFORM.

SET I TO 1
SEARCH STATE-TABLE
AT END
DISPLAY 'STATE NOT FOUND:'
WHEN STATE-CODE(I) = LS-STATE-CODE
SET J TO 1
SEARCH PRODUCT-TABLE
AT END
DISPLAY 'PRODUCT NOT FOUND:'

64
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

WHEN PRODUCT-CODE(I, J) = LS-PRODUCT-CODE


MOVE PRODUCT-PRICE(I, J) TO PRODUCT-PRICE-EDIT
DISPLAY 'PRODUCT PRICE IS :' PRODUCT-PRICE-EDIT
END-SEARCH
END-SEARCH

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=OCCUR5,PARM=(KAP3)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
AP
P110000
P230000
P320000
P430000
P540000
KA
P112500
P235000
P321000
P430000
P540000
TN
P112500
P230000
P320000
P431500
P540000
/*

Output :
STATE CODE IS:KA
PRODUCT CODE IS:P3
PRODUCT PRICE IS :210.00

65
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Recurring Search

Purpose : To know about


1. How to search an indexed table till the end to find more occurrences of a
given element.
Requirement : Accept product details from sysin and load into an indexed table.
Find the number of products that has the price greater than or equal the given price in the parm.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. OCCUR6.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 PRODUCT-COUNT PIC S9(4) COMP VALUE ZEROS.
01 STOP-LOOP PIC X(1) VALUE 'N'.
01 PRODUCT-PRICE-EDIT PIC 9(3).99.

01 PRODUCT-DETAILS.
05 PRODUCT-TABLE OCCURS 10 TIMES INDEXED BY I.
10 PRODUCT-CODE PIC X(2).
10 PRODUCT-PRICE PIC 9(3)V99.

LINKAGE SECTION.
01 LS-VAR.
05 LS-LENGTH PIC S9(4) COMP.
05 LS-PRODUCT-PRICE PIC 9(3)V99.

PROCEDURE DIVISION USING LS-VAR.

MOVE LS-PRODUCT-PRICE TO PRODUCT-PRICE-EDIT


DISPLAY 'PRODUCT PRICE IS:' PRODUCT-PRICE-EDIT

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10


ACCEPT PRODUCT-TABLE(I)
END-PERFORM.

SET I TO 1
PERFORM UNTIL STOP-LOOP = 'Y'
SEARCH PRODUCT-TABLE
AT END
MOVE 'Y' TO STOP-LOOP
WHEN PRODUCT-PRICE(I) >= LS-PRODUCT-PRICE
MOVE PRODUCT-PRICE(I) TO PRODUCT-PRICE-EDIT
DISPLAY PRODUCT-CODE(I) ',' PRODUCT-PRICE-EDIT
ADD +1 TO PRODUCT-COUNT
SET I UP BY 1
END-SEARCH
END-PERFORM
DISPLAY 'TOTAL PRODUCTS >= PRODUCT PRICE ARE:' PRODUCT-COUNT

STOP RUN.

66
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=OCCUR6,PARM=(30000)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
P110000
P225000
P320000
P430000
P540000
P610000
P730000
P825000
P930000
PA40000
/*

Output :
PRODUCT PRICE IS:300.00
P4,300.00
P5,400.00
P7,300.00
P9,300.00
PA,400.00
TOTAL PRODUCTS >= PRODUCT PRICE ARE:0005

67
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Bubble Sort

Purpose : To know how to sort an internal table.


Requirement : Accept unsorted data into internal table and then sort these table elements with
bubble sort technique.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. BUBLESRT.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.

WORKING-STORAGE SECTION.
01 I PIC S9(4) COMP VALUE ZEROS.
01 J PIC S9(4) COMP VALUE ZEROS.
01 SWAP-DONE PIC X(1) VALUE 'Y'.
01 WS-TEMP PIC X(2) VALUE SPACES.

01 FILLER.
05 TBL PIC X(2) OCCURS 5 TIMES.

PROCEDURE DIVISION.

DISPLAY 'ELEMENTS BEFORE SORT'


PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
ACCEPT TBL(I)
DISPLAY TBL(I)
END-PERFORM

MOVE 'Y' TO SWAP-DONE


PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4 OR SWAP-DONE = 'N'
MOVE 'N' TO SWAP-DONE
PERFORM VARYING J FROM 1 BY 1 UNTIL J > 4
IF TBL(J) > TBL(J + 1)
MOVE TBL(J + 1) TO WS-TEMP
MOVE TBL(J) TO TBL(J + 1)
MOVE WS-TEMP TO TBL(J)
MOVE 'Y' TO SWAP-DONE
END-IF
END-PERFORM
END-PERFORM.

DISPLAY 'ELEMENTS AFTER SORT '


PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
DISPLAY TBL(I)
END-PERFORM.

STOP RUN.

68
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=BUBLESRT
//SYSOUT DD SYSOUT=*
//SYSIN DD *
P5
P2
P1
P4
P3
/*

Output :
ELEMENTS BEFORE SORT
P5
P2
P1
P4
P3
ELEMENTS AFTER SORT
P1
P2
P3
P4
P5

69
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Fibonacci Series

Purpose : To know about


1. How to create dynamic occurs
2. How to write a logic to create Fibonacci series
3. How to use numeric editing characters to suppress leading zeros
Requirement : Display Fibonacci series in a single line with the limit passed from PARM.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. FIBONACI.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 A PIC S9(4) COMP VALUE 0.
01 B PIC S9(4) COMP VALUE 1.
01 I PIC S9(4) COMP VALUE ZEROS.

01 FIBONACCI-SERIES.
05 J-EDIT PIC ZZZZ9 OCCURS 1 TO 20 TIMES DEPENDING ON LS-K.
LINKAGE SECTION.
01 LS-VAR.
05 LS-LEN PIC S9(4) COMP.
05 LS-K PIC 9(2).

PROCEDURE DIVISION USING LS-VAR.

IF LS-K > 20
MOVE 20 TO LS-K
DISPLAY 'ENTER PARM VALUE LESS THAN 20'
END-IF
MOVE A TO J-EDIT(1)
MOVE B TO J-EDIT(2)

PERFORM VARYING I FROM 3 BY 2 UNTIL I > LS-K


COMPUTE A = A + B
MOVE A TO J-EDIT(I)
COMPUTE B = A + B
MOVE B TO J-EDIT(I + 1)
END-PERFORM
DISPLAY FIBONACCI-SERIES
STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=FIBONACI,PARM=(09)
//SYSOUT DD SYSOUT=*

Output :
0 1 1 2 3 5 8 13 21

70
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Static Call on Sub-program


Purpose : To know about
1. How to code and compile a sub-program
2. How to call a sub-program from main program
3. How to pass data from main program to the sub-program
4. How to call a sub-program static from the main program
5. Where to supply the sub-program load in the compilation of the main program
Requirement : Write a date validation sub-program to validate the date received from main
program. Accept date from SYSIN into main program and then call a sub-program to validate the
date. Display whether the date is valid or not in the main program.
Note: Use a separate load library for sub-program and main program for better clarity.

Main Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATE.
05 CCYY PIC 9(4).
05 MM PIC 9(2).
05 DD PIC 9(2).
01 WS-IND PIC X(1) VALUE SPACES.

PROCEDURE DIVISION.

ACCEPT WS-DATE
DISPLAY 'WS-DATE:' WS-DATE

CALL 'DATEVAL' USING WS-DATE,


WS-IND
IF WS-IND = 'Y'
DISPLAY 'DATE IS VALID'
ELSE
DISPLAY 'DATE IS INVALID'
END-IF

STOP RUN.

71
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Sub Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. DATEVAL.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-QUOTIENT PIC 9(1) VALUE ZEROS.
01 WS-REMAINDER PIC 9(4) VALUE ZEROS.

LINKAGE SECTION.
01 LS-DATE.
05 CCYY PIC 9(4).
05 MM PIC 9(2).
05 DD PIC 9(2).
01 LS-IND PIC X(1).

PROCEDURE DIVISION USING LS-DATE, LS-IND.

MOVE 'Y' TO LS-IND


PERFORM 100000-VAL-DATE THRU 100000-EXIT
GOBACK.

100000-VAL-DATE.

IF LS-DATE IS NUMERIC
CONTINUE
ELSE
MOVE 'N' TO LS-IND
GO TO 100000-EXIT
END-IF

IF MM >= 1 AND <= 12


CONTINUE
ELSE
MOVE 'N' TO LS-IND
GO TO 100000-EXIT
END-IF

DIVIDE CCYY BY 4 GIVING WS-QUOTIENT


REMAINDER WS-REMAINDER
EVALUATE MM
WHEN 01
WHEN 03
WHEN 05
WHEN 07
WHEN 08
WHEN 10
WHEN 12
IF DD >= 1 AND <= 31
CONTINUE
ELSE
MOVE 'N' TO LS-IND
END-IF

72
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

WHEN 04
WHEN 06
WHEN 09
WHEN 11
IF DD >= 1 AND <= 30
CONTINUE
ELSE
MOVE 'N' TO LS-IND
END-IF

WHEN 02
IF WS-REMAINDER = 0
IF DD >= 1 AND <= 29
CONTINUE
ELSE
MOVE 'N' TO LS-IND
END-IF
ELSE
IF DD >= 1 AND <= 28
CONTINUE
ELSE
MOVE 'N' TO LS-IND
END-IF
END-IF
END-EVALUATE.
100000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=MAIN1
//SYSOUT DD SYSOUT=*
//SYSIN DD *
20080229
/*

Output :
WS-DATE:20080229
DATE IS VALID

73
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Dynamic Call on Sub-program

Purpose : To know about


1. How to call a sub-program dynamic from the main program
2. Where to supply the sub-program load in the execution of the main program

Requirement : Accept date from sysin into main program and then call a sub-program to validate
the date. Display whether the date is valid or not in the main program.
Use the same date validation program DATEVAL created for MAIN1.
Note: Use a separate load library for sub-program and main program for better clarity.

Main Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN2.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATEVAL PIC X(8) VALUE 'DATEVAL'.
01 WS-DATE.
05 CCYY PIC 9(4).
05 MM PIC 9(2).
05 DD PIC 9(2).
01 WS-IND PIC X(1) VALUE SPACES.

PROCEDURE DIVISION.

ACCEPT WS-DATE
DISPLAY 'WS-DATE:' WS-DATE

CALL WS-DATEVAL USING WS-DATE,


WS-IND
IF WS-IND = 'Y'
DISPLAY 'DATE IS VALID'
ELSE
DISPLAY 'DATE IS INVALID'
END-IF

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=MAIN2
//SYSOUT DD SYSOUT=*
//SYSIN DD *
20080229
/*

Output :
WS-DATE:20080229
DATE IS VALID

74
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Future date sub-program

Purpose : To know about main program and sub-program.

Requirement : Write a future date sub-program to increment the data passed from main program.
Accept date from sysin into main program then call a sub-program to validate the date. If it is a
valid date then call another sub-program to get the future date. Display the date and its future
date. Use the same date validation sub-program that is created for MAIN1.

Main Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN3.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATE PIC 9(8).
01 WS-FUT-DATE PIC 9(8).
01 WS-IND PIC X(1) VALUE SPACES.

PROCEDURE DIVISION.

ACCEPT WS-DATE
DISPLAY 'WS-DATE :' WS-DATE

CALL 'DATEVAL' USING WS-DATE,


WS-IND
IF WS-IND = 'Y'
MOVE ZEROS TO WS-FUT-DATE
CALL 'FUTDATE' USING WS-DATE,
WS-FUT-DATE
DISPLAY 'WS-FUT-DATE:' WS-FUT-DATE
ELSE
DISPLAY 'DATE IS INVALID'
END-IF
STOP RUN.

Sub Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. FUTDATE.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
DATA DIVISION.

WORKING-STORAGE SECTION.
01 WS-REMAINDER PIC 9(1).
01 WS-QUOTIENT PIC 9(4).

LINKAGE SECTION.
01 LS-DATE PIC 9(8).
01 LS-FUTURE-DATE.
05 CCYY PIC 9(4).
05 MM PIC 9(2).
05 DD PIC 9(2).

75
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

PROCEDURE DIVISION USING LS-DATE, LS-FUTURE-DATE.

MOVE LS-DATE TO LS-FUTURE-DATE


PERFORM 100000-VAL-DATE THRU 100000-EXIT.
GOBACK.

100000-VAL-DATE.
DIVIDE CCYY BY 4 GIVING WS-QUOTIENT
REMAINDER WS-REMAINDER

ADD 1 TO DD

EVALUATE MM
WHEN 01
WHEN 03
WHEN 05
WHEN 07
WHEN 08
WHEN 10
IF DD > 31
ADD 1 TO MM
MOVE 1 TO DD
END-IF
WHEN 04
WHEN 06
WHEN 09
WHEN 11
IF DD > 30
ADD 1 TO MM
MOVE 1 TO DD
END-IF
WHEN 02
IF WS-REMAINDER = 0
IF DD > 29
ADD 1 TO MM
MOVE 1 TO DD
END-IF
ELSE
IF DD > 28
ADD 1 TO MM
MOVE 1 TO DD
END-IF
END-IF
WHEN 12
IF DD > 31
ADD 1 TO MM
MOVE 1 TO DD
END-IF
IF MM > 12
MOVE 1 TO MM
ADD 1 TO CCYY
END-IF
END-EVALUATE.

100000-EXIT.
EXIT.

76
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=MAIN3
//SYSOUT DD SYSOUT=*
//SYSIN DD *
20080229
/*

Output :
WS-DATE:20080229
WS-FUT-DATE:20080301

77
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Write a File

Purpose : To know how to declare a file in the COBOL program and how to relate it in the
JCL.
Requirement : Accept each record from SYSIN and write into a file.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. ACPTWRT.
AUTHOR. MADHU PADALA.

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

SELECT EMP-FILE ASSIGN TO EMPFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-OUT-STATUS.

DATA DIVISION.
FILE SECTION.

FD EMP-FILE
RECORDING MODE IS F
RECORD CONTAINS 32 CHARACTERS
BLOCK CONTAINS 320 CHARACTERS.

01 EMP-REC.
05 EMP-NUM PIC X(04).
05 EMP-NAME PIC X(10).
05 EMP-STATUS PIC X(1).
05 EMP-DOJ PIC X(8).
05 EMP-SALARY PIC 9(7)V99.

WORKING-STORAGE SECTION.
01 WS-OUT-STATUS PIC X(2).

PROCEDURE DIVISION.

OPEN OUTPUT EMP-FILE

PERFORM 10 TIMES
ACCEPT EMP-REC
WRITE EMP-REC
END-PERFORM

CLOSE EMP-FILE
STOP RUN.

78
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.EMPFILE,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=ACPTWRT
//SYSOUT DD SYSOUT=*
//*
//EMPFILE DD DSN=IBMUSER.SMF.EMPFILE,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=32,BLKSIZE=0)
//SYSIN DD *
E001DAVID A20050421005000000
E002MURRAY T20060310007000000
E003LARA A20070623004500000
E004STEPHEN T20070325005300000
E005NICOLAS T20080212004700000
E006LEE A20080512005630000
E007RAM T20090621004850000
E008SYAM A20100506003900000
E009MEENA A20100421003800000
E010LAASYA A20110312005700000
/*

Output :

IBMUSER.SMF.EMPFILE
E001DAVID A20050421005000000
E002MURRAY T20060310007000000
E003LARA A20070623004500000
E004STEPHEN T20070325005300000
E005NICOLAS T20080212004700000
E006LEE A20080512005630000
E007RAM T20090621004850000
E008SYAM A20100506003900000
E009MEENA A20100421003800000
E010LAASYA A20110312005700000

79
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Read a File

Purpose : To know how to declare a file in the COBOL program and how to relate it in the
JCL.To know how to read input file.
Requirement : Take the output file of ACPTWRT as input then Read and display all records.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. READDISP.
AUTHOR. MADHU PADALA.

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

SELECT EMP-FILE ASSIGN TO EMPFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-IN-STATUS.

DATA DIVISION.
FILE SECTION.

FD EMP-FILE
RECORDING MODE IS F
RECORD CONTAINS 32 CHARACTERS
BLOCK CONTAINS 320 CHARACTERS.

01 EMP-REC.
05 EMP-NUM PIC X(04).
05 EMP-NAME PIC X(10).
05 EMP-STATUS PIC X(1).
05 EMP-DOJ PIC X(8).
05 EMP-SALARY PIC 9(7)V99.

WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC X(2).

PROCEDURE DIVISION.

OPEN INPUT EMP-FILE

PERFORM UNTIL WS-IN-STATUS = '10'


READ EMP-FILE
IF WS-IN-STATUS = '00'
DISPLAY EMP-REC
END-IF
END-PERFORM

CLOSE EMP-FILE
STOP RUN.

80
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS20 EXEC PGM=READDISP
//SYSOUT DD SYSOUT=*
//*
//EMPFILE DD DSN=IBMUSER.SMF.EMPFILE,DISP=SHR

Input File:

IBMUSER.SMF.EMPFILE
E001DAVID A20050421005000000
E002MURRAY T20060310007000000
E003LARA A20070623004500000
E004STEPHEN T20070325005300000
E005NICOLAS T20080212004700000
E006LEE A20080512005630000
E007RAM T20090621004850000
E008SYAM A20100506003900000
E009MEENA A20100421003800000
E010LAASYA A20110312005700000

Output :
E001DAVID A20050421005000000
E002MURRAY T20060310007000000
E003LARA A20070623004500000
E004STEPHEN T20070325005300000
E005NICOLAS T20080212004700000
E006LEE A20080512005630000
E007RAM T20090621004850000
E008SYAM A20100506003900000
E009MEENA A20100421003800000
E010LAASYA A20110312005700000

81
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Read and Write on File

Purpose : To know how to read a file from top to bottom in Method1.


To know about file declarations in the below areas of the program.
1. Select statement of Environment division with logical file name, ddname,
organization, access mode and file status
2. FD entry of file section with Recording mode, record format, layout
3. File status in working storage section
4. Open statement with input and output modes
5. Read and write statement
6. Close files
To know how to take the data into input file according to the layout.
Requirement : Read emp-file and write active employees into output file with few fields of
input.See the layouts of input and output files in the program.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. READ1.
AUTHOR. MADHU PADALA.

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

SELECT EMP-FILE ASSIGN TO EMPFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-IN-STATUS.

SELECT OUT-FILE ASSIGN TO OUTFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-OUT-STATUS.

DATA DIVISION.
FILE SECTION.

FD EMP-FILE
RECORDING MODE IS F
RECORD CONTAINS 32 CHARACTERS
BLOCK CONTAINS 320 CHARACTERS.

01 EMP-REC.
05 EMP-NUM PIC X(04).
05 EMP-NAME PIC X(10).
05 EMP-STATUS PIC X(1).
05 EMP-DOJ PIC X(8).
05 EMP-SALARY PIC 9(7)V99.

FD OUT-FILE
RECORDING MODE IS F
RECORD CONTAINS 23 CHARACTERS
BLOCK CONTAINS 230 CHARACTERS.

82
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

01 OUT-REC.
05 OUT-EMP-NUM PIC X(04).
05 OUT-EMP-NAME PIC X(10).
05 OUT-EMP-SALARY PIC 9(7)V99.

WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC X(2).
01 WS-OUT-STATUS PIC X(2).

PROCEDURE DIVISION.

OPEN INPUT EMP-FILE


OUTPUT OUT-FILE.

PERFORM UNTIL WS-IN-STATUS = '10'


READ EMP-FILE
IF WS-IN-STATUS = '00'
IF EMP-STATUS = 'A'
MOVE EMP-NUM TO OUT-EMP-NUM
MOVE EMP-NAME TO OUT-EMP-NAME
MOVE EMP-SALARY TO OUT-EMP-SALARY
WRITE OUT-REC
END-IF
END-IF
END-PERFORM
CLOSE EMP-FILE
OUT-FILE.
STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.READ1.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=READ1
//SYSOUT DD SYSOUT=*
//*
//EMPFILE DD DSN=IBMUSER.SMF.EMPFILE,DISP=SHR
//OUTFILE DD DSN=IBMUSER.SMF.READ1.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=23,BLKSIZE=0)
//*

Output :

IBMUSER.SMF.READ1.OUT
E001DAVID 005000000
E003LARA 004500000
E006LEE 005630000
E008SYAM 003900000
E009MEENA 003800000
E010LAASYA 005700000

83
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Read and Write on File


Purpose : To know how to read a file from top to bottom in Method2.
To know how to take the data into input file according to the layout.

Requirement : Read emp-file and write active employees into output file with few fields of
input. See the layouts of input and output files in the program.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. READ2.
AUTHOR. MADHU PADALA.

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

SELECT EMP-FILE ASSIGN TO EMPFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-IN-STATUS.

SELECT OUT-FILE ASSIGN TO OUTFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-OUT-STATUS.

DATA DIVISION.
FILE SECTION.

FD EMP-FILE
RECORDING MODE IS F
RECORD CONTAINS 32 CHARACTERS
BLOCK CONTAINS 320 CHARACTERS.

01 EMP-REC.
05 EMP-NUM PIC X(04).
05 EMP-NAME PIC X(10).
05 EMP-STATUS PIC X(1).
05 EMP-DOJ PIC X(1).
05 EMP-SALARY PIC 9(7)V99.

FD OUT-FILE
RECORDING MODE IS F
RECORD CONTAINS 23 CHARACTERS
BLOCK CONTAINS 230 CHARACTERS.

01 OUT-REC.
05 OUT-EMP-NUM PIC X(04).
05 OUT-EMP-NAME PIC X(10).
05 OUT-EMP-SALARY PIC 9(7)V99.

WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC X(2).
01 WS-OUT-STATUS PIC X(2).

84
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

PROCEDURE DIVISION.

OPEN INPUT EMP-FILE


OUTPUT OUT-FILE.

READ EMP-FILE

PERFORM UNTIL WS-IN-STATUS = '10'


IF EMP-STATUS = 'A'
MOVE EMP-NUM TO OUT-EMP-NUM
MOVE EMP-NAME TO OUT-EMP-NAME
MOVE EMP-SALARY TO OUT-EMP-SALARY
WRITE OUT-REC
END-IF
READ EMP-FILE
END-PERFORM

CLOSE EMP-FILE
OUT-FILE.
STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.READ2.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=READ2
//SYSOUT DD SYSOUT=*
//*
//EMPFILE DD DSN=IBMUSER.SMF.EMPFILE,DISP=SHR
//OUTFILE DD DSN=IBMUSER.SMF.READ2.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=23,BLKSIZE=0)
//*

Output :

IBMUSER.SMF.READ2.OUT
E001DAVID 005042100
E003LARA 007062300
E006LEE 008051200
E008SYAM 010050600
E009MEENA 010042100
E010LAASYA 011031200

85
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Write a summary record


Purpose : To know how to write a summary record that is accumulated from entire input file.
Requirement : Read entire emp-file and write the total salary of all active employees into output
file as a single record.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. WRITETOT.
AUTHOR. MADHU PADALA.

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

SELECT EMP-FILE ASSIGN TO EMPFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-IN-STATUS.

SELECT OUT-FILE ASSIGN TO OUTFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-OUT-STATUS.

DATA DIVISION.
FILE SECTION.

FD EMP-FILE
RECORDING MODE IS F
RECORD CONTAINS 32 CHARACTERS
BLOCK CONTAINS 320 CHARACTERS.

01 EMP-REC.
05 EMP-NUM PIC X(04).
05 EMP-NAME PIC X(10).
05 EMP-STATUS PIC X(1).
05 EMP-DOJ PIC X(8).
05 EMP-SALARY PIC 9(7)V99.

FD OUT-FILE
RECORDING MODE IS F
RECORD CONTAINS 50 CHARACTERS
BLOCK CONTAINS 500 CHARACTERS.

01 OUT-REC.
05 OUT-DESC PIC X(38).
05 OUT-TOT-SALARY PIC 9(9).99.

WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC X(2).
01 WS-OUT-STATUS PIC X(2).
01 WS-TOT-SALARY PIC 9(9)V99 VALUE ZEROS.

86
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

PROCEDURE DIVISION.

OPEN INPUT EMP-FILE


OUTPUT OUT-FILE.

PERFORM UNTIL WS-IN-STATUS = '10'


READ EMP-FILE
IF WS-IN-STATUS = '00'
IF EMP-STATUS = 'A'
ADD EMP-SALARY TO WS-TOT-SALARY
END-IF
END-IF
END-PERFORM

MOVE WS-TOT-SALARY TO OUT-TOT-SALARY


MOVE 'TOTAL SALARY OF ALL ACTIVE EMPLOYEES: ' TO OUT-DESC
WRITE OUT-REC

CLOSE EMP-FILE
OUT-FILE.

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.WRITETOT.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=WRITETOT
//SYSOUT DD SYSOUT=*
//*
//EMPFILE DD DSN=IBMUSER.SMF.EMPFILE,DISP=SHR
//OUTFILE DD DSN=IBMUSER.SMF.WRITETOT.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=50,BLKSIZE=0)
//*

Output :
TOTAL SALARY OF ALL ACTIVE EMPLOYEES: 000285300.00

87
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Read a control file


Purpose : To know how to process the main input file (Driver file) with the control
information from a control card.
To know how to generate return-code to JCL and also how to generate user abend.

Requirement : Read date control card and get the control date, then read emp-file and write into
output if the employee is joined after the control date. Generate user abend U1001 or 12 to
return-code if the date control card is empty. See the layouts of input and output files from the
program.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. READCNTL.
AUTHOR. MADHU PADALA.

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

SELECT EMP-FILE ASSIGN TO EMPFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-IN-STATUS.

SELECT DATE-CARD ASSIGN TO DATECARD


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-DATE-STATUS.

SELECT OUT-FILE ASSIGN TO OUTFILE


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-OUT-STATUS.

DATA DIVISION.
FILE SECTION.

FD EMP-FILE
RECORDING MODE IS F
RECORD CONTAINS 32 CHARACTERS
BLOCK CONTAINS 320 CHARACTERS.

01 EMP-REC.
05 EMP-NUM PIC X(04).
05 EMP-NAME PIC X(10).
05 EMP-STATUS PIC X(1).
05 EMP-DOJ PIC X(8).
05 EMP-SALARY PIC 9(7)V99.

FD DATE-CARD
RECORDING MODE IS F
RECORD CONTAINS 80 CHARACTERS.

01 DATE-REC.
05 CNTL-DATE PIC X(08).
05 FILLER PIC X(72).

88
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

FD OUT-FILE
RECORDING MODE IS F
RECORD CONTAINS 23 CHARACTERS
BLOCK CONTAINS 230 CHARACTERS.

01 OUT-REC.
05 OUT-EMP-NUM PIC X(04).
05 OUT-EMP-NAME PIC X(10).
05 OUT-EMP-SALARY PIC 9(7)V99.

WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC X(2).
01 WS-DATE-STATUS PIC X(2).
01 WS-OUT-STATUS PIC X(2).

PROCEDURE DIVISION.

OPEN INPUT EMP-FILE


DATE-CARD
OUTPUT OUT-FILE.

READ DATE-CARD
IF WS-DATE-STATUS = '10'
DISPLAY 'DATE CARD IS EMPTY:'
* MOVE 1001 TO ABEND-CODE
* CALL VCSABEND USING ABEND-CODE
MOVE 12 TO RETURN-CODE
STOP RUN.

PERFORM UNTIL WS-IN-STATUS = '10'


READ EMP-FILE
IF WS-IN-STATUS = '00'
IF EMP-STATUS = 'T' AND EMP-DOJ >= CNTL-DATE
MOVE EMP-NUM TO OUT-EMP-NUM
MOVE EMP-NAME TO OUT-EMP-NAME
MOVE EMP-SALARY TO OUT-EMP-SALARY
WRITE OUT-REC
END-IF
END-IF
END-PERFORM

CLOSE EMP-FILE
DATE-CARD
OUT-FILE.

STOP RUN.

RunJCL:
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.READCNTL.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*

89
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

//JS20 EXEC PGM=READCNTL


//SYSOUT DD SYSOUT=*
//*
//EMPFILE DD DSN=IBMUSER.SMF.EMPFILE,DISP=SHR
//DATECARD DD DSN=IBMUSER.SMF.CNTLLIB(DATECARD),DISP=SHR
//OUTFILE DD DSN=IBMUSER.SMF.READCNTL.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=23,BLKSIZE=0)
//*

Datecard :

IBMUSER.SMF.CNTLLIB(DATECARD)
20080101

Output :

IBMUSER.SMF.READCNTL.OUT
E005NICOLAS 004700000
E007RAM 004850000

90
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Copy
Purpose : To know how to use a copybook in a program and how to supply copy library in the
compilation.

Requirement : Read emp-file from top to bottom and write active employee information into
output file. Use a copybook for the layout of emp-file.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. COPY1.
AUTHOR. MADHU PADALA.

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

SELECT EMP-IN ASSIGN TO EMPIN


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-IN-STATUS.

SELECT EMP-OUT ASSIGN TO EMPOUT


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

FD EMP-IN
RECORDING MODE IS F
RECORD CONTAINS 32 CHARACTERS
BLOCK CONTAINS 320 CHARACTERS.

COPY CPEMP.

FD EMP-OUT
RECORDING MODE IS F
RECORD CONTAINS 23 CHARACTERS
BLOCK CONTAINS 230 CHARACTERS.

01 OUT-EMP-REC.
05 OUT-EMP-NUM PIC X(04).
05 OUT-EMP-NAME PIC X(10).
05 OUT-EMP-SALARY PIC 9(7)V99.

WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC X(2).

91
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

PROCEDURE DIVISION.

OPEN INPUT EMP-IN


OUTPUT EMP-OUT

PERFORM UNTIL WS-IN-STATUS = '10'


READ EMP-IN
IF WS-IN-STATUS = '00'
IF EMP-STATUS = 'A'
MOVE EMP-NUM TO OUT-EMP-NUM
MOVE EMP-NAME TO OUT-EMP-NAME
MOVE EMP-SALARY TO OUT-EMP-SALARY
WRITE OUT-EMP-REC
END-IF
END-IF
END-PERFORM

CLOSE EMP-IN
EMP-OUT
STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.COPY1.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=COPY1
//SYSOUT DD SYSOUT=*
//*
//EMPIN DD DSN=IBMUSER.SMF.EMPFILE,DISP=SHR
//EMPOUT DD DSN=IBMUSER.SMF.COPY1.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=23,BLKSIZE=0)
//*

Output :

IBMUSER.SMF.COPY1.OUT
E001DAVID 005000000
E003LARA 004500000
E006LEE 005630000
E008SYAM 003900000
E009MEENA 003800000
E010LAASYA 005700000

92
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Copy With Replacing option


Purpose : To know how to use a copybook with replacing option.

Requirement : Read emp-file from top to bottom and write active employee information into
output file. Take the layout of input and output files as same. That means, use the same
copybook for input and output files with replacing option.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. COPY2.
AUTHOR. MADHU PADALA.

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

SELECT EMP-IN ASSIGN TO EMPIN


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-IN-STATUS.

SELECT EMP-OUT ASSIGN TO EMPOUT


ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

FD EMP-IN
RECORDING MODE IS F
RECORD CONTAINS 32 CHARACTERS
BLOCK CONTAINS 320 CHARACTERS.

COPY CPEMP REPLACING EMP-REC BY IN-EMP-REC.

FD EMP-OUT
RECORDING MODE IS F
RECORD CONTAINS 32 CHARACTERS
BLOCK CONTAINS 320 CHARACTERS.

COPY CPEMP REPLACING EMP-REC BY OUT-EMP-REC.

WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC X(2).

93
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

PROCEDURE DIVISION.

OPEN INPUT EMP-IN


OUTPUT EMP-OUT

PERFORM UNTIL WS-IN-STATUS = '10'


READ EMP-IN
IF WS-IN-STATUS = '00'
IF EMP-STATUS IN IN-EMP-REC = 'A'
MOVE IN-EMP-REC TO OUT-EMP-REC
WRITE OUT-EMP-REC
END-IF
END-IF
END-PERFORM

CLOSE EMP-IN
EMP-OUT
STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.COPY2.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=COPY2
//SYSOUT DD SYSOUT=*
//*
//EMPIN DD DSN=IBMUSER.SMF.EMPFILE,DISP=SHR
//EMPOUT DD DSN=IBMUSER.SMF.COPY2.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=32,BLKSIZE=0)
//*

Output :

IBMUSER.SMF.COPY2.OUT
E001DAVID A20050421005000000
E003LARA A20070623004500000
E006LEE A20080512005630000
E008SYAM A20100506003900000
E009MEENA A20100421003800000
E010LAASYA A20110312005700000

94
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Currency Conversion Method1


Purpose : To tell about
How to get a cross reference data from another sequential file.

Requirement : Read a Product file and get the currency conversion rate from forex file, then
write output file with product price in usd if the currency is found otherwise write input record
into error file.

Approach : Read product file, then open forex file and read it from top to bottom until you find
currency code or end of file and then close forex file. If the currency is found in forex file, then
write outfile with conversion, otherwise write input record into error file.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. CURCONV1.
AUTHOR. MADHU PADALA.

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

SELECT PRODUCT-FILE ASSIGN TO PRODFILE.


SELECT FOREX-FILE ASSIGN TO FRXFILE
FILE STATUS IS WS-FRX-STATUS.
SELECT ERROR-FILE ASSIGN TO ERRFILE.
SELECT OUT-FILE ASSIGN TO OUTFILE.

DATA DIVISION.
FILE SECTION.

FD PRODUCT-FILE.
01 PRODUCT-REC.
05 PRODUCT-CODE PIC X(04).
05 CURR-CODE PIC X(03).
05 PRODUCT-PRICE PIC 9(5)V99.

FD FOREX-FILE.
01 FOREX-RATE-REC.
05 FRX-CURR-CODE PIC X(03).
05 FILLER PIC X(02).
05 FRX-RATE PIC 9(03)V9(4).
05 FILLER PIC X(02).
05 CURR-DESC PIC X(20).
05 FILLER PIC X(02).
05 CURR-COUNTRY PIC X(20).

FD ERROR-FILE.
01 ERROR-REC PIC X(14).

FD OUT-FILE.
01 OUT-REC.
05 OUT-PRODUCT-CODE PIC X(04).
05 OUT-CURR-CODE PIC X(03).
05 OUT-PRODUCT-PRICE PIC 9(5)V99.
05 OUT-FRX-RATE PIC 9(3)V9(4).
05 OUT-PRICE-IN-USD PIC 9(7)V9(2).

95
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

WORKING-STORAGE SECTION.
01 WS-EOF-IN PIC X(1) VALUE 'N'.
01 WS-FRX-STATUS PIC X(2) VALUE SPACES.
01 WS-CURR-FOUND PIC X(1) VALUE 'N'.
01 WS-FRX-RATE PIC 9(3)V9(4) VALUE ZEROS.

PROCEDURE DIVISION.
000000-MAINLINE.

PERFORM 100000-INITIALIZATION THRU 100000-EXIT.


PERFORM 200000-PROCESS THRU 200000-EXIT
UNTIL WS-EOF-IN = 'Y'.
PERFORM 300000-TERMINATION THRU 300000-EXIT.
STOP RUN.

100000-INITIALIZATION.

OPEN INPUT PRODUCT-FILE


OUTPUT ERROR-FILE
OUT-FILE.

100000-EXIT.
EXIT.

200000-PROCESS.
READ PRODUCT-FILE AT END MOVE 'Y' TO WS-EOF-IN
GO TO 200000-EXIT.

OPEN INPUT FOREX-FILE


MOVE 'N' TO WS-CURR-FOUND

PERFORM UNTIL WS-FRX-STATUS = '10'


OR WS-CURR-FOUND = 'Y'

READ FOREX-FILE
IF CURR-CODE = FRX-CURR-CODE
MOVE 'Y' TO WS-CURR-FOUND
MOVE FRX-RATE TO WS-FRX-RATE
END-IF
END-PERFORM

CLOSE FOREX-FILE.

IF WS-CURR-FOUND = 'N'
DISPLAY 'RATE NOT FOUND FOR CURRENCY :' CURR-CODE
MOVE PRODUCT-REC TO ERROR-REC
WRITE ERROR-REC
GO TO 200000-EXIT.

MOVE PRODUCT-CODE TO OUT-PRODUCT-CODE


MOVE CURR-CODE TO OUT-CURR-CODE
MOVE PRODUCT-PRICE TO OUT-PRODUCT-PRICE
MOVE WS-FRX-RATE TO OUT-FRX-RATE
COMPUTE OUT-PRICE-IN-USD ROUNDED =
PRODUCT-PRICE * WS-FRX-RATE
WRITE OUT-REC.

200000-EXIT.
EXIT.

96
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

300000-TERMINATION.
CLOSE PRODUCT-FILE
ERROR-FILE
OUT-FILE.

300000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.CURCONV1.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(TRK,(1,1),RLSE)
//DD2 DD DSN=IBMUSER.SMF.CURCONV1.ERROR,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(TRK,(1,1),RLSE)
//*
//JS20 EXEC PGM=CURCONV1
//SYSOUT DD SYSOUT=*
//*
//PRODFILE DD DSN=IBMUSER.SMF.PRODUCT,DISP=SHR
//FRXFILE DD DSN=IBMUSER.SMF.FOREX,DISP=SHR
//ERRFILE DD DSN=IBMUSER.SMF.CURCONV1.ERROR,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=14,BLKSIZE=0)
//OUTFILE DD DSN=IBMUSER.SMF.CURCONV1.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=30,BLKSIZE=0)
//*

Product file:
IBMUSER.SMF.PRODUCT
P001AED0073448
P001AUD0019380
P001BHD0007520
P001CHF0018934
P001DKK0116482
P001EUR0015662
P001INR1030928
P001RUR0630915
P001SAR0074991
P001SGD0025763
P002AED0110173
P002AUD0029070
P002BHD0011280
P002CHF0028401
P002DKK0174723
P002EUR0023493
P002INR1546392
P002RUR0946372
P002SAR0112486
P002SGD0003865

97
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Forex file :

IBMUSER.SMF.FOREX
AUD 0010320 AUSTRALIAN DOLLAR AUSTRALIA
BHD 0026596 BAHRAINI DINAR BAHRAIN
BND 0007763 BRUNEI DOLLAR BRUNEI
BRL 0005595 BRAZILIAN REAL BRAZIL
CAD 0009761 CANADIAN DOLLAR CANADA
CHF 0010563 SWISS FRANC SWITZERLAND
DKK 0001717 DANISH KRONE DENMARK
EUR 0012770 EURO EUROPEAN UNION
INR 0000194 INDIAN RUPEE INDIA
JPY 0000130 YEN JAPAN

Error file :

IBMUSER.SMF.CURCONV1.ERROR
P001AED0073448
P001RUR0630915
P001SAR0074991
P001SGD0025763
P002AED0110173
P002RUR0946372
P002SAR0112486
P002SGD0003865

Output file :

IBMUSER.SMF.CURCONV1.OUT
P001AUD00193800010320000020000
P001BHD00075200026596000020000
P001CHF00189340010563000020000
P001DKK01164820001717000020000
P001EUR00156620012770000020000
P001INR10309280000194000020000
P002AUD00290700010320000030000
P002BHD00112800026596000030000
P002CHF00284010010563000030000
P002DKK01747230001717000030000
P002EUR00234930012770000030001
P002INR15463920000194000030000

98
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Currency Conversion Method2

Purpose : To tell about


How to load cross reference file into subscripted internal table.
How to loop through the table to get matched data.

Requirement : Read a Product file and get the currency conversion rate from forex file, then
write output file with product price in usd if the currency is found otherwise write input record
into error file.

Approach : 1. Read forex file and load subscripted internal table.


2. Read product file and find the currency code from the table and get conversion rate.
3. If the currency code found in internal table then write record into output file
otherwise write into error file.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. CURCONV2.
AUTHOR. MADHU PADALA.

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

SELECT PRODUCT-FILE ASSIGN TO PRODFILE.


SELECT FOREX-FILE ASSIGN TO FRXFILE.
SELECT ERROR-FILE ASSIGN TO ERRFILE.
SELECT OUT-FILE ASSIGN TO OUTFILE.

DATA DIVISION.
FILE SECTION.

FD PRODUCT-FILE.
01 PRODUCT-REC.
05 PRODUCT-CODE PIC X(04).
05 CURR-CODE PIC X(03).
05 PRODUCT-PRICE PIC 9(5)V99.

FD FOREX-FILE.
01 FOREX-RATE-REC.
05 FRX-CURR-CODE PIC X(03).
05 FILLER PIC X(02).
05 FRX-RATE PIC 9(03)V9(4).
05 FILLER PIC X(02).
05 CURR-DESC PIC X(20).
05 FILLER PIC X(02).
05 CURR-COUNTRY PIC X(20).

FD ERROR-FILE.
01 ERROR-REC PIC X(14).

FD OUT-FILE.
01 OUT-REC.
05 OUT-PRODUCT-CODE PIC X(04).
05 OUT-CURR-CODE PIC X(03).
05 OUT-PRODUCT-PRICE PIC 9(5)V99.

99
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

05 OUT-FRX-RATE PIC 9(3)V9(4).


05 OUT-PRICE-IN-USD PIC 9(7)V9(2).

WORKING-STORAGE SECTION.
01 WS-EOF-IN PIC X(1) VALUE 'N'.
01 WS-EOF-FRX PIC X(1) VALUE 'N'.
01 WS-COUNT PIC S9(4) COMP VALUE 1.
01 WS-FRX-RATE PIC 9(3)V9(4) VALUE ZEROS.
01 WS-CURR-FOUND PIC X(1).

01 FILLER.
05 FRX-TBL OCCURS 10 TIMES.
10 TBL-CURR-CODE PIC X(03).
10 TBL-FRX-RATE PIC 9(3)V9(4).

PROCEDURE DIVISION.
000000-MAINLINE.

PERFORM 100000-INITIALIZATION THRU 100000-EXIT.


PERFORM 200000-PROCESS THRU 200000-EXIT
UNTIL WS-EOF-IN = 'Y'.
PERFORM 300000-TERMINATION THRU 300000-EXIT.
STOP RUN.

100000-INITIALIZATION.

OPEN INPUT PRODUCT-FILE


FOREX-FILE
OUTPUT ERROR-FILE
OUT-FILE.

PERFORM 110000-LOAD-TABLE THRU 110000-EXIT


UNTIL WS-EOF-FRX = 'Y' OR
WS-COUNT > 10.

100000-EXIT.
EXIT.

110000-LOAD-TABLE.
READ FOREX-FILE AT END MOVE 'Y' TO WS-EOF-FRX
GO TO 110000-EXIT.

MOVE FRX-CURR-CODE TO TBL-CURR-CODE(WS-COUNT)


MOVE FRX-RATE TO TBL-FRX-RATE(WS-COUNT)
ADD +1 TO WS-COUNT.

110000-EXIT.
EXIT.

200000-PROCESS.
READ PRODUCT-FILE AT END MOVE 'Y' TO WS-EOF-IN
GO TO 200000-EXIT.
MOVE 'N' TO WS-CURR-FOUND
PERFORM VARYING WS-COUNT FROM 1 BY 1 UNTIL WS-COUNT > 10
OR WS-CURR-FOUND = 'Y'
IF CURR-CODE IN PRODUCT-REC = TBL-CURR-CODE(WS-COUNT)
MOVE TBL-FRX-RATE(WS-COUNT) TO WS-FRX-RATE
MOVE 'Y' TO WS-CURR-FOUND
END-IF
END-PERFORM

100
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

IF WS-CURR-FOUND = 'N'
DISPLAY 'RATE NOT FOUND FOR CURRENCY :' CURR-CODE
MOVE PRODUCT-REC TO ERROR-REC
WRITE ERROR-REC
GO TO 200000-EXIT.

MOVE PRODUCT-CODE TO OUT-PRODUCT-CODE


MOVE CURR-CODE TO OUT-CURR-CODE
MOVE PRODUCT-PRICE TO OUT-PRODUCT-PRICE
MOVE WS-FRX-RATE TO OUT-FRX-RATE
COMPUTE OUT-PRICE-IN-USD ROUNDED =
PRODUCT-PRICE * WS-FRX-RATE

WRITE OUT-REC.

200000-EXIT.
EXIT.

300000-TERMINATION.
CLOSE PRODUCT-FILE
FOREX-FILE
ERROR-FILE
OUT-FILE.

300000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//DD1 DD DSN=IBMUSER.SMF.CURCONV2.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(TRK,(1,1),RLSE)
//DD2 DD DSN=IBMUSER.SMF.CURCONV2.ERROR,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(TRK,(1,1),RLSE)
//*
//JS20 EXEC PGM=CURCONV2
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//*
//PRODFILE DD DSN=IBMUSER.SMF.PRODUCT,DISP=SHR
//FRXFILE DD DSN=IBMUSER.SMF.FOREX,DISP=SHR
//ERRFILE DD DSN=IBMUSER.SMF.CURCONV2.ERROR,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=14,BLKSIZE=0)
//OUTFILE DD DSN=IBMUSER.SMF.CURCONV2.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=30,BLKSIZE=0)
//*

101
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Currency Conversion Method3


Purpose : To tell about
How to load cross reference file into indexed internal table.
How to search the table to get matched data.

Requirement : Read a Product file and get the currency conversion rate from forex file, then
write output file with product price in usd if the currency is found otherwise write input record
into error file.

Approach :
1. Read forex file and load indexed internal table.
2. Read product file and find currency code from the table with SEARCH verb and
get conversion rate.
3. If the currency code found in internal table then write record into output file otherwise
write into error file.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. CURCONV3.
AUTHOR. MADHU PADALA.

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

SELECT PRODUCT-FILE ASSIGN TO PRODFILE.


SELECT FOREX-FILE ASSIGN TO FRXFILE.
SELECT ERROR-FILE ASSIGN TO ERRFILE.
SELECT OUT-FILE ASSIGN TO OUTFILE.

DATA DIVISION.
FILE SECTION.
FD PRODUCT-FILE.
01 PRODUCT-REC.
05 PRODUCT-CODE PIC X(04).
05 CURR-CODE PIC X(03).
05 PRODUCT-PRICE PIC 9(5)V99.

FD FOREX-FILE.
01 FOREX-RATE-REC.
05 FRX-CURR-CODE PIC X(03).
05 FILLER PIC X(02).
05 FRX-RATE PIC 9(03)V9(4).
05 FILLER PIC X(02).
05 CURR-DESC PIC X(20).
05 FILLER PIC X(02).
05 CURR-COUNTRY PIC X(20).

FD ERROR-FILE.
01 ERROR-REC PIC X(14).

102
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

FD OUT-FILE.
01 OUT-REC.
05 OUT-PRODUCT-CODE PIC X(04).
05 OUT-CURR-CODE PIC X(03).
05 OUT-PRODUCT-PRICE PIC 9(5)V99.
05 OUT-FRX-RATE PIC 9(3)V9(4).
05 OUT-PRICE-IN-USD PIC 9(7)V9(2).

WORKING-STORAGE SECTION.
01 WS-EOF-IN PIC X(1) VALUE 'N'.
01 WS-EOF-FRX PIC X(1) VALUE 'N'.
01 WS-FRX-RATE PIC 9(3)V9(4).

01 FILLER.
05 FRX-TBL OCCURS 10 TIMES INDEXED BY WS-INDEX1.
10 TBL-CURR-CODE PIC X(03).
10 TBL-FRX-RATE PIC 9(3)V9(4).

PROCEDURE DIVISION.
000000-MAINLINE.

PERFORM 100000-INITIALIZATION THRU 100000-EXIT.


PERFORM 200000-PROCESS THRU 200000-EXIT
UNTIL WS-EOF-IN = 'Y'.
PERFORM 300000-TERMINATION THRU 300000-EXIT.
STOP RUN.

100000-INITIALIZATION.
OPEN INPUT PRODUCT-FILE
FOREX-FILE
OUTPUT ERROR-FILE
OUT-FILE.

SET WS-INDEX1 TO 1.
PERFORM 110000-LOAD-TABLE THRU 110000-EXIT
UNTIL WS-EOF-FRX = 'Y' OR
WS-INDEX1 > 10.

100000-EXIT.
EXIT.

110000-LOAD-TABLE.
READ FOREX-FILE AT END MOVE 'Y' TO WS-EOF-FRX
GO TO 110000-EXIT.

MOVE FRX-CURR-CODE TO TBL-CURR-CODE(WS-INDEX1)


MOVE FRX-RATE TO TBL-FRX-RATE(WS-INDEX1)
SET WS-INDEX1 UP BY 1.

110000-EXIT.
EXIT.

200000-PROCESS.
READ PRODUCT-FILE AT END MOVE 'Y' TO WS-EOF-IN
GO TO 200000-EXIT.
SET WS-INDEX1 TO 1
SEARCH FRX-TBL
AT END
DISPLAY 'RATE NOT FOUND FOR CURRENCY :' CURR-CODE

103
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

MOVE PRODUCT-REC TO ERROR-REC


WRITE ERROR-REC
GO TO 200000-EXIT

WHEN CURR-CODE IN PRODUCT-REC = TBL-CURR-CODE(WS-INDEX1)


MOVE TBL-FRX-RATE(WS-INDEX1) TO WS-FRX-RATE
END-SEARCH

INITIALIZE OUT-REC
MOVE PRODUCT-CODE TO OUT-PRODUCT-CODE
MOVE CURR-CODE TO OUT-CURR-CODE
MOVE PRODUCT-PRICE TO OUT-PRODUCT-PRICE
MOVE WS-FRX-RATE TO OUT-FRX-RATE
COMPUTE OUT-PRICE-IN-USD ROUNDED =
PRODUCT-PRICE * WS-FRX-RATE
WRITE OUT-REC.

200000-EXIT.
EXIT.

300000-TERMINATION.

CLOSE PRODUCT-FILE
FOREX-FILE
ERROR-FILE
OUT-FILE.

300000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.CURCONV3.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//DD2 DD DSN=IBMUSER.SMF.CURCONV3.ERROR,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=CURCONV3
//SYSOUT DD SYSOUT=*
//*
//PRODFILE DD DSN=IBMUSER.SMF.PRODUCT,DISP=SHR
//FRXFILE DD DSN=IBMUSER.SMF.FOREX,DISP=SHR
//ERRFILE DD DSN=IBMUSER.SMF.CURCONV3.ERROR,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=14,BLKSIZE=0)
//OUTFILE DD DSN=IBMUSER.SMF.CURCONV3.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=30,BLKSIZE=0)
//*

104
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Currency Conversion Method4


File Matching Logic
Purpose : To tell about
How to use file matching logic to get matched records and unmatched records.
Requirement : Read a Product file and get the currency conversion rate from forex file, then
write output file with product price in USD if the currency is found otherwise write input record
into error file.
Approach :
1. Sort both Product and forex files on currency code in external sort steps.
2. Read sorted input files simultaneously and write output file and error file.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. CURCONV4.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PRODUCT-FILE ASSIGN TO PRODFILE.
SELECT FOREX-FILE ASSIGN TO FRXFILE.
SELECT ERROR-FILE ASSIGN TO ERRFILE.
SELECT OUT-FILE ASSIGN TO OUTFILE.

DATA DIVISION.
FILE SECTION.
FD PRODUCT-FILE.
01 PRODUCT-REC.
05 PRODUCT-CODE PIC X(04).
05 CURR-CODE PIC X(03).
05 PRODUCT-PRICE PIC 9(5)V99.

FD FOREX-FILE.
01 FOREX-RATE-REC.
05 FRX-CURR-CODE PIC X(03).
05 FILLER PIC X(02).
05 FRX-RATE PIC 9(03)V9(4).
05 FILLER PIC X(02).
05 CURR-DESC PIC X(20).
05 FILLER PIC X(02).
05 CURR-COUNTRY PIC X(20).

FD ERROR-FILE.
01 ERROR-REC PIC X(14).

FD OUT-FILE.
01 OUT-REC.
05 OUT-PRODUCT-CODE PIC X(04).
05 OUT-CURR-CODE PIC X(03).
05 OUT-PRODUCT-PRICE PIC 9(5)V99.
05 OUT-FRX-RATE PIC 9(3)V9(4).
05 OUT-PRICE-IN-USD PIC 9(7)V9(2).

WORKING-STORAGE SECTION.
01 WS-EOF-IN PIC X(1) VALUE 'N'.

105
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

01 WS-EOF-FRX PIC X(1) VALUE 'N'.

PROCEDURE DIVISION.
000000-MAINLINE.
PERFORM 100000-INITIALIZATION THRU 100000-EXIT.
PERFORM 200000-PROCESS THRU 200000-EXIT
UNTIL WS-EOF-IN = 'Y' OR WS-EOF-FRX = 'Y'.
PERFORM 300000-TERMINATION THRU 300000-EXIT.
STOP RUN.

100000-INITIALIZATION.
OPEN INPUT PRODUCT-FILE
FOREX-FILE
OUTPUT ERROR-FILE
OUT-FILE.

READ PRODUCT-FILE AT END MOVE 'Y' TO WS-EOF-IN.


READ FOREX-FILE AT END MOVE 'Y' TO WS-EOF-FRX.

100000-EXIT.
EXIT.

200000-PROCESS.
EVALUATE TRUE
WHEN CURR-CODE = FRX-CURR-CODE
CONTINUE
WHEN CURR-CODE < FRX-CURR-CODE
DISPLAY 'RATE NOT FOUND FOR CURRENCY :' CURR-CODE
MOVE PRODUCT-REC TO ERROR-REC
WRITE ERROR-REC
READ PRODUCT-FILE AT END MOVE 'Y' TO WS-EOF-IN
END-READ
GO TO 200000-EXIT
WHEN CURR-CODE > FRX-CURR-CODE
READ FOREX-FILE AT END MOVE 'Y' TO WS-EOF-FRX
END-READ
GO TO 200000-EXIT
END-EVALUATE
MOVE PRODUCT-CODE TO OUT-PRODUCT-CODE
MOVE CURR-CODE TO OUT-CURR-CODE
MOVE PRODUCT-PRICE TO OUT-PRODUCT-PRICE
MOVE FRX-RATE TO OUT-FRX-RATE
COMPUTE OUT-PRICE-IN-USD ROUNDED = PRODUCT-PRICE * FRX-RATE
WRITE OUT-REC
READ PRODUCT-FILE AT END MOVE 'Y' TO WS-EOF-IN.

200000-EXIT.
EXIT.

300000-TERMINATION.
PERFORM UNTIL WS-EOF-IN = 'Y'
DISPLAY 'RATE NOT FOUND FOR CURRENCY :' CURR-CODE
MOVE PRODUCT-REC TO ERROR-REC
WRITE ERROR-REC
READ PRODUCT-FILE AT END MOVE 'Y' TO WS-EOF-IN
END-READ
END-PERFORM.

CLOSE PRODUCT-FILE
FOREX-FILE
ERROR-FILE

106
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

OUT-FILE.

300000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.CURCONV4.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//DD2 DD DSN=IBMUSER.SMF.CURCONV4.ERROR,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//*
//SORTWK01 DD UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//SORTIN DD DSN=IBMUSER.SMF.PRODUCT,DISP=SHR
//SORTOUT DD DSN=&&TEMP1,
// DISP=(NEW,PASS),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=14,BLKSIZE=0)
//SYSIN DD *
SORT FIELDS=(5,3,CH,A)
/*
//*
//JS30 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//*
//SORTWK01 DD UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//SORTIN DD DSN=IBMUSER.SMF.FOREX,DISP=SHR
//SORTOUT DD DSN=&&TEMP2,
// DISP=(NEW,PASS),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=56,BLKSIZE=0)
//SYSIN DD *
SORT FIELDS=(1,3,CH,A)
/*
//*
//JS40 EXEC PGM=CURCONV4
//SYSOUT DD SYSOUT=*
//*
//PRODFILE DD DSN=&&TEMP1,DISP=(OLD,DELETE)
//FRXFILE DD DSN=&&TEMP2,DISP=(OLD,DELETE)
//ERRFILE DD DSN=IBMUSER.SMF.CURCONV4.ERROR,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=14,BLKSIZE=0)
//OUTFILE DD DSN=IBMUSER.SMF.CURCONV4.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=30,BLKSIZE=0)

107
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

//*

Sort in ascending with Simple sort


Purpose : To know
1. How to sort a file by using internal sort with USING and GIVING options.
2. How to declare a sort file.

Requirement : Sort input file on agent id in ascending order and then write into output file.
It is same as SORT FIELDS=(1,4,CH,A)

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. ISORT1.
AUTHOR. MADHU PADALA.

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

SELECT IN-FILE ASSIGN TO INFILE.


SELECT SORT-FILE ASSIGN TO SORTWK01.
SELECT OUT-FILE ASSIGN TO OUTFILE.

DATA DIVISION.
FILE SECTION.

FD IN-FILE.
01 IN-REC.
05 IN-AGENT-NUM PIC X(04).
05 IN-STATE-CODE PIC X(02).
05 IN-SALES-DATE PIC 9(08).
05 IN-SALES-AMOUNT PIC 9(07)V99.

FD OUT-FILE.
01 OUT-REC.
05 OUT-AGENT-NUM PIC X(04).
05 OUT-STATE-CODE PIC X(02).
05 OUT-SALES-DATE PIC 9(08).
05 OUT-SALES-AMOUNT PIC 9(07)V99.

SD SORT-FILE.
01 SORT-REC.
05 SRT-AGENT-NUM PIC X(04).
05 SRT-STATE-CODE PIC X(02).
05 SRT-SALES-DATE PIC 9(08).
05 SRT-SALES-AMOUNT PIC 9(07)V99.

PROCEDURE DIVISION.

SORT SORT-FILE ON ASCENDING KEY SRT-AGENT-NUM


USING IN-FILE
GIVING OUT-FILE.

STOP RUN.

108
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.ISORT1.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(TRK,(1,1),RLSE)
//*
//JS20 EXEC PGM=ISORT1
//SYSOUT DD SYSOUT=*
//*
//INFILE DD DSN=IBMUSER.SMF.ISORT.IN,DISP=SHR
//SORTWK01 DD UNIT=SYSDA,SPACE=(TRK,(5,2),RLSE)
//OUTFILE DD DSN=IBMUSER.SMF.ISORT1.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=23,BLKSIZE=0)

Input :

IBMUSER.SMF.ISORT.IN
A003TN20101025002000000
A003AP20101025002000000
A001AP20101025002000000
A001TN20101024000500000
A002TN20101025001000000
A001KA20101025001000000
A001KE20101024002000000
A002AP20101023001000000

Output :

IBMUSER.SMF.ISORT1.OUT
A001KA20101025001000000
A001KE20101024002000000
A001AP20101025002000000
A001TN20101024000500000
A002TN20101025001000000
A002AP20101023001000000
A003TN20101025002000000
A003AP20101025002000000

109
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Sort in ascending with Input and Output Procedure

Purpose : To know
1. How to sort a file by using internal sort with INPUT PROCEDURE and
OUTPUT PROCEDURE clauses.
2. How to declare a sort file.
3. How to release unsorted record into sort file and how to return sorted record
from sort file.

Requirement : Sort input file on agent id in ascending order and then write into output file.
It is same as SORT FIELDS=(1,4,CH,A)

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. ISORT2.
AUTHOR. MADHU PADALA.

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

SELECT IN-FILE ASSIGN TO INFILE.


SELECT SORT-FILE ASSIGN TO SORTWK01.
SELECT OUT-FILE ASSIGN TO OUTFILE.

DATA DIVISION.
FILE SECTION.

FD IN-FILE.
01 IN-REC.
05 IN-AGENT-NUM PIC X(04).
05 IN-STATE-CODE PIC X(02).
05 IN-SALES-DATE PIC 9(8).
05 IN-SALES-AMOUNT PIC 9(07)V99.

FD OUT-FILE.
01 OUT-REC.
05 OUT-AGENT-NUM PIC X(04).
05 OUT-STATE-CODE PIC X(02).
05 OUT-SALES-DATE PIC 9(8).
05 OUT-SALES-AMOUNT PIC 9(07)V99.

SD SORT-FILE.
01 SORT-REC.
05 SRT-AGENT-NUM PIC X(04).
05 SRT-STATE-CODE PIC X(02).
05 SRT-SALES-DATE PIC 9(8).
05 SRT-SALES-AMOUNT PIC 9(07)V99.

WORKING-STORAGE SECTION.
01 WS-EOF-IN PIC X(01) VALUE 'N'.
01 WS-EOF-SORT PIC X(01) VALUE 'N'.

PROCEDURE DIVISION.

110
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

OPEN INPUT IN-FILE


OUTPUT OUT-FILE.

SORT SORT-FILE ON ASCENDING KEY SRT-AGENT-NUM


INPUT PROCEDURE IS INPUT-PROC
OUTPUT PROCEDURE IS OUTPUT-PROC.
CLOSE IN-FILE
OUT-FILE.
STOP RUN.

INPUT-PROC.
PERFORM UNTIL WS-EOF-IN = 'Y'
READ IN-FILE AT END MOVE 'Y' TO WS-EOF-IN
END-READ
IF WS-EOF-IN = 'N'
MOVE IN-REC TO SORT-REC
RELEASE SORT-REC
END-IF
END-PERFORM.

OUTPUT-PROC.
PERFORM UNTIL WS-EOF-SORT = 'Y'
RETURN SORT-FILE AT END MOVE 'Y' TO WS-EOF-SORT
END-RETURN
IF WS-EOF-SORT = 'N'
MOVE SORT-REC TO OUT-REC
WRITE OUT-REC
END-IF
END-PERFORM.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.ISORT2.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(TRK,(1,1),RLSE)
//*
//JS20 EXEC PGM=ISORT2
//SYSOUT DD SYSOUT=*
//*
//INFILE DD DSN=IBMUSER.SMF.ISORT.IN,DISP=SHR
//SORTWK01 DD UNIT=SYSDA,SPACE=(TRK,(5,2),RLSE)
//OUTFILE DD DSN=IBMUSER.SMF.ISORT2.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=23,BLKSIZE=0)

Output :

IBMUSER.SMF.ISORT2.OUT
A001KA20101025001000000
A001KE20101024002000000
A001AP20101025002000000
A001TN20101024000500000
A002TN20101025001000000
A002AP20101023001000000

111
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

A003TN20101025002000000
A003AP20101025002000000

Read file in Reverse order


Purpose : To know about
1. How to sort a file to reverse its position.

Requirement : Write input records in a reverse order into output.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. ISORT3.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO INFILE.
SELECT SORT-FILE ASSIGN TO SORTWK01.
SELECT OUT-FILE ASSIGN TO OUTFILE.

DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-REC.
05 IN-AGENT-NUM PIC X(04).
05 IN-STATE-CODE PIC X(02).
05 IN-SALES-DATE PIC 9(8).
05 IN-SALES-AMOUNT PIC 9(07)V99.

FD OUT-FILE.
01 OUT-REC.
05 OUT-AGENT-NUM PIC X(04).
05 OUT-STATE-CODE PIC X(02).
05 OUT-SALES-DATE PIC 9(8).
05 OUT-SALES-AMOUNT PIC 9(07)V99.

SD SORT-FILE.
01 SORT-REC.
05 SRT-AGENT-NUM PIC X(04).
05 SRT-STATE-CODE PIC X(02).
05 SRT-SALES-DATE PIC 9(8).
05 SRT-SALES-AMOUNT PIC 9(07)V99.
05 SRT-REC-NUM PIC 9(05).

WORKING-STORAGE SECTION.
01 WS-EOF-IN PIC X(01) VALUE 'N'.
01 WS-EOF-SORT PIC X(01) VALUE 'N'.
01 WS-REC-NUM PIC 9(05) VALUE ZEROS.

PROCEDURE DIVISION.
OPEN INPUT IN-FILE
OUTPUT OUT-FILE.

SORT SORT-FILE ON DESCENDING KEY SRT-REC-NUM


INPUT PROCEDURE IS INPUT-PROC
OUTPUT PROCEDURE IS OUTPUT-PROC.
CLOSE IN-FILE

112
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

OUT-FILE.
STOP RUN.

INPUT-PROC.
PERFORM UNTIL WS-EOF-IN = 'Y'
READ IN-FILE AT END MOVE 'Y' TO WS-EOF-IN
END-READ
IF WS-EOF-IN = 'N'
MOVE IN-AGENT-NUM TO SRT-AGENT-NUM
MOVE IN-STATE-CODE TO SRT-STATE-CODE
MOVE IN-SALES-DATE TO SRT-SALES-DATE
MOVE IN-SALES-AMOUNT TO SRT-SALES-AMOUNT
ADD 1 TO WS-REC-NUM
MOVE WS-REC-NUM TO SRT-REC-NUM
RELEASE SORT-REC
END-IF
END-PERFORM.

OUTPUT-PROC.
PERFORM UNTIL WS-EOF-SORT = 'Y'
RETURN SORT-FILE AT END MOVE 'Y' TO WS-EOF-SORT
END-RETURN
IF WS-EOF-SORT = 'N'
MOVE SRT-AGENT-NUM TO OUT-AGENT-NUM
MOVE SRT-STATE-CODE TO OUT-STATE-CODE
MOVE SRT-SALES-DATE TO OUT-SALES-DATE
MOVE SRT-SALES-AMOUNT TO OUT-SALES-AMOUNT
WRITE OUT-REC
END-IF
END-PERFORM.
RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.ISORT3.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(TRK,(1,1),RLSE)
//*
//JS20 EXEC PGM=ISORT3
//SYSOUT DD SYSOUT=*
//*
//INFILE DD DSN=IBMUSER.SMF.ISORT.IN,DISP=SHR
//SORTWK01 DD UNIT=SYSDA,SPACE=(TRK,(5,2),RLSE)
//OUTFILE DD DSN=IBMUSER.SMF.ISORT3.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=23,BLKSIZE=0)

Output :

IBMUSER.SMF.ISORT3.OUT
A002AP20101023001000000
A001KE20101024002000000
A001KA20101025001000000
A002TN20101025001000000
A001TN20101024000500000
A001AP20101025002000000

113
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

A003AP20101025002000000
A003TN20101025002000000

Sort and Split records

Purpose : To know about


1. How to sort and split records into multiple files.

Requirement : Sort on agent id and write AP records into outfile1 and other records into
outfile2.
It is same as SORT FIELDS=(1,4,CH,A)
OUTFIL FILES=1,INCLUDE=(5,2,CH,EQ,C'AP')
OUTFIL FILES=2,OMIT=(5,2,CH,EQ,C'AP')

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. ISORT4.
AUTHOR. MADHU PADALA.

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

SELECT IN-FILE ASSIGN TO INFILE.


SELECT SORT-FILE ASSIGN TO SORTWK01.
SELECT OUT-FILE1 ASSIGN TO OUTFILE1.
SELECT OUT-FILE2 ASSIGN TO OUTFILE2.

DATA DIVISION.
FILE SECTION.

FD IN-FILE.
01 IN-REC.
05 IN-AGENT-NUM PIC X(04).
05 IN-STATE-CODE PIC X(02).
05 IN-SALES-DATE PIC 9(8).
05 IN-SALES-AMOUNT PIC 9(07)V99.

FD OUT-FILE1.
01 OUT-REC1.
05 OUT-AGENT-NUM PIC X(04).
05 OUT-STATE-CODE PIC X(02).
05 OUT-SALES-DATE PIC 9(8).
05 OUT-SALES-AMOUNT PIC 9(07)V99.

FD OUT-FILE2.
01 OUT-REC2.
05 OUT-AGENT-NUM PIC X(04).
05 OUT-STATE-CODE PIC X(02).
05 OUT-SALES-DATE PIC 9(8).
05 OUT-SALES-AMOUNT PIC 9(07)V99.

SD SORT-FILE.
01 SORT-REC.
05 SRT-AGENT-NUM PIC X(04).
05 SRT-STATE-CODE PIC X(02).
05 SRT-SALES-DATE PIC 9(8).
05 SRT-SALES-AMOUNT PIC 9(07)V99.

114
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

WORKING-STORAGE SECTION.
01 WS-EOF-IN PIC X(01) VALUE 'N'.
01 WS-EOF-SORT PIC X(01) VALUE 'N'.

PROCEDURE DIVISION.

OPEN INPUT IN-FILE


OUTPUT OUT-FILE1
OUT-FILE2.

SORT SORT-FILE ON ASCENDING KEY SRT-AGENT-NUM


INPUT PROCEDURE IS INPUT-PROC
OUTPUT PROCEDURE IS OUTPUT-PROC.

CLOSE IN-FILE
OUT-FILE1
OUT-FILE2.

STOP RUN.

INPUT-PROC.
PERFORM UNTIL WS-EOF-IN = 'Y'
READ IN-FILE AT END MOVE 'Y' TO WS-EOF-IN
END-READ
IF WS-EOF-IN = 'N'
MOVE IN-REC TO SORT-REC
RELEASE SORT-REC
END-IF
END-PERFORM.

OUTPUT-PROC.
PERFORM UNTIL WS-EOF-SORT = 'Y'
RETURN SORT-FILE AT END MOVE 'Y' TO WS-EOF-SORT
END-RETURN
IF WS-EOF-SORT = 'N'
IF SRT-STATE-CODE = 'AP'
MOVE SORT-REC TO OUT-REC1
WRITE OUT-REC1
ELSE
MOVE SORT-REC TO OUT-REC2
WRITE OUT-REC2
END-IF
END-IF
END-PERFORM.

115
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.ISORT4.OUT1,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(TRK,(1,1),RLSE)
//DD2 DD DSN=IBMUSER.SMF.ISORT4.OUT2,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(TRK,(1,1),RLSE)
//*
//JS20 EXEC PGM=ISORT4
//SYSOUT DD SYSOUT=*
//*
//INFILE DD DSN=IBMUSER.SMF.ISORT.IN,DISP=SHR
//SORTWK01 DD UNIT=SYSDA,SPACE=(TRK,(5,2),RLSE)
//OUTFILE1 DD DSN=IBMUSER.SMF.ISORT4.OUT1,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=23,BLKSIZE=0)
//OUTFILE2 DD DSN=IBMUSER.SMF.ISORT4.OUT2,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=23,BLKSIZE=0)

Output 1:

IBMUSER.SMF.ISORT4.OUT1
A001AP20101025002000000
A002AP20101023001000000
A003AP20101025002000000

Output 2:

IBMUSER.SMF.ISORT4.OUT2
A001KA20101025001000000
A001KE20101024002000000
A001TN20101024000500000
A002TN20101025001000000
A003TN20101025002000000

116
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Report with Page Breaks


Purpose : To know how to write a plain report with page breaks.
To know about the below points.
1. declaring layouts such as Report headers, detail header and detail line
2. Accumulating line count and page count to handle page breaks
3. Using numeric editing characters for numeric fields such as numbers, amounts
4. Using a filler with value clause
5. Controlling Page breaks with Advancing page
6. Using Cycle date and Run date
7. How to write report in JCL. SYSOUT=(*,$001)

Requirement : Write an agent sales report with report headers and report formats. See the
layouts of input file in the program and report format from the report and generate a plain report
with page breaks.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORTX.
AUTHOR. MADHU PADALA.

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

SELECT SALES-IN ASSIGN TO SALESIN.


SELECT SALES-REPORT ASSIGN TO SALESRPT.
SELECT DATE-CARD ASSIGN TO DATECARD.

DATA DIVISION.
FILE SECTION.

FD SALES-IN.
01 IN-REC.
05 IN-AGENT-ID PIC X(04).
05 IN-PRODUCT-CODE PIC X(02).
05 IN-PRODUCT-PRICE PIC 9(7)V99.
05 IN-QUANTITY PIC 9(05).
05 IN-SALES-DATE PIC X(08).

FD SALES-REPORT.
01 REPORT-REC PIC X(132).

FD DATE-CARD.
01 DATE-REC.
05 CYCLE-DATE.
10 CYC-DATE-CCYY PIC X(4).
10 CYC-DATE-MM PIC X(2).
10 CYC-DATE-DD PIC X(2).
05 FILLER PIC X(72).

WORKING-STORAGE SECTION.
01 WS-EOF PIC X(1) VALUE 'N'.
01 WS-FIRST-TIME PIC X(1) VALUE 'Y'.
01 WS-LINE-COUNT PIC S9(4) COMP VALUE ZEROS.

117
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

01 WS-PAGE-COUNT PIC S9(6) COMP VALUE ZEROS.

01 WS-REPORT-REC PIC X(133) VALUE SPACES.


01 WS-PREV-AGENT-ID PIC X(04) VALUE SPACES.

01 WS-DATE.
05 WS-DATE-YY PIC X(2).
05 WS-DATE-MM PIC X(2).
05 WS-DATE-DD PIC X(2).

01 WS-SALES-AMT PIC 9(9)V99.


01 WS-AGENT-TOTAL PIC S9(9)V99 VALUE ZEROS.

01 HEADER-LINE1.
05 FILLER PIC X(01) VALUE SPACES.
05 HDR1-DATE.
10 HDR1-DATE-MM PIC X(02).
10 FILLER PIC X(01) VALUE '/'.
10 HDR1-DATE-DD PIC X(02).
10 FILLER PIC X(01) VALUE '/'.
10 HDR1-DATE-YY PIC X(02).
05 FILLER PIC X(01) VALUE SPACES.
05 FILLER PIC X(20) VALUE SPACES.
05 FILLER PIC X(19) VALUE
'ABC COMPANY REPORTS'.
05 FILLER PIC X(10) VALUE SPACES.
05 FILLER PIC X(05) VALUE 'PAGE '.
05 HDR1-PAGE-COUNT PIC ZZZZ9.

01 HEADER-LINE2.
05 FILLER PIC X(01) VALUE SPACES.
05 FILLER PIC X(27) VALUE SPACES.
05 FILLER PIC X(11) VALUE
'CYCLE DATE:'.
05 HDR2-DATE.
10 HDR2-DATE-CCYY PIC X(04).
10 FILLER PIC X(01) VALUE '/'.
10 HDR2-DATE-MM PIC X(02).
10 FILLER PIC X(01) VALUE '/'.
10 HDR2-DATE-DD PIC X(02).

01 DETAIL-HEADER.
05 FILLER PIC X(01) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'AGENT ID '.
05 FILLER PIC X(03) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'PROD CODE '.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'PROD PRICE'.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'QUANTITY '.
05 FILLER PIC X(04) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'SALES DATE'.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'TOTAL AMNT'.

118
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

01 DETAIL-LINE.
05 FILLER PIC X(03) VALUE SPACES.
05 DTL-AGENT-ID PIC X(04).
05 FILLER PIC X(11) VALUE SPACES.
05 DTL-PROD-CODE PIC X(02).
05 FILLER PIC X(10) VALUE SPACES.
05 DTL-PRODUCT-PRICE PIC ZZZ9.99.
05 FILLER PIC X(08) VALUE SPACES.
05 DTL-QUANTITY PIC 9(4).
05 FILLER PIC X(10) VALUE SPACES.
05 DTL-SALES-DATE PIC X(08).
05 FILLER PIC X(06) VALUE SPACES.
05 DTL-TOTAL-AMT PIC ZZZZZ9.99.

PROCEDURE DIVISION.
000000-MAINLINE.

PERFORM 100000-INITIALIZATION THRU 100000-EXIT.


PERFORM 200000-PROCESS THRU 200000-EXIT
UNTIL WS-EOF = 'Y'.
PERFORM 300000-TERMINATION THRU 300000-EXIT.
STOP RUN.

100000-INITIALIZATION.

OPEN INPUT SALES-IN


DATE-CARD
OUTPUT SALES-REPORT.

READ DATE-CARD.
MOVE CYC-DATE-CCYY TO HDR2-DATE-CCYY.
MOVE CYC-DATE-MM TO HDR2-DATE-MM.
MOVE CYC-DATE-DD TO HDR2-DATE-DD.

ACCEPT WS-DATE FROM DATE.


MOVE WS-DATE-MM TO HDR1-DATE-MM.
MOVE WS-DATE-DD TO HDR1-DATE-DD.
MOVE WS-DATE-YY TO HDR1-DATE-YY.

100000-EXIT.
EXIT.

200000-PROCESS.
READ SALES-IN AT END MOVE 'Y' TO WS-EOF
GO TO 200000-EXIT.

MOVE IN-AGENT-ID TO DTL-AGENT-ID


MOVE IN-SALES-DATE TO DTL-SALES-DATE
MOVE IN-PRODUCT-CODE TO DTL-PROD-CODE
MOVE IN-PRODUCT-PRICE TO DTL-PRODUCT-PRICE
MOVE IN-QUANTITY TO DTL-QUANTITY

COMPUTE WS-SALES-AMT = IN-PRODUCT-PRICE * IN-QUANTITY


MOVE WS-SALES-AMT TO DTL-TOTAL-AMT
MOVE DETAIL-LINE TO WS-REPORT-REC
PERFORM 210000-WRITE-REPORT THRU 210000-EXIT.

200000-EXIT.
EXIT.

119
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

210000-WRITE-REPORT.
IF WS-LINE-COUNT = 0 OR > 54

ADD 1 TO WS-PAGE-COUNT
MOVE WS-PAGE-COUNT TO HDR1-PAGE-COUNT
MOVE HEADER-LINE1 TO REPORT-REC
WRITE REPORT-REC AFTER ADVANCING PAGE
MOVE HEADER-LINE2 TO REPORT-REC
WRITE REPORT-REC AFTER ADVANCING 1 LINE
MOVE SPACES TO REPORT-REC
WRITE REPORT-REC AFTER ADVANCING 1 LINE
MOVE DETAIL-HEADER TO REPORT-REC
WRITE REPORT-REC AFTER ADVANCING 1 LINE
MOVE 4 TO WS-LINE-COUNT
END-IF

MOVE WS-REPORT-REC TO REPORT-REC


WRITE REPORT-REC AFTER ADVANCING 1 LINE
ADD 1 TO WS-LINE-COUNT.

210000-EXIT.
EXIT.

300000-TERMINATION.
CLOSE SALES-IN
SALES-REPORT
DATE-CARD.

300000-EXIT.
EXIT.

RunJCL :
//TSMFDASR JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//*
//SORTIN DD DSN=IBMUSER.SMF.SALESIN,DISP=SHR
//SORTWK01 DD UNIT=SYSDA,SPACE=(TRK,(1,1),RLSE)
//SORTOUT DD DSN=&&TEMP1,
// DISP=(NEW,PASS),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=28,BLKSIZE=0)
//SYSIN DD *
SORT FIELDS=(1,4,CH,A)
/*
//JS20 EXEC PGM=REPORTX
//SYSOUT DD SYSOUT=*
//*
//SALESIN DD DSN=&&TEMP1,DISP=(OLD,DELETE)
//DATECARD DD DSN=IBMUSER.SMF.CNTLLIB(CYCDATE),DISP=SHR
//SALESRPT DD SYSOUT=(*,$001),
// DCB=(RECFM=FBA,LRECL=133,BLKSIZE=0)
//*

120
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Input file :
IBMUSER.SMF.SALESIN
A001P10000100000100020121027
A001P10000100000100020121028
A001P10000100000100020121028
A001P20000200000100020121028
A001P20000200000100020121028
A001P20000200000100020121027
A001P30000300000100020121028
A001P30000300000100020121028
A001P30000300000100020121028
A001P50000500000100020121027
A001P50000700000100020121028
A001P70000400000100020121027
A002P10000100000100020121028
A002P10000100000100020121027
A002P10000100000100020121028
A002P10000100000100020121027
A002P10000100000100020121027
A002P20000200000100020121028
A002P20000200000100020121028
A002P20000200000100020121028
A002P30000300000100020121028
A002P50000700000100020121028
A002P50000700000100020121027
A002P60000300000100020121027
A002P70000400000100020121028
A003P10000100000100020121027
A003P10000100000100020121028
A003P10000100000100020121028
A003P10000100000100020121028
A003P20000200000100020121027
A003P30000300000100020121028
A003P40000400000100020121028
A003P50000700000100020121028
A003P70000400000100020121028
A003P70000400000100020121028
A004P10000100000100020121028
A004P10000100000100020121028
A004P10000100000100020121028
A004P10000100000100020121027
A004P10000100000100020121027
A004P20000200000100020121028
A004P20000200000100020121028
A004P20000200000100020121027
A004P20000200000100020121028
A004P40000400000100020121027
A004P40000400000100020121027
A004P40000400000100020121028
A004P50000500000100020121028
A004P60000300000100020121028
A005P10000100000100020121027
A005P10000100000100020121028
A005P20000200000100020121027
A005P20000200000100020121028
A005P20000200000100020121027
A005P20000200000100020121028
A005P30000300000100020121027
A005P30000300000100020121027

121
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

A005P40000400000100020121027
A005P50000500000100020121028

A005P60000300000100020121027
A006P10000100000100020121027
A006P30000300000100020121028
A006P50000500000100020121028

Output report written in the spool :

1 10/29/12 ABC COMPANY REPORTS PAGE 1


CYCLE DATE:2012/10/27

AGENT ID PROD CODE PROD PRICE QUANTITY SALES DATE TOTAL AMNT
A001 P1 100.00 1000 20121027 100000.00
A001 P1 100.00 1000 20121028 100000.00
A001 P1 100.00 1000 20121028 100000.00
A001 P2 200.00 1000 20121028 200000.00
A001 P2 200.00 1000 20121028 200000.00
A001 P2 200.00 1000 20121027 200000.00
A001 P3 300.00 1000 20121028 300000.00
A001 P3 300.00 1000 20121028 300000.00
A001 P3 300.00 1000 20121028 300000.00
A001 P5 500.00 1000 20121027 500000.00
A001 P5 700.00 1000 20121028 700000.00
A001 P7 400.00 1000 20121027 400000.00
A002 P1 100.00 1000 20121028 100000.00
A002 P1 100.00 1000 20121027 100000.00
A002 P1 100.00 1000 20121028 100000.00
A002 P1 100.00 1000 20121027 100000.00
A002 P1 100.00 1000 20121027 100000.00
A002 P2 200.00 1000 20121028 200000.00
A002 P2 200.00 1000 20121028 200000.00
A002 P2 200.00 1000 20121028 200000.00
A002 P3 300.00 1000 20121028 300000.00
A002 P5 700.00 1000 20121028 700000.00
A002 P5 700.00 1000 20121027 700000.00
A002 P6 300.00 1000 20121027 300000.00
A002 P7 400.00 1000 20121028 400000.00
A003 P1 100.00 1000 20121027 100000.00
A003 P1 100.00 1000 20121028 100000.00
A003 P1 100.00 1000 20121028 100000.00
A003 P1 100.00 1000 20121028 100000.00
A003 P2 200.00 1000 20121027 200000.00
A003 P3 300.00 1000 20121028 300000.00
A003 P4 400.00 1000 20121028 400000.00
A003 P5 700.00 1000 20121028 700000.00
A003 P7 400.00 1000 20121028 400000.00
A003 P7 400.00 1000 20121028 400000.00
A004 P1 100.00 1000 20121028 100000.00
A004 P2 200.00 1000 20121027 200000.00
A004 P2 200.00 1000 20121028 200000.00
A004 P4 400.00 1000 20121027 400000.00
A004 P4 400.00 1000 20121027 400000.00
A004 P4 400.00 1000 20121028 400000.00
A004 P5 500.00 1000 20121028 500000.00
A004 P6 300.00 1000 20121028 300000.00
A004 P1 100.00 1000 20121028 100000.00
A004 P1 100.00 1000 20121028 100000.00
A004 P1 100.00 1000 20121027 100000.00
A004 P1 100.00 1000 20121027 100000.00

122
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

A004 P2 200.00 1000 20121028 200000.00


A004 P2 200.00 1000 20121028 200000.00

A005 P1 100.00 1000 20121027 100000.00

A005 P1 100.00 1000 20121028 100000.00

1 10/29/12 ABC COMPANY REPORTS PAGE 2


CYCLE DATE:2012/10/27

AGENT ID PROD CODE PROD PRICE QUANTITY SALES DATE TOTAL AMNT
A005 P2 200.00 1000 20121027 200000.00
A005 P2 200.00 1000 20121028 200000.00
A005 P2 200.00 1000 20121027 200000.00
A005 P2 200.00 1000 20121028 200000.00
A005 P3 300.00 1000 20121027 300000.00
A005 P3 300.00 1000 20121027 300000.00
A005 P4 400.00 1000 20121027 400000.00
A005 P5 500.00 1000 20121028 500000.00
A005 P6 300.00 1000 20121027 300000.00
A006 P1 100.00 1000 20121027 100000.00
A006 P3 300.00 1000 20121028 300000.00
A006 P5 500.00 1000 20121028 500000.00

123
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Report with Control Breaks


Purpose : To know about
1. How to write subtotals and grand totals
2. How to avoid first break and how to force the last break
3. How to sort the input file to generate subtotals

Requirement : Write an agent sales report with report headers and report formats.
Write detail records, sub totals on agent id and grand totals for the report.
Write every new agent in a new page.
See the layout of input files from program and report format from the report and generate report.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORTY.
AUTHOR. MADHU PADALA.

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

SELECT SALES-IN ASSIGN TO SALESIN.


SELECT SALES-REPORT ASSIGN TO SALESRPT.
SELECT DATE-CARD ASSIGN TO DATECARD.

DATA DIVISION.
FILE SECTION.

FD SALES-IN.
01 IN-REC.
05 IN-AGENT-ID PIC X(04).
05 IN-PRODUCT-CODE PIC X(02).
05 IN-PRODUCT-PRICE PIC 9(7)V99.
05 IN-QUANTITY PIC 9(05).
05 IN-SALES-DATE PIC X(08).

FD SALES-REPORT.
01 REPORT-REC PIC X(132).

FD DATE-CARD.
01 DATE-REC.
05 CYCLE-DATE.
10 CYC-DATE-CCYY PIC X(4).
10 CYC-DATE-MM PIC X(2).
10 CYC-DATE-DD PIC X(2).
05 FILLER PIC X(72).

WORKING-STORAGE SECTION.
01 WS-EOF PIC X(1) VALUE 'N'.
01 WS-FIRST-TIME PIC X(1) VALUE 'Y'.
01 WS-LINE-COUNT PIC S9(4) COMP VALUE ZEROS.
01 WS-PAGE-COUNT PIC S9(6) COMP VALUE ZEROS.
01 WS-REPORT-REC PIC X(133) VALUE SPACES.
01 WS-PREV-AGENT-ID PIC X(04) VALUE SPACES.

124
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

01 WS-DATE.
05 WS-DATE-YY PIC X(2).
05 WS-DATE-MM PIC X(2).
05 WS-DATE-DD PIC X(2).

01 WS-SALES-AMT PIC 9(9)V99.


01 WS-AGENT-TOTAL PIC S9(9)V99 VALUE ZEROS.
01 WS-GRAND-TOTAL PIC S9(9)V99 VALUE ZEROS.

01 HEADER-LINE1.
05 FILLER PIC X(01) VALUE SPACES.
05 HDR1-DATE.
10 HDR1-DATE-MM PIC X(02).
10 FILLER PIC X(01) VALUE '/'.
10 HDR1-DATE-DD PIC X(02).
10 FILLER PIC X(01) VALUE '/'.
10 HDR1-DATE-YY PIC X(02).
05 FILLER PIC X(01) VALUE SPACES.
05 FILLER PIC X(20) VALUE SPACES.
05 FILLER PIC X(19) VALUE
'ABC COMPANY REPORTS'.
05 FILLER PIC X(10) VALUE SPACES.
05 FILLER PIC X(05) VALUE 'PAGE '.
05 HDR1-PAGE-COUNT PIC ZZZZ9.

01 HEADER-LINE2.
05 FILLER PIC X(01) VALUE SPACES.
05 FILLER PIC X(27) VALUE SPACES.
05 FILLER PIC X(11) VALUE
'CYCLE DATE:'.
05 HDR2-DATE.
10 HDR2-DATE-CCYY PIC X(04).
10 FILLER PIC X(01) VALUE '/'.
10 HDR2-DATE-MM PIC X(02).
10 FILLER PIC X(01) VALUE '/'.
10 HDR2-DATE-DD PIC X(02).

01 DETAIL-HEADER.
05 FILLER PIC X(01) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'AGENT ID '.
05 FILLER PIC X(03) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'PROD CODE '.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'PROD PRICE'.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'QUANTITY '.
05 FILLER PIC X(04) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'SALES DATE'.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(10) VALUE
'TOTAL AMNT'.

125
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

01 DETAIL-LINE.
05 FILLER PIC X(03) VALUE SPACES.
05 DTL-AGENT-ID PIC X(04).
05 FILLER PIC X(11) VALUE SPACES.
05 DTL-PROD-CODE PIC X(02).
05 FILLER PIC X(10) VALUE SPACES.
05 DTL-PRODUCT-PRICE PIC ZZZ9.99.
05 FILLER PIC X(08) VALUE SPACES.
05 DTL-QUANTITY PIC 9(4).
05 FILLER PIC X(10) VALUE SPACES.
05 DTL-SALES-DATE PIC X(08).
05 FILLER PIC X(06) VALUE SPACES.
05 DTL-TOTAL-AMT PIC ZZZZZ9.99.

01 SUB-TOTALS-LINE.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(28) VALUE
'TOTAL SALES FOR THIS AGENT: '.
05 STL-AGENT-AMT PIC ZZZZZZZZ9.99.

01 GRAND-TOTALS-LINE.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(28) VALUE
'TOTAL SALES FOR THE REPORT: '.
05 GTL-REPORT-AMT PIC ZZZZZZZZ9.99.

PROCEDURE DIVISION.

DISPLAY 'PROGRAM STARTED'

PERFORM 100000-INITIALIZATION THRU 100000-EXIT.


PERFORM 200000-PROCESS THRU 200000-EXIT
UNTIL WS-EOF = 'Y'.
PERFORM 300000-TERMINATION THRU 300000-EXIT.
DISPLAY 'PROGRAM ENDED'
STOP RUN.

100000-INITIALIZATION.
OPEN INPUT SALES-IN
DATE-CARD
OUTPUT SALES-REPORT.

READ DATE-CARD.
MOVE CYC-DATE-CCYY TO HDR2-DATE-CCYY.
MOVE CYC-DATE-MM TO HDR2-DATE-MM.
MOVE CYC-DATE-DD TO HDR2-DATE-DD.

ACCEPT WS-DATE FROM DATE.


MOVE WS-DATE-MM TO HDR1-DATE-MM.
MOVE WS-DATE-DD TO HDR1-DATE-DD.
MOVE WS-DATE-YY TO HDR1-DATE-YY.

100000-EXIT.
EXIT.

200000-PROCESS.
READ SALES-IN AT END MOVE 'Y' TO WS-EOF
GO TO 200000-EXIT.

126
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

IF WS-FIRST-TIME = 'Y'
MOVE 'N' TO WS-FIRST-TIME
MOVE IN-AGENT-ID TO WS-PREV-AGENT-ID
END-IF.

IF IN-AGENT-ID NOT = WS-PREV-AGENT-ID


PERFORM 210000-AGENT-BREAK THRU 210000-EXIT
MOVE ZEROS TO WS-AGENT-TOTAL
WS-LINE-COUNT
END-IF.

MOVE IN-AGENT-ID TO DTL-AGENT-ID


MOVE IN-SALES-DATE TO DTL-SALES-DATE
MOVE IN-PRODUCT-CODE TO DTL-PROD-CODE
MOVE IN-PRODUCT-PRICE TO DTL-PRODUCT-PRICE
MOVE IN-QUANTITY TO DTL-QUANTITY

COMPUTE WS-SALES-AMT = IN-PRODUCT-PRICE * IN-QUANTITY


MOVE WS-SALES-AMT TO DTL-TOTAL-AMT
MOVE DETAIL-LINE TO WS-REPORT-REC
PERFORM 220000-WRITE-REPORT THRU 220000-EXIT

ADD WS-SALES-AMT TO WS-AGENT-TOTAL


WS-GRAND-TOTAL
MOVE IN-AGENT-ID TO WS-PREV-AGENT-ID.

200000-EXIT.
EXIT.

210000-AGENT-BREAK.
MOVE WS-AGENT-TOTAL TO STL-AGENT-AMT.
MOVE SUB-TOTALS-LINE TO WS-REPORT-REC.
PERFORM 220000-WRITE-REPORT THRU 220000-EXIT.

MOVE SPACES TO WS-REPORT-REC.


PERFORM 220000-WRITE-REPORT THRU 220000-EXIT.

210000-EXIT.
EXIT.

220000-WRITE-REPORT.
IF WS-LINE-COUNT = 0 OR > 54

ADD 1 TO WS-PAGE-COUNT
MOVE WS-PAGE-COUNT TO HDR1-PAGE-COUNT
MOVE HEADER-LINE1 TO REPORT-REC
WRITE REPORT-REC AFTER ADVANCING PAGE
MOVE HEADER-LINE2 TO REPORT-REC
WRITE REPORT-REC AFTER ADVANCING 1 LINE
MOVE SPACES TO REPORT-REC
WRITE REPORT-REC AFTER ADVANCING 1 LINE
MOVE DETAIL-HEADER TO REPORT-REC
WRITE REPORT-REC AFTER ADVANCING 1 LINE
MOVE 4 TO WS-LINE-COUNT
END-IF
MOVE WS-REPORT-REC TO REPORT-REC
WRITE REPORT-REC AFTER ADVANCING 1 LINE
ADD 1 TO WS-LINE-COUNT.

127
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

220000-EXIT.
EXIT.

300000-TERMINATION.
IF WS-FIRST-TIME = 'Y'
CONTINUE
ELSE
PERFORM 210000-AGENT-BREAK THRU 210000-EXIT
MOVE WS-GRAND-TOTAL TO GTL-REPORT-AMT
MOVE GRAND-TOTALS-LINE TO WS-REPORT-REC
PERFORM 220000-WRITE-REPORT THRU 220000-EXIT
END-IF.

CLOSE SALES-IN
DATE-CARD
SALES-REPORT.

300000-EXIT.
EXIT.

RunJCL :
//TSMFDASR JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//*
//SORTIN DD DSN=IBMUSER.SMF.SALESIN,DISP=SHR
//SORTWK01 DD UNIT=SYSDA,SPACE=(TRK,(1,1),RLSE)
//SORTOUT DD DSN=&&TEMP1,
// DISP=(NEW,PASS),
// UNIT=SYSDA,
// SPACE=(TRK,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=28,BLKSIZE=0)
//SYSIN DD *
SORT FIELDS=(1,4,CH,A)
/*
//JS20 EXEC PGM=REPORTY
//SYSOUT DD SYSOUT=*
//*
//SALESIN DD DSN=&&TEMP1,DISP=(OLD,DELETE)
//DATECARD DD DSN=IBMUSER.SMF.CNTLLIB(CYCDATE),DISP=SHR
//SALESRPT DD SYSOUT=(*,$002),
// DCB=(RECFM=FBA,LRECL=133,BLKSIZE=0)
//*

128
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Output report written in the spool :

1 10/29/12 ABC COMPANY REPORTS PAGE 1


CYCLE DATE:2012/10/27

AGENT ID PROD CODE PROD PRICE QUANTITY SALES DATE TOTAL AMNT
A001 P1 100.00 1000 20121027 100000.00
A001 P1 100.00 1000 20121028 100000.00
A001 P1 100.00 1000 20121028 100000.00
A001 P2 200.00 1000 20121028 200000.00
A001 P2 200.00 1000 20121028 200000.00
A001 P2 200.00 1000 20121027 200000.00
A001 P3 300.00 1000 20121028 300000.00
A001 P3 300.00 1000 20121028 300000.00
A001 P3 300.00 1000 20121028 300000.00
A001 P5 500.00 1000 20121027 500000.00
A001 P5 700.00 1000 20121028 700000.00
A001 P7 400.00 1000 20121027 400000.00
TOTAL SALES FOR THIS AGENT: 3400000.00

1 10/29/12 ABC COMPANY REPORTS PAGE 2


CYCLE DATE:2012/10/27

AGENT ID PROD CODE PROD PRICE QUANTITY SALES DATE TOTAL AMNT
A002 P1 100.00 1000 20121028 100000.00
A002 P1 100.00 1000 20121027 100000.00
A002 P1 100.00 1000 20121028 100000.00
A002 P1 100.00 1000 20121027 100000.00
A002 P1 100.00 1000 20121027 100000.00
A002 P2 200.00 1000 20121028 200000.00
A002 P2 200.00 1000 20121028 200000.00
A002 P2 200.00 1000 20121028 200000.00
A002 P3 300.00 1000 20121028 300000.00
A002 P5 700.00 1000 20121028 700000.00
A002 P5 700.00 1000 20121027 700000.00
A002 P6 300.00 1000 20121027 300000.00
A002 P7 400.00 1000 20121028 400000.00
TOTAL SALES FOR THIS AGENT: 3500000.00

1 10/29/12 ABC COMPANY REPORTS PAGE 3


CYCLE DATE:2012/10/27

AGENT ID PROD CODE PROD PRICE QUANTITY SALES DATE TOTAL AMNT
A003 P1 100.00 1000 20121027 100000.00
A003 P1 100.00 1000 20121028 100000.00
A003 P1 100.00 1000 20121028 100000.00
A003 P1 100.00 1000 20121028 100000.00
A003 P2 200.00 1000 20121027 200000.00
A003 P3 300.00 1000 20121028 300000.00
A003 P4 400.00 1000 20121028 400000.00
A003 P5 700.00 1000 20121028 700000.00
A003 P7 400.00 1000 20121028 400000.00
A003 P7 400.00 1000 20121028 400000.00
TOTAL SALES FOR THIS AGENT: 2800000.00

129
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

1 10/29/12 ABC COMPANY REPORTS PAGE 4


CYCLE DATE:2012/10/27

AGENT ID PROD CODE PROD PRICE QUANTITY SALES DATE TOTAL AMNT
A004 P1 100.00 1000 20121028 100000.00
A004 P2 200.00 1000 20121027 200000.00
A004 P2 200.00 1000 20121028 200000.00
A004 P4 400.00 1000 20121027 400000.00
A004 P4 400.00 1000 20121027 400000.00
A004 P4 400.00 1000 20121028 400000.00
A004 P5 500.00 1000 20121028 500000.00
A004 P6 300.00 1000 20121028 300000.00
A004 P1 100.00 1000 20121028 100000.00
A004 P1 100.00 1000 20121028 100000.00
A004 P1 100.00 1000 20121027 100000.00
A004 P1 100.00 1000 20121027 100000.00
A004 P2 200.00 1000 20121028 200000.00
A004 P2 200.00 1000 20121028 200000.00
TOTAL SALES FOR THIS AGENT: 3300000.00

1 10/29/12 ABC COMPANY REPORTS PAGE 5


CYCLE DATE:2012/10/27

AGENT ID PROD CODE PROD PRICE QUANTITY SALES DATE TOTAL AMNT
A005 P1 100.00 1000 20121027 100000.00
A005 P1 100.00 1000 20121028 100000.00
A005 P2 200.00 1000 20121027 200000.00
A005 P2 200.00 1000 20121028 200000.00
A005 P2 200.00 1000 20121027 200000.00
A005 P2 200.00 1000 20121028 200000.00
A005 P3 300.00 1000 20121027 300000.00
A005 P3 300.00 1000 20121027 300000.00
A005 P4 400.00 1000 20121027 400000.00
A005 P5 500.00 1000 20121028 500000.00
A005 P6 300.00 1000 20121027 300000.00
TOTAL SALES FOR THIS AGENT: 2800000.00

1 10/29/12 ABC COMPANY REPORTS PAGE 6


CYCLE DATE:2012/10/27

AGENT ID PROD CODE PROD PRICE QUANTITY SALES DATE TOTAL AMNT
A006 P1 100.00 1000 20121027 100000.00
A006 P3 300.00 1000 20121028 300000.00
A006 P5 500.00 1000 20121028 500000.00
TOTAL SALES FOR THIS AGENT: 900000.00

TOTAL SALES FOR THE REPORT: 16700000.00

130
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

S0C7

Purpose : To know about


1. How to take a junk data in a comp-3 field of input file
2. How to compile program either with LIST or TEST option
3. How to trace the statement causing S0C7 with offset number
4. How to find the record causing S0c7

Requirement : Read sales record and generate output file by calculating sales amount with the
multiplication of product price and quantity. By using HEX ON, take a non numeric data on
product price(COMP-3 field) of input file. This will cause the program to S0C7 abend. Find the
abend causing statement and record after the abend.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. S0C7.
AUTHOR. MADHU PADALA.

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

SELECT SALES-FILE ASSIGN TO SALES.


SELECT OUT-FILE ASSIGN TO OUTFILE.

DATA DIVISION.
FILE SECTION.

FD SALES-FILE.
01 SALES-REC.
05 AGENT-ID PIC X(04).
05 PRODUCT-CODE PIC X(04).
05 PRODUCT-PRICE PIC S9(7)V99 COMP-3.
05 QTY PIC 9(4).

FD OUT-FILE.
01 OUT-REC.
05 OUT-AGENT-ID PIC X(04).
05 OUT-PRODUCT-CODE PIC X(04).
05 OUT-PRODUCT-PRICE PIC 9(7)V99.
05 OUT-QTY PIC 9(4).
05 OUT-SALES-AMT PIC 9(9)V99.

WORKING-STORAGE SECTION.
01 WS-EOF-IN PIC X(1) VALUE 'N'.

PROCEDURE DIVISION.

PERFORM 100000-INITIALIZATION THRU 100000-EXIT.


PERFORM 200000-PROCESS THRU 200000-EXIT
UNTIL WS-EOF-IN = 'Y'.
PERFORM 300000-TERMINATION THRU 300000-EXIT.
STOP RUN.

131
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

100000-INITIALIZATION.

OPEN INPUT SALES-FILE


OUTPUT OUT-FILE.

100000-EXIT.
EXIT.

200000-PROCESS.
READ SALES-FILE AT END MOVE 'Y' TO WS-EOF-IN
GO TO 200000-EXIT.
DISPLAY SALES-REC

MOVE AGENT-ID TO OUT-AGENT-ID


MOVE PRODUCT-CODE TO OUT-PRODUCT-CODE
MOVE QTY TO OUT-QTY
MOVE PRODUCT-PRICE TO OUT-PRODUCT-PRICE
COMPUTE OUT-SALES-AMT = PRODUCT-PRICE * QTY
WRITE OUT-REC.

200000-EXIT.
EXIT.

300000-TERMINATION.
CLOSE SALES-FILE
OUT-FILE.

300000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.S0C7.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=S0C7
//SYSOUT DD SYSOUT=*
//*
//SALES DD DSN=IBMUSER.SMF.S0C7.INFILE,DISP=SHR
//OUTFILE DD DSN=IBMUSER.SMF.S0C7.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=32,BLKSIZE=0)
//*

132
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Input File :

IBMUSER.SMF.S0C7.INFILE
A001P001 0100
A002P001 0100
A003P001 0100
A004P001 0100
A005P001 v 0100
A006P001 0100
A007P001 0100

Input File with HEX ON:


A001P001 0100
CFFFDFFF00000FFFF
100170010500C0100
-----------------
A002P001 0100
CFFFDFFF00000FFFF
100270010500C0100
-----------------
A003P001 0100
CFFFDFFF00000FFFF
100370010500C0100
-----------------
A004P001 0100
CFFFDFFF00000FFFF
100470010500C0100
-----------------
A005P001 v 0100
CFFFDFFF0A000FFFF
100570010500C0100
-----------------
A006P001 0100
CFFFDFFF00000FFFF
100670010500C0100
-----------------
A007P001 0100
CFFFDFFF00000FFFF
100770010500C0100
-----------------

133
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

S0C7 Solution
Purpose : To know about
1. How to give a permanent solution to S0C7
2. How to skip the abend causing record programmatically

Requirement : Read sales record and generate output file by calculating sales amount with the
multiplication of product price and quantity. By using HEX ON, take a non numeric data on
product price(COMP-3 field) of input file.
Check the product price is numeric or not. If it is numeric then process this record to write into
output, otherwise, write input record into error file.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. S0C7SOL.
AUTHOR. MADHU PADALA.

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

SELECT SALES-FILE ASSIGN TO SALES.


SELECT OUT-FILE ASSIGN TO OUTFILE.
SELECT ERROR-FILE ASSIGN TO ERRORFLE.

DATA DIVISION.
FILE SECTION.

FD SALES-FILE.
01 SALES-REC.
05 AGENT-ID PIC X(04).
05 PRODUCT-CODE PIC X(04).
05 PRODUCT-PRICE PIC S9(7)V99 COMP-3.
05 QTY PIC 9(4).

FD OUT-FILE.
01 OUT-REC.
05 OUT-AGENT-ID PIC X(04).
05 OUT-PRODUCT-CODE PIC X(04).
05 OUT-PRODUCT-PRICE PIC S9(7)V99 COMP-3.
05 OUT-QTY PIC 9(04).
05 OUT-SALES-AMT PIC 9(09)V99.

FD ERROR-FILE.
01 ERROR-REC PIC X(17).

WORKING-STORAGE SECTION.
01 WS-EOF-IN PIC X(1) VALUE 'N'.

PROCEDURE DIVISION.
000000-MAINLINE.

PERFORM 100000-INITIALIZATION THRU 100000-EXIT.


PERFORM 200000-PROCESS THRU 200000-EXIT

134
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

UNTIL WS-EOF-IN = 'Y'.


PERFORM 300000-TERMINATION THRU 300000-EXIT.
STOP RUN.

100000-INITIALIZATION.

OPEN INPUT SALES-FILE


OUTPUT ERROR-FILE
OUT-FILE.

100000-EXIT.
EXIT.

200000-PROCESS.
READ SALES-FILE AT END MOVE 'Y' TO WS-EOF-IN
GO TO 200000-EXIT.
DISPLAY SALES-REC

MOVE AGENT-ID TO OUT-AGENT-ID


MOVE PRODUCT-CODE TO OUT-PRODUCT-CODE
MOVE QTY TO OUT-QTY
IF PRODUCT-PRICE IS NUMERIC
CONTINUE
ELSE
MOVE SALES-REC TO ERROR-REC
WRITE ERROR-REC
GO TO 200000-EXIT
END-IF
MOVE PRODUCT-PRICE TO OUT-PRODUCT-PRICE
COMPUTE OUT-SALES-AMT = PRODUCT-PRICE * QTY
WRITE OUT-REC.

200000-EXIT.
EXIT.

300000-TERMINATION.

CLOSE SALES-FILE
ERROR-FILE
OUT-FILE.

300000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.S0C7.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//DD1 DD DSN=IBMUSER.SMF.S0C7.ERROR,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=S0C7SOL
//SYSOUT DD SYSOUT=*
//*

135
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

//SALES DD DSN=IBMUSER.SMF.S0C7.INFILE,DISP=SHR
//OUTFILE DD DSN=IBMUSER.SMF.S0C7.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=28,BLKSIZE=0)
//ERRORFLE DD DSN=IBMUSER.SMF.S0C7.ERROR,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=FB,LRECL=17,BLKSIZE=0)
//*

Error :

IBMUSER.SMF.S0C7.ERROR
A005P001 v 0100

Output :

IBMUSER.SMF.S0C7.OUT
A001P001 010000050000000
A002P001 010000050000000
A003P001 010000050000000
A004P001 010000050000000
A006P001 010000050000000
A007P001 010000050000000

136
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Variable length file with multiple transactions

Purpose : To know about


1.Common situation to create a variable length file. i.e. Transaction files that
has different records with different lengths.
2.How to declare a variable length record with recording mode and record
varying clauses.
3. Ho w to declare a length field.
4. How to write a variable length file with record area and length.
5. What is the difference between COBOL and JCL in record length.

Requirement : Take the input file that has records with three different layouts for three different
transactions as shown in the program. These transactions are Deposit, withdrawal and transfer.
All these transactions are padded with a filler in the end to make each record to 100 bytes. Write
output file with these records without this filler, so that each record will have different length.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. FB2VB1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO INFILE.
SELECT OUT-FILE ASSIGN TO OUTFILE
FILE STATUS IS WS-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-REC.
05 TRX-TYPE PIC X(02).
88 DEPOSIT-TRX VALUE 'DE'.
88 WITHDRAWL-TRX VALUE 'WI'.
88 TRANSFER-TRX VALUE 'TR'.
05 IN-TRANSACTION-INFO PIC X(98).
01 DEPOSIT-REC.
05 IN-TRX-TYPE PIC X(02).
05 IN-DEPOSIT-ACCT PIC X(10).
05 IN-DEPOSITEE-NAME PIC X(10).
05 IN-DEPOSIT-BANK PIC X(10).
05 IN-DEPOSIT-BRANCH PIC X(03).
05 IN-DEPOSIT-DATE PIC X(08).
05 IN-DEPOSIT-AMOUNT PIC 9(08)V99.
05 IN-DEPOSIT-TYPE PIC X(01).
88 DRAFT-OR-CHEQUE VALUE 'D'.
88 CASH VALUE 'C'.
05 IN-DRAFT-BANK PIC X(08).
05 IN-DEPOSITOR-PAN PIC X(10).
05 FILLER PIC X(28).
01 WITHDRAWL-REC.
05 IN-TRX-TYPE PIC X(02).

137
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

05 IN-WITHDROYEE-NAME PIC X(20).


05 IN-WITHDRAWL-CHECK-NUM PIC X(06).
05 IN-WITHDRAWL-BANK PIC X(10).
05 IN-WITHDRAWL-BRANCH PIC X(03).

05 IN-WITHDRAWL-DATE PIC X(08).


05 IN-WITHDRAWL-AMOUNT PIC 9(08)V99.
05 IN-WITHDROYEE-TYPE PIC X(01).
88 SELFF VALUE 'S'.
88 OTHERS VALUE 'O'.
05 FILLER PIC X(40).
01 TRANSFER-REC.
05 IN-TRX-TYPE PIC X(02).
05 IN-FROM-ACCOUNT PIC X(10).
05 IN-FROM-BANK PIC X(10).
05 IN-PAYER-NAME PIC X(10).
05 IN-TO-ACCOUNT PIC X(10).
05 IN-TO-BANK PIC X(10).
05 IN-PAYEE-NAME PIC X(10).
05 IN-TRANSFER-AMOUNT PIC 9(08)V99.
05 IN-TRANSFER-DATE PIC X(08).
05 FILLER PIC X(20).
FD OUT-FILE
RECORDING MODE IS V
RECORD VARYING FROM 1 TO 100 CHARACTERS
DEPENDING ON OUTFILE-LENGTH.
01 OUT-REC PIC X(100).
01 OUT-DEPOSIT-REC.
05 OUT-TRX-TYPE PIC X(02).
05 OUT-DEPOSIT-ACCT PIC X(10).
05 OUT-DEPOSITEE-NAME PIC X(10).
05 OUT-DEPOSIT-BANK PIC X(10).
05 OUT-DEPOSIT-BRANCH PIC X(03).
05 OUT-DEPOSIT-DATE PIC X(08).
05 OUT-DEPOSIT-AMOUNT PIC 9(08)V99.
05 OUT-DEPOSIT-TYPE PIC X(01).
88 DRAFT-OR-CHEQUE VALUE 'D'.
88 CASH VALUE 'C'.
05 OUT-DRAFT-BANK PIC X(08).
05 OUT-DEPOSITOR-PAN PIC X(10).
01 OUT-WITHDRAWL-REC.
05 OUT-TRX-TYPE PIC X(02).
05 OUT-WITHDROYEE-NAME PIC X(20).
05 OUT-WITHDRAWL-CHECK-NUM PIC X(06).
05 OUT-WITHDRAWL-BANK PIC X(10).
05 OUT-WITHDRAWL-BRANCH PIC X(03).
05 OUT-WITHDRAWL-DATE PIC X(08).
05 OUT-WITHDRAWL-AMOUNT PIC 9(08)V99.
05 OUT-WITHDROYEE-TYPE PIC X(01).
88 SELFF VALUE 'S'.
88 OTHERS VALUE 'O'.
01 OUT-TRANSFER-REC.
05 OUT-TRX-TYPE PIC X(02).
05 OUT-FROM-ACCOUNT PIC X(10).
05 OUT-FROM-BANK PIC X(10).
05 OUT-PAYER-NAME PIC X(10).
05 OUT-TO-ACCOUNT PIC X(10).
05 OUT-TO-BANK PIC X(10).
05 OUT-PAYEE-NAME PIC X(10).
05 OUT-TRANSFER-AMOUNT PIC 9(08)V99.
05 OUT-TRANSFER-DATE PIC X(08).

138
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

WORKING-STORAGE SECTION.
01 WS-EOF PIC X(01) VALUE 'N'.
01 OUTFILE-LENGTH PIC 9(04) COMP VALUE ZERO.
01 WS-FILE-STATUS PIC X(02) VALUE SPACES.

PROCEDURE DIVISION.
000000-MAINLINE.
PERFORM 100000-INITIALIZATION THRU 100000-EXIT.
PERFORM 200000-PROCESS THRU 200000-EXIT
UNTIL WS-EOF = 'Y'.
PERFORM 300000-TERMINATION THRU 300000-EXIT.
STOP RUN.

100000-INITIALIZATION.
OPEN INPUT IN-FILE
OUTPUT OUT-FILE.
100000-EXIT.
EXIT.
200000-PROCESS.
READ IN-FILE AT END MOVE 'Y' TO WS-EOF
GO TO 200000-EXIT.
EVALUATE TRX-TYPE IN IN-REC
WHEN 'DE'
MOVE LENGTH OF OUT-DEPOSIT-REC TO OUTFILE-LENGTH
WHEN 'WI'
MOVE LENGTH OF OUT-WITHDRAWL-REC TO OUTFILE-LENGTH
WHEN 'TR'
MOVE LENGTH OF OUT-TRANSFER-REC TO OUTFILE-LENGTH
END-EVALUATE.
MOVE IN-REC TO OUT-REC
WRITE OUT-REC.
200000-EXIT.
EXIT.

300000-TERMINATION.
CLOSE IN-FILE
OUT-FILE.
300000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.FB2VB1.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=FB2VB1
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//*
//INFILE DD DSN=IBMUSER.SMF.FB2VB1.IN,DISP=SHR
//OUTFILE DD DSN=IBMUSER.SMF.FB2VB1.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSALLDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=VB,LRECL=104,BLKSIZE=108)
//*

139
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Input File :

IBMUSER.SMF.FB2VB1.IN
DE0511111111MFSCHOOL ICICI JUB201009010000500000C ALVPP3618P
DE0511111112JEFFERSON HDFC JUB201009010000500000C ALVPP3619P
WIMADHU PADALA 012365ICICI JUB201009050000600000O
WIRAVI MULAKALA 012365HDFC JUB201009050000600000S
TR1111111112HDFC MADHU 2222222222ICICI RAVI 000070000020100901
TR1111111113ICICI HITHA 2222222222ICICI RAVI 000070000020100901

Output file :

IBMUSER.SMF.FB2VB1.OUT
DE0511111111MFSCHOOL ICICI JUB201009010000500000C ALVPP3618P
DE0511111112JEFFERSON HDFC JUB201009010000500000C ALVPP3619P
WIMADHU PADALA 012365ICICI JUB201009050000600000O
WIRAVI MULAKALA 012365HDFC JUB201009050000600000S
TR1111111112HDFC MADHU 2222222222ICICI RAVI 000070000020100901
TR1111111113ICICI HITHA 2222222222ICICI RAVI 000070000020100901

140
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Display length of record in Variable length file

Purpose : To know
1. How to find the actual length of each record in variable length file.

Requirement : Read the output file of program FB2VB1 and display the transaction code and its
length.
Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. VBREAD1.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO INFILE
FILE STATUS IS WS-FILE-STATUS.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
RECORDING MODE IS V
RECORD VARYING FROM 1 TO 100 CHARACTERS
DEPENDING ON INFILE-LENGTH.
01 IN-REC.
05 TRX-TYPE PIC X(02).
88 DEPOSIT-TRX VALUE 'DE'.
88 WITHDRAWL-TRX VALUE 'WI'.
88 TRANSFER-TRX VALUE 'TR'.
05 FILLER PIC X(98).

WORKING-STORAGE SECTION.
01 INFILE-LENGTH PIC 9(04) COMP VALUE ZERO.
01 WS-FILE-STATUS PIC X(2).

PROCEDURE DIVISION.
OPEN INPUT IN-FILE
PERFORM UNTIL WS-FILE-STATUS = '10'
READ IN-FILE
IF WS-FILE-STATUS = '00'
DISPLAY TRX-TYPE ';' INFILE-LENGTH
END-IF
END-PERFORM
CLOSE IN-FILE

STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS20 EXEC PGM=VBREAD1
//SYSOUT DD SYSOUT=*

141
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

//*
//INFILE DD DSN=IBMUSER.SMF.FB2VB1.OUT,DISP=SHR

Input file :

IBMUSER.SMF.FB2VB1.OUT
DE0511111111MFSCHOOL ICICI JUB201009010000500000C ALVPP3618P
DE0511111112JEFFERSON HDFC JUB201009010000500000C ALVPP3619P
WIMADHU PADALA 012365ICICI JUB201009050000600000O
WIRAVI MULAKALA 012365HDFC JUB201009050000600000S
TR1111111112HDFC MADHU 2222222222ICICI RAVI 000070000020100901
TR1111111113ICICI HITHA 2222222222ICICI RAVI 000070000020100901

Output :
DE;0072
DE;0072
WI;0060
WI;0060
TR;0080
TR;0080

142
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Variable length file with Occurs depending Clause


Purpose : To know about
1. How to create a variable length file that has occurs depending clause.

Requirement : Employee input file has a children info occurs 5 times whether the employee has
children or not. Create Employee output file that has children info occurs 0 to 5 times depending
on number of children.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. FB2VB2.
AUTHOR. MADHU PADALA.

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

SELECT EMP-IN ASSIGN TO EMPIN.


SELECT EMP-OUT ASSIGN TO EMPOUT.

DATA DIVISION.
FILE SECTION.

FD EMP-IN
RECORDING MODE IS F
RECORD CONTAINS 125 CHARACTERS.

01 EMP-IN-REC.
05 EMP-NUM PIC X(04).
05 EMP-NAME PIC X(20).
05 CHILDREN-NUM PIC 9(01).
05 CHILDREN-INFO OCCURS 5 TIMES.
10 CHILD-NAME PIC X(10).
10 CHILD-DOB PIC 9(08).
10 CHILD-AGE PIC 9(02).

FD EMP-OUT
RECORDING MODE IS V
RECORD VARYING FROM 1 TO 125 CHARACTERS
DEPENDING ON OUT-FILE-LEN.

01 EMP-OUT-REC.
05 OUT-EMP-NUM PIC X(04).
05 OUT-EMP-NAME PIC X(20).
05 OUT-CHILDREN-NUM PIC 9(01).
05 OUT-CHILDREN-INFO OCCURS 0 TO 5 TIMES
DEPENDING ON OUT-CHILDREN-NUM.
10 OUT-CHILD-NAME PIC X(10).
10 OUT-CHILD-DOB PIC 9(08).
10 OUT-CHILD-AGE PIC 9(02).

WORKING-STORAGE SECTION.
01 WS-EOF PIC X(1) VALUE 'N'.
01 WS-COUNT PIC 9(1) VALUE ZEROS.

143
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

01 OUT-FILE-LEN PIC 9(4) COMP VALUE ZEROS.

PROCEDURE DIVISION.

PERFORM 100000-INITIALIZATION THRU 100000-EXIT.


PERFORM 200000-PROCESS THRU 200000-EXIT
UNTIL WS-EOF = 'Y'.
PERFORM 300000-TERMINATION THRU 300000-EXIT.
STOP RUN.

100000-INITIALIZATION.
OPEN INPUT EMP-IN
OUTPUT EMP-OUT.
100000-EXIT.
EXIT.

200000-PROCESS.
READ EMP-IN AT END MOVE 'Y' TO WS-EOF
GO TO 200000-EXIT.

MOVE EMP-NUM TO OUT-EMP-NUM


MOVE EMP-NAME TO OUT-EMP-NAME
MOVE CHILDREN-NUM TO OUT-CHILDREN-NUM

PERFORM VARYING WS-COUNT FROM 1 BY 1 UNTIL WS-COUNT >


CHILDREN-NUM
MOVE CHILDREN-INFO(WS-COUNT)
TO OUT-CHILDREN-INFO(WS-COUNT)
END-PERFORM

COMPUTE OUT-FILE-LEN = 25 + (OUT-CHILDREN-NUM * 20)


WRITE EMP-OUT-REC.
200000-EXIT.
EXIT.

300000-TERMINATION.
CLOSE EMP-IN
EMP-OUT.
300000-EXIT.
EXIT.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS10 EXEC PGM=IEFBR14
//DD1 DD DSN=IBMUSER.SMF.FB2VB2.OUT,
// DISP=(MOD,DELETE,DELETE),
// SPACE=(CYL,(1,1),RLSE)
//*
//JS20 EXEC PGM=FB2VB2
//SYSOUT DD SYSOUT=*
//*
//EMPIN DD DSN=IBMUSER.SMF.FB2VB2.IN,DISP=SHR
//EMPOUT DD DSN=IBMUSER.SMF.FB2VB2.OUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSALLDA,
// SPACE=(CYL,(1,1),RLSE),
// DCB=(RECFM=VB,LRECL=129,BLKSIZE=133)

144
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

//*

Input :

IBMUSER.SMF.FB2VB2.IN
E000PRABHAS 0
E001KRISH 1CHINTU 2010030502
E002RAMYA 2NEELU 2009040703RAMU 2011050602
E003SRAVAN 3SHEELA 2008020504SAILAJA 2009050603CHAITRA 2010090702
E004STEPHEN 4DAVID 2008040604FERNANDEZ 2009030503SARA 2010030702LARA 2011091101
E005SIVARAM 5CHITRA 2005090307VARSHA 2007060505NARESH 2010010802SRILEKYA 2011091101LAHARI 2011091101

Output :
IBMUSER.SMF.FB2VB2.OUT
E000PRABHAS 0
E001KRISH 1CHINTU 2010030502
E002RAMYA 2NEELU 2009040703RAMU 2011050602
E003SRAVAN 3SHEELA 2008020504SAILAJA 2009050603CHAITRA 2010090702
E004STEPHEN 4DAVID 2008040604FERNANDEZ 2009030503SARA 2010030702LARA 2011091101
E005SIVARAM 5CHITRA 2005090307VARSHA 2007060505NARESH 2010010802SRILEKYA 2011091101LAHARI 2011091101

145
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Display length of record in Variable length file


Purpose : To know
1. How to find the actual length of each record in variable length file.

Requirement : Read the output file of program FB2VB2 and display the transaction code and its
length.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. VBREAD2.
AUTHOR. MADHU PADALA.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO INFILE
FILE STATUS IS WS-FILE-STATUS.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
RECORDING MODE IS V
RECORD VARYING FROM 1 TO 125 CHARACTERS
DEPENDING ON INFILE-LENGTH.

01 IN-FILE-REC.
05 IN-EMP-NUM PIC X(04).
05 IN-EMP-NAME PIC X(20).
05 IN-CHILDREN-NUM PIC 9(01).
05 IN-CHILDREN-INFO OCCURS 0 TO 5 TIMES
DEPENDING ON IN-CHILDREN-NUM.
10 IN-CHILD-NAME PIC X(10).
10 IN-CHILD-DOB PIC 9(08).
10 IN-CHILD-AGE PIC 9(02).

WORKING-STORAGE SECTION.
01 INFILE-LENGTH PIC 9(04) COMP VALUE ZERO.
01 WS-FILE-STATUS PIC X(2).

PROCEDURE DIVISION.
OPEN INPUT IN-FILE
PERFORM UNTIL WS-FILE-STATUS = '10'
READ IN-FILE
IF WS-FILE-STATUS = '00'
DISPLAY IN-EMP-NUM ';' IN-CHILDREN-NUM ';'
INFILE-LENGTH
END-IF
END-PERFORM
CLOSE IN-FILE

STOP RUN.

146
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS20 EXEC PGM=VBREAD2
//SYSOUT DD SYSOUT=*
//*
//INFILE DD DSN=IBMUSER.SMF.FB2VB2.OUT,DISP=SHR

Input :

IBMUSER.SMF.FB2VB2.OUT
E000PRABHAS 0
E001KRISH 1CHINTU 2010030502
E002RAMYA 2NEELU 2009040703RAMU 2011050602
E003SRAVAN 3SHEELA 2008020504SAILAJA 2009050603CHAITRA 2010090702
E004STEPHEN 4DAVID 2008040604FERNANDEZ 2009030503SARA 2010030702LARA 2011091101
E005SIVARAM 5CHITRA 2005090307VARSHA 2007060505NARESH 2010010802SRILEKYA 2011091101LAHARI 2011091101

Output :
E000;0;0025
E001;1;0045
E002;2;0065
E003;3;0085
E004;4;0105
E005;5;0125

147
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

Submit JCL from COBOL


Purpose : To know about
1. How to submit a JCL from a COBOL program.
2. How to declare a JCL file in COBOL and run JCL with internal reader.

Requirement : Write a COBOL program to create and submit a JCL that deletes a file with
IEFBR14.

Program :
IDENTIFICATION DIVISION.
PROGRAM-ID. INTRDR.
AUTHOR. MADHU PADALA.

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

SELECT JCL-FILE ASSIGN TO JCLFILE.

DATA DIVISION.
FILE SECTION.
FD JCL-FILE.
01 JCL-REC PIC X(80).

PROCEDURE DIVISION.

OPEN OUTPUT JCL-FILE.

MOVE '//IBMUSERX JOB ,MADHUPADALA,' TO JCL-REC


WRITE JCL-REC
MOVE '// MSGLEVEL=(1,1),NOTIFY=&SYSUID' TO JCL-REC
WRITE JCL-REC
MOVE '//JS10 EXEC PGM=IEFBR14' TO JCL-REC
WRITE JCL-REC
MOVE '//DD1 DD DSN=IBMUSER.SMF.TEMP1,' TO JCL-REC
WRITE JCL-REC
MOVE '// DISP=(MOD,DELETE,DELETE),' TO JCL-REC
WRITE JCL-REC
MOVE '// SPACE=(TRK,(1,1),RLSE)' TO JCL-REC
WRITE JCL-REC.

CLOSE JCL-FILE.
STOP RUN.

RunJCL :
//IBMUSERX JOB 'MADHU PADALA',MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=IBMUSER.SMF.LOADLIB,DISP=SHR
//*
//JS20 EXEC PGM=INTRDR
//SYSOUT DD SYSOUT=*
//*
//JCLFILE DD SYSOUT=(*,INTRDR)

148
School of MAINFRAMES Email : schoolofmainframes@gmail.com Ph : 040-64515137

149

You might also like