Mainframe Tips, Tricks And Tutorials
Mainframe tips
Sunday, August 9, 2026
𝗣𝗼𝘁𝗲𝗻𝘁𝗶𝗮𝗹 𝘇/𝗢𝗦 𝟯.2 𝗗𝗲𝗳𝗲𝗰𝘁: 𝗕𝗮𝘀𝗶𝗰 𝗙𝗼𝗿𝗺𝗮𝘁 𝗦𝗲𝗾𝘂𝗲𝗻𝘁𝗶𝗮𝗹 𝗗𝗮𝘁𝗮𝘀𝗲𝘁𝘀 𝗘𝘅𝗰𝗲𝗲𝗱𝗶𝗻𝗴 𝘁𝗵𝗲 𝟲𝟱𝗞 𝗧𝗿𝗮𝗰𝗸 𝗟𝗶𝗺𝗶𝘁
Friday, August 7, 2026
𝗪𝗵𝘆 𝗗𝗦𝗟𝗜𝗦𝗧(𝟯.𝟰) 𝗥𝗲𝗽𝗼𝗿𝘁𝗲𝗱 𝟲% 𝗮𝗻𝗱 𝟯% 𝗨𝘁𝗶𝗹𝗶𝘇𝗮𝘁𝗶𝗼𝗻 𝗼𝗻 𝗙𝘂𝗹𝗹𝘆 𝗢𝗰𝗰𝘂𝗽𝗶𝗲𝗱 𝗠𝘂𝗹𝘁𝗶-𝗩𝗼𝗹𝘂𝗺𝗲 𝗗𝗮𝘁𝗮𝘀𝗲𝘁𝘀: 𝗔 𝗗𝗙𝗦𝗢𝗥𝗧 𝗜𝗻𝘃𝗲𝘀𝘁𝗶𝗴𝗮𝘁𝗶𝗼𝗻
Tracks % XT Device Dsorg Recfm Lrecl Blksz Created Referred
-------------------------------------------------------------------------------
XY67890.PRODHIST.ORDRARCH.BACK.DATA XXX710
69745 6 16 3390 PS FB 228 27816 2026/08/07 2026/08/07
-------------------------------------------------------------------------------
XY67890.PRODHIST.ORDRARCH.BACK.DATA XXX674
67860 3 11 3390 PS FB 228 27816 2026/08/07 2026/08/07
-------------------------------------------------------------------------------
XY67890.PRODHIST.ORDRARCH.BACK.DATA XXX612
60320 100 14 3390 PS FB 228 27816 2026/08/07 2026/08/07
-------------------------------------------------------------------------------
XY67890.PRODHIST.ORDRARCH.BACK.DATA XXX678
60320 93 11 3390 PS FB 228 27816 2026/08/07 2026/08/07
Data Set Name . . . . : XY67890.PRODHIST.ORDRARCH.BACK.DATA
General Data Current Allocation
Management class . . : XXXACTX Allocated megabytes : 13,701
Storage class . . . : XXXX Allocated extents . : 52
Volume serial . . . : XXX710 +
Device type . . . . : 3390
Data class . . . . . : DCXXXXX
Organization . . . : PS Current Utilization
Record format . . . : FB Used megabytes . . : 6,532
Record length . . . : 228 Used extents . . . : 2
Block size . . . . : 27816
1st extent megabytes: 100
Secondary megabytes : 400 Dates
Data set name type : Creation date . . . : 2026/08/07
Data set encryption : NO Referenced date . . : 2026/08/07
Expiration date . . : ***None***
//SORTIN DD DSN=XY67890.PRODHIST.ORDRARCH.BACK.DATA,DISP=SHR
//SORTOUT DD DUMMY
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
//*
//STEP020 EXEC PGM=SORT
//SORTIN DD DSN=XY67890.PRODHIST.ORDRARCH.BACK.DATA,DISP=SHR,
// VOL=(,,2)
//SORTOUT DD DSN=XY67890.PRODHIST.ORDRARCH.BACK.DATA.SNGLVOL2,
// DISP=(,CATLG),
// SPACE=(1,(200,200),RLSE),AVGREC=M
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
//*
//STEP030 EXEC PGM=SORT
//SORTIN DD DSN=XY67890.PRODHIST.ORDRARCH.BACK.DATA,DISP=SHR,
// VOL=(,,3)
//SORTOUT DD DSN=XY67890.PRODHIST.ORDRARCH.BACK.DATA.SNGLVOL3,
// DISP=(,CATLG),
// SPACE=(1,(200,200),RLSE),AVGREC=M
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
//*
//STEP040 EXEC PGM=SORT
//SORTIN DD DSN=XY67890.PRODHIST.ORDRARCH.BACK.DATA,DISP=SHR,
// VOL=(,,4)
//SORTOUT DD DSN=XY67890.PRODHIST.ORDRARCH.BACK.DATA.SNGLVOL4,
// DISP=(,CATLG),
// SPACE=(1,(200,200),RLSE),AVGREC=M
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
//*
SORTIN : DSNAME=XY67890.PRODHIST.ORDRARCH.BACK.DATA
SORTOUT : DSNAME=NULLFILE
RCD IN 62025525, OUT 62025525
SORTOUT : DSNAME=XY67890.PRODHIST.ORDRARCH.BACK.DATA.SNGLVOL2
RCD IN 45007745, OUT 45007745
SORTOUT : DSNAME=XY67890.PRODHIST.ORDRARCH.BACK.DATA.SNGLVOL3
RCD IN 28449905, OUT 28449905
SORTOUT : DSNAME=XY67890.PRODHIST.ORDRARCH.BACK.DATA.SNGLVOL4
RCD IN 13731825, OUT 13731825
|
Volume |
Record
Count Calculation |
Records
in Volume |
|
XXX710 (Vol 1) |
62,025,525 −
45,007,745 |
17,017,780 |
|
XXX674 (Vol 2) |
45,007,745 −
28,449,905 |
16,557,840 |
|
XXX612 (Vol 3) |
28,449,905 −
13,731,825 |
14,718,080 |
|
XXX678 (Vol 4) |
Remaining Records |
13,731,825 |
|
Volume |
Dataset
Size (Bytes) |
Track
Calculation |
Tracks
Used |
|
XXX710(Vol 1) |
3,880,053,840 |
3,880,053,840 ÷ (2
× 27,816) |
69,745 |
|
XXX674(Vol 2) |
3,775,187,520 |
3,775,187,520 ÷ (2
× 27,816) |
67,860 |
|
XXX612(Vol 3) |
3,355,722,240 |
3,355,722,240 ÷ (2
× 27,816) |
60,320 |
|
XXX678(Vol 4) |
3,130,856,100 |
3,130,856,100 ÷ (2
× 27,816) |
56,278 |
Dataset Size (Bytes) = Records × LRECL
Tracks Used = Dataset Size ÷ (2 × BLKSIZE)
LRECL = 228
BLKSIZE = 27816
|
Volume |
DSLIST Tracks |
DSLIST Used % |
Calculated Tracks Used (DFSORT) |
Comparison |
|
XXX710 |
69,745 |
6% |
69,745 |
Exact
match |
|
XXX674 |
67,860 |
3% |
67,860 |
Exact
match |
|
XXX612 |
60,320 |
100% |
60,320 |
Exact
match |
|
XXX678 | 60,320 |
93% |
56,278 |
Close
match. 60,320 × 93% = 56,098 tracks, which is very close to the calculated
value of 56,278 tracks |
- Volume
XXX710: 69,745 tracks allocated
- Excess
tracks = 69,745 − 65,535 = 4,210
- DSLIST
reported utilization = 4,210 / 69,745 ≈ 6%
- Volume
XXX674: 67,860 tracks allocated
- Excess
tracks = 67,860 − 65,535 = 2,325
- DSLIST
reported utilization = 2,325 / 67,860 ≈ 3%
Sunday, August 2, 2026
𝗨𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱𝗶𝗻𝗴 𝗦𝗕𝟯𝟳 𝗮𝗻𝗱 𝗦𝗘𝟯𝟳 𝗔𝗯𝗲𝗻𝗱𝘀 𝗳𝗼𝗿 𝗦𝗲𝗾𝘂𝗲𝗻𝘁𝗶𝗮𝗹 𝗗𝗮𝘁𝗮𝘀𝗲𝘁𝘀
- Primary
allocation = 1 track
- Secondary
allocation = 1 track
- Maximum
number of extents allowed for a sequential dataset on a volume = 16 (1
primary extent + 15 secondary extents)
- 1
primary track
- 15
secondary tracks
Monday, July 27, 2026
Building an MQ Queue Depth Alert Program in COBOL
𝗣𝗿𝗲𝘃𝗲𝗻𝘁𝗶𝗻𝗴 𝗗𝗕𝟮 𝗧𝗮𝗯𝗹𝗲 𝗖𝗼𝗻𝘁𝗲𝗻𝘁𝗶𝗼𝗻 𝗕𝗲𝘁𝘄𝗲𝗲𝗻 𝗦𝗘𝗟𝗘𝗖𝗧 𝗚𝗿𝗼𝘂𝗽𝘀 𝗮𝗻𝗱 𝗨𝗽𝗱𝗮𝘁𝗲 𝗝𝗼𝗯𝘀 𝗶𝗻 𝗘𝗦𝗣
- Multiple
SELECT jobs can run concurrently.
- JOBX
runs exclusively.
- No
SELECT job can run while JOBX is running.
- No lengthy NOTWITH statements are required.
- Multiple SELECT Group jobs can run simultaneously because they all hold a SHARED enqueue on MY_TABLE.
- JOBX cannot start while any SELECT job is running because it requires EXCLUSIVE access.
- Likewise, no SELECT job can start while JOBX holds the exclusive enqueue.
- The solution is simple, scalable, and requires minimal maintenance as SELECT jobs are added or removed.