Shivang,
Well, here is something that I wrote on the fly. It has a COBOL exit that will
return the information to DFSORT and then the ICETOOL job will generate a
deport of all the datasets that has spaces in the STORCLAS.
You will need COBOL 6.xx versions as I am using functions like BIT-OF
// SET SMFIN=Your.input.SMF.VBS.dataset
/*
//***************************************************************
//* Compile the program to be used as E35 Exit to DFSORT *
//***************************************************************
//COMPILE EXEC PGM=IGYCRCTL,REGION=0M
//STEPLIB DD DISP=SHR,DSN=COBOL.V6xx.SIGYCOMP
//SYSPRINT DD SYSOUT=*
//SYSTERM DD SYSOUT=*
//SYSMDECK DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT7 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT8 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT9 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT10 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT11 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT12 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT13 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT14 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSUT15 DD UNIT=SYSDA,SPACE=(CYL,(10,2),RLSE)
//SYSLIN DD DSN=&&LOADSET,
// DISP=(MOD,PASS),
// UNIT=SYSDA,
// DSNTYPE=LIBRARY,
// SPACE=(CYL,(1,1),RLSE)
//SYSIN DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. SMF15VBS.
AUTHOR. KOLUSU (IBM/DFSORT)
DATE-WRITTEN. July 21, 2022
****************************************************************
* CREATE DATE: July 21, 2023 *
* AUTHOR : Sri Hari Kolusu *
* VERSION : 01.00 *
****************************************************************
*This program will extract the SMS info from smf type 15 *
****************************************************************
****************************************************************
* Change Log *
****************************************************************
* Date | Programmer | Description *
****************************************************************
* 2023-07-21| Kolusu | Initial Version *
****************************************************************
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SMF15-OUT-RECORD.
05 SMF15-RDW PIC X(004).
05 SMF15-HEADER PIC X(040).
05 SMF15-SEC-SIZE PIC X(008).
05 SMF15-TIOT PIC X(016).
05 SMF15-JFCB PIC X(176).
05 SMF15-SMSC-INFO.
10 SMF15MCN PIC X(008).
10 SMF15DCN PIC X(008).
10 SMF15SCN PIC X(008).
01 WS-CHAR.
02 WS-BYTE1 PIC X(01).
02 WS-BYTE2 PIC X(01).
01 WS-NUM REDEFINES WS-CHAR PIC 9(02) COMP-5.
01 WS-SKIP-OFFSET PIC 9(02) COMP-5.
01 WS-SMF15SDC PIC 9(02) COMP-5.
01 WS-SMF15NUC PIC 9(02) COMP-5.
01 WS-SMF15SUC PIC 9(02) COMP-5.
01 WS-SMF15SET PIC 9(02) COMP-5.
01 WS-SMF15HPS PIC 9(02) COMP-5.
01 WS-SMF15EXT-SECTION.
05 SMF15SXS PIC 9(02) COMP-5.
05 SMF15EST-SUB-SECTION.
10 SMF15ESL PIC 9(02) COMP-5.
10 FILLER PIC X.
10 SMF15STY PIC X.
01 WS-BITS PIC X(08).
01 WS-BITS-N REDEFINES WS-BITS.
10 WS-BITS-0 PIC 9.
10 WS-BITS-1 PIC 9.
10 WS-BITS-2 PIC 9.
10 WS-BITS-3 PIC 9.
10 WS-BITS-4 PIC 9.
10 WS-BITS-5 PIC 9.
10 WS-BITS-6 PIC 9.
10 WS-BITS-7 PIC 9.
01 WS-SMF15EXT-P PIC 9(04) COMP-5.
01 WS-CONS PIC 9(04) COMP-5
VALUE 241.
01 S-SMSINFO-FOUND PIC X(01) VALUE 'N'.
LINKAGE SECTION.
01 RECORD-FLAGS PIC 9(8) BINARY.
88 FIRST-REC VALUE 00.
88 MIDDLE-REC VALUE 04.
88 END-REC VALUE 08.
01 SMF15-RECORD.
05 SMF15REC OCCURS 1 TO 32756 TIMES DEPENDING
ON SMF15-RECORD-LEN PIC X.
01 OP-RECORD.
05 OREC OCCURS 1 TO 280 TIMES DEPENDING
ON OP-RECORD-LEN PIC X.
01 UNUSED1 PIC 9(8) COMP-5.
01 UNUSED2 PIC 9(8) COMP-5.
01 SMF15-RECORD-LEN PIC 9(8) COMP-5.
01 OP-RECORD-LEN PIC 9(8) COMP-5.
01 UNUSED3 PIC 9(8) COMP-5.
01 EXITAREA-LEN PIC 9(4) COMP-5.
01 EXITAREA.
05 EAREA OCCURS 1 TO 256 TIMES DEPENDING
ON EXITAREA-LEN PIC X.
PROCEDURE DIVISION USING RECORD-FLAGS
, SMF15-RECORD
, OP-RECORD
, UNUSED1
, UNUSED2
, SMF15-RECORD-LEN
, OP-RECORD-LEN
, UNUSED3
, EXITAREA-LEN
, EXITAREA.
MOVE SPACES TO SMF15-OUT-RECORD.
MOVE ZEROS TO WS-SMF15NUC
WS-SMF15SDC
WS-SMF15NUC
WS-SMF15SUC
WS-SMF15SET
WS-SMF15HPS
IF END-REC
MOVE 8 TO RETURN-CODE
ELSE
PERFORM 1000-CONVERT-TO-NUM
MOVE SMF15-RECORD(1:241)
TO SMF15-OUT-RECORD
PERFORM 1100-GET-SMSINFO
* MOVE 272 TO OP-RECORD-LEN
MOVE LENGTH OF SMF15-OUT-RECORD
TO OP-RECORD-LEN
MOVE SMF15-OUT-RECORD TO OP-RECORD
MOVE 20 TO RETURN-CODE
END-IF
GOBACK
.
1000-CONVERT-TO-NUM.
* Convert SMF15SDC to numeric from character
MOVE X'0000' TO WS-CHAR
MOVE SMF15-RECORD(41:1) TO WS-BYTE2
MOVE WS-NUM TO WS-SMF15SDC
* Convert SMF15NUC to numeric from character
MOVE X'0000' TO WS-CHAR
MOVE SMF15-RECORD(42:1) TO WS-BYTE2
MOVE WS-NUM TO WS-SMF15NUC
* Convert SMF15SUC to numeric from character
MOVE X'0000' TO WS-CHAR
MOVE SMF15-RECORD(43:1) TO WS-BYTE2
MOVE WS-NUM TO WS-SMF15SUC
* Convert SMF15SET to numeric from character
MOVE X'0000' TO WS-CHAR
MOVE SMF15-RECORD(44:1) TO WS-BYTE2
MOVE WS-NUM TO WS-SMF15SET
MOVE FUNCTION BIT-OF(SMF15-RECORD(40:1))
TO WS-BITS
IF WS-BITS-4 = 1
MOVE 20 TO WS-SMF15HPS
END-IF
.
1100-GET-SMSINFO.
* The Job step information is part of extended section.
* We need to calculate the offset for extended section.
* The formula is as follows.
* Size of header section (040 bytes ) +
* Section sizes (008 bytes ) +
* Tiot section (016 bytes ) +
* JFCB section (176 bytes ) +
* = 240 +
* next section position 001 +
* (num ucb sec (SMF15NUC) X size of ucb (SMF15SUC)) +
* Size of ISAM Section (usually zero) +
* Size of Hiper batch sec if existed (20 bytes ) +
* (The existence of Hiper batch section can be found
* using the SMF15RIN 2nd byte 4th bit.)
* We got all the numeric values and will now calculate
* the offset/position of the extended section which contains
* job step information section.
COMPUTE WS-SMF15EXT-P = WS-CONS +
WS-SMF15SDC +
(WS-SMF15NUC * WS-SMF15SUC) +
WS-SMF15SET +
WS-SMF15HPS
* The extended section offset is now calculated. we need to
* check if the subsection we find is indeed the SMS class
* info section. If SMF15STY = X'02' then we have the
* the right section else we need to loop around to find
* sms class info section.
MOVE SMF15-RECORD(WS-SMF15EXT-P : 6)
TO WS-SMF15EXT-SECTION
MOVE 'N' TO S-SMSINFO-FOUND
MOVE +6 TO WS-SKIP-OFFSET
PERFORM UNTIL S-SMSINFO-FOUND = 'Y'
OR WS-SMF15EXT-P >= SMF15-RECORD-LEN
IF SMF15STY = X'02'
MOVE SMF15-RECORD(WS-SMF15EXT-P +
WS-SKIP-OFFSET : 28)
TO SMF15-SMSC-INFO
MOVE 'Y' TO S-SMSINFO-FOUND
ELSE
COMPUTE WS-SMF15EXT-P = WS-SMF15EXT-P +
SMF15ESL + 2
INITIALIZE SMF15EST-SUB-SECTION
MOVE SMF15-RECORD(WS-SMF15EXT-P : 4)
TO SMF15EST-SUB-SECTION
MOVE +4 TO WS-SKIP-OFFSET
END-IF
END-PERFORM
.
/*
//***************************************************************
//* Link edit the program to be used as E35 Exit to DFSORT *
//***************************************************************
//STEP0200 EXEC PGM=IEWBLINK,COND=(0,LT),REGION=0M
//SYSLIB DD DISP=SHR,DSN=CEE.SCEELKED
// DD DISP=SHR,DSN=CEE.SCEELKEX
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSLIN DD DSN=&&LOADSET,DISP=(OLD,DELETE)
// DD DDNAME=SYSIN
//SYSLMOD DD DSN=&&PGMLIB,DISP=(MOD,PASS),
// DSNTYPE=LIBRARY,SPACE=(CYL,(1,1,1),RLSE)
//SYSIN DD *
ENTRY SMF15VBS
NAME SMF15VBS(R)
/*
//***************************************************************
//* Generate report of SMF15 records with sms information *
//* Storclas SMF15SCN = Spaces *
//***************************************************************
//GENRPT EXEC PGM=ICETOOL,COND=(0,LT)
//EXITC DD DISP=(OLD,PASS),DSN=&&PGMLIB
//TOOLMSG DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYMNAMES DD *
SMF15RTY,006,01,BI $ Record Type
SMF15TME,*,4,TM1 $ Time
SMF15DTE,*,4,DT1 $ Date
SMF15JBN,019,08,CH $ Job Name
SMFTIOE5,057,08,CH $ DD Name
SMF15DSN,069,44,CH $ Dataset Name
POSITION,249
SMF15MCN,*,08,CH $ Management class name
SMF15DCN,*,08,CH $ Dataclass name
SMF15SCN,*,08,CH $ Storage class name
//INPTSMF DD DISP=SHR,DSN=&SMFIN
//TEMPSMF DD DSN=&&TSMF,DISP=(,PASS),SPACE=(CYL,(300,100),RLSE)
//REPORT DD SYSOUT=*
//TOOLIN DD *
COPY FROM(INPTSMF) TO(TEMPSMF) USING(CTL1)
DISPLAY FROM(TEMPSMF) LIST(REPORT) -
TITLE('SMF 14 Input or RDBACK Data Set report') PAGE -
HEADER('SMF#') ON(SMF15RTY,A1) -
HEADER('DATE') ON(SMF15DTE,E'9999/99/99') -
HEADER('TIME') ON(SMF15TME,E'99:99:99') -
HEADER('Jobname') ON(SMF15JBN) -
HEADER('DSN Name') ON(SMF15DSN) -
HEADER('DD Name') ON(SMFTIOE5) -
HEADER('Mangement class name') ON(SMF15MCN) -
HEADER('Data class name') ON(SMF15DCN) -
HEADER('Storage class name') ON(SMF15SCN)
/*
//CTL1CNTL DD *
OPTION COPY,VLSCMP,SPANINC=RC4
INCLUDE COND=(06,1,BI,EQ,15)
MODS E35=(SMF15VBS,32756,EXITC,C)
OUTFIL INCLUDE=(SMF15SCN,EQ,C' ')
/*
Thanks,
Kolusu
-----Original Message-----
From: IBM Mainframe Discussion List <[email protected]> On Behalf Of Sri
h Kolusu
Sent: Friday, July 21, 2023 9:18 AM
To: [email protected]
Subject: [EXTERNAL] Re: Need DFSORT control statements to extract data from
smf15 with storclas blank
>> I am not a DFSort expert but we have a requirement to extract datasets which
>> has storclas (SMF15SCN) = blank.
Shivang Sharma,
SMF15SCN is a part of Extended Information Segment which does NOT have a
standard offset. You need to dynamically calculate the offset based on the
formula 244 + SMF15SDC + (SMF15NUC * SMF15SUC) + SMF15_HIPER_SIZE + SMF15SET).
Unfortunately DFSORT cannot do it , so you need to write an exit in language of
your choice (COBOL, ASM...) and get the SMF 15 record.
Thanks,
Kolusu
DFSORT Development
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions, send email to
[email protected]<mailto:[email protected]> with the message:
INFO IBM-MAIN
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN