Girish,
The reason you are getting an additional zero is because you are Unhex'ing an ODD number of digits ( 7 bytes in this case) and the documentation clearly explains that under TRAN=UNHEX
Search for =UNHEX on this page https://www.ibm.com/docs/en/zos/3.1.0?topic=statements-outfil-control and you will find this
m can be 1 to 32752. The output length will be (m+1)/2 bytes.
If m is odd, the last nibble will be 0. As an example, C'C1F1F' would translate to X'C1F1F0' (C'A10').
That is the reason as to why you are getting incorrect decimal values for the size.
Anywho as I mentioned earlier, you don't need 8 passes of data as it can ALL be done in a single pass of Joinkeys
so your JCL should just have
1. File manager step1
2. File manager step2
3. Joinkeys step which is shown below (wrote this on the fly and untested)
//***************************************************************
//* Compare the load modules using DFSORT joinkeys *
//***************************************************************
//CMPLMODS EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SYMNOUT DD SYSOUT=*
//SYMNAMES DD *
** Temp-record layout for each file
POSITION,200
TREC-BEGIN,*
TLDSN,=,44,CH # Dataset name
SKIP,1
TLMOD,*,08,CH # Load module name
SKIP,1
TLNKD,*,20,CH # Link date (yyyymmdd at hh:mm:ss)
SKIP,1
TSIZE,*,08,CH # Size of Load module
TSIZE1,=,01,CH # first byte
TSIZE2,*,07,CH # seven bytes of size
SKIP,1
TMTIN,*,01,CH # match record indicator
SKIP,1
TREC-END,86 # Total lengths including skip
** JNF1/JNF2 Record layout
RDW,01,04,BI
JREC-BEGIN,*
JDSN,*,44,CH # Dataset name
SKIP,1
JLMOD,*,08,CH # Load module name
SKIP,1
JLNKD,*,20,CH # Link date (yyyymmdd at hh:mm:ss)
SKIP,1
JSIZE,*,08,CH # Size of Load module
SKIP,1
JMTIN,*,01,CH # match record indicator
SKIP,1
JREC-END,86 # Total lengths including skip
** Matched record layout
POSITION,1
M1DSN,*,44,CH # Dataset name
SKIP,1
M1LMOD,*,08,CH # Load module name
SKIP,1
M1LNKD,*,20,CH # Link date (yy/mm/dd at hh:mm:ss)
M1LCRDT,=,08,UFF # date
M1Ltime,*,12,CH # time
SKIP,1
M1SIZE,*,08,CH # Size of Load module
SKIP,1
M1MTIN,*,01,CH # match record indicator
SKIP,1
M2DSN,*,44,CH # Dataset name
SKIP,1
M2LMOD,*,08,CH # Load module name
SKIP,1
M2LNKD,*,20,CH # Link date (yyyymmdd at hh:mm:ss)
M2LCRDT,=,08,UFF # date
M2Ltime,*,12,CH # time
SKIP,1
M2SIZE,*,08,CH # Size of Load module
SKIP,1
M2MTIN,*,01,CH # match record indicator
SKIP,1
JFMIND,*,01,CH # Joinkeys match indicator
** another temp area layout to convert size
POSITION,200
JTSIZE1,*,04,BI
SKIP,1
JTSZRD1,*,09,UFF
SKIP,1
JTSIZE2,*,04,BI
SKIP,1
JTSZRD2,*,09,UFF
SKIP,1
JCRDAT1,*,06,Y2T # File-1 create date as yy/mm/dd
SKIP,1
JCRGDT1,*,08,Y4T # File-1 Create date in Greogorian format
SKIP,1
JCRDAT2,*,06,Y2T # File-2 Create date as yy/mm/dd
SKIP,1
JCRGDT2,*,08,Y4T # File-2 Create date in Greogorian format
SKIP,1
//INA DD DISP=(OLD,PASS),DSN=&&FMNREPT1
//INB DD DISP=(OLD,PASS),DSN=&&FMNREPT2
//DUPLICAT DD SYSOUT=*
//ONLYF1 DD SYSOUT=*
//ONLYF2 DD SYSOUT=*
//LMODRPT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
JOINKEYS F1=INA,FIELDS=(JLMOD,A,JMTIN,A)
JOINKEYS F2=INB,FIELDS=(JLMOD,A,JMTIN,A)
JOIN UNPAIRED
REFORMAT FIELDS=(F1:JREC-BEGIN,JREC-END,
F2:JREC-BEGIN,JREC-END,
?)
OMIT COND=(M1MTIN,SS,EQ,C'A,B,C',OR,
M2MTIN,SS,EQ,C'E,F,G')
INREC OVERLAY=(JTSIZE1:M1SIZE,TRAN=UNHEX,
JTSZRD1:JTSIZE1,BI,M10,LENGTH=9,
JTSIZE2:M2SIZE,TRAN=UNHEX,
JTSZRD2:JTSIZE2,BI,M10,LENGTH=9,
JCRDAT1:M1LCRDT,M10,LENGTH=6,
JCRGDT1:JCRDAT1,TOGREG=Y4T,
JCRDAT2:M2LCRDT,M10,LENGTH=6,
JCRGDT2:JCRDAT2,TOGREG=Y4T)
OUTFIL FNAMES=DUPLICAT,
INCLUDE=(JFMIND,EQ,C'B'),
BUILD=(01,84,JTSZRD1,/,
87,84,JTSZRD2)
OUTFIL FNAMES=DUPLICAT,
INCLUDE=(JFMIND,EQ,C'B'),
BUILD=(01,84,JTSZRD1,/,
87,84,JTSZRD2)
OUTFIL FNAMES=ONLYF1,
INCLUDE=(JFMIND,EQ,C'1'),
BUILD=(01,84,JTSZRD1)
OUTFIL FNAMES=ONLYF2,
INCLUDE=(JFMIND,EQ,C'2'),
BUILD=(87,84,JTSZRD2)
OUTFIL FNAMES=LMODRPT,
INCLUDE=(JFMIND,EQ,C'B',AND, # in both file
(M1LMOD,EQ,M2LMOD),AND, # Program
(JCRGDT1,CH,GE,JCRGDT2,CH),AND, # Create date
(JTSZRD1,GE,JTSZRD2)), # Module size
BUILD=(01,84,JTSZRD1,/,
87,84,JTSZRD2)
/*
PS: File manager has the ability to compare Load module (look up CLM function)
------------------------------
Sri Hari Kolusu
------------------------------
Original Message:
Sent: Mon November 18, 2024 10:55 AM
From: Girish Sajja
Subject: SORT
Hi,
The following is the job:
//@BTLDCGS JOB (BTT),'LOAD MODULE COMPARE ',MSGCLASS=T,CLASS=4,
// NOTIFY=&SYSUID
//*
//SETDSNS SET DSN1=DVPNV.#1.PROD.POLOADBT,DSN1HLQ=DVPNV,
// DSN2=TSTBT.U2A9.CICSLOAD,DSN2HLQ=TSTBT
//*
//JS010 EXEC PGM=FMNMAIN
//IDIOFF DD DUMMY
//FMNCOB DD DUMMY
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTERM DD SYSOUT=*
//FMNROPT DD SYSOUT=*
//FMNRPRM DD SYSOUT=*
//FMNRPRC DD SYSOUT=*
//DDIN DD DSN=&DSN1,
// DISP=SHR
//*MNREPT DD DSN=TSTBT.TEMP.LOADMOD1,
//* DISP=(,CATLG),
//* SPACE=(TRK,(255,15),RLSE),
//* DATACLAS=COMPZEDC,
//* MGMTCLAS=TTEMP
//FMNREPT DD DSN=&&FMNREPT1,
// DISP=(,PASS),
// SPACE=(TRK,(255,15),RLSE)
//FMNRSUM DD SYSOUT=*
//SYSIN DD *
$$FILEM VLM ,
$$FILEM DATEFORM=YYMMDD,XLABEL=YES,SUMMARY=YES
/*
//*
//*
//JS020 EXEC PGM=FMNMAIN
//IDIOFF DD DUMMY
//FMNCOB DD DUMMY
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTERM DD SYSOUT=*
//FMNROPT DD SYSOUT=*
//FMNRPRM DD SYSOUT=*
//FMNRPRC DD SYSOUT=*
//DDIN DD DSN=&DSN2,
// DISP=SHR
//*MNREPT DD DSN=TSTBT.TEMP.LOADMOD2,
//* DISP=(,CATLG),
//* SPACE=(TRK,(255,15),RLSE),
//* DATACLAS=COMPZEDC,
//* MGMTCLAS=TTEMP
//FMNREPT DD DSN=&&FMNREPT2,
// DISP=(,PASS),
// SPACE=(TRK,(255,15),RLSE)
//FMNRSUM DD SYSOUT=*
//SYSIN DD *
$$FILEM VLM ,
$$FILEM DATEFORM=YYMMDD,XLABEL=YES,SUMMARY=YES
/*
//JS030 EXEC PGM=ICETOOL,
// PARM=('JP0"&DSN1HLQ"','JP1"&DSN2HLQ"')
//SYMNOUT DD SYSOUT=*
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//JNF1JMSG DD SYSOUT=*
//JNF2JMSG DD SYSOUT=*
//FMNREPT1 DD DSN=*.JS010.FMNREPT,
// DISP=OLD
//FMNREPT2 DD DSN=*.JS020.FMNREPT,
// DISP=OLD
//REFMT1 DD DSN=&&REFMT1,
// DISP=(,),
// RECFM=VB,
// SPACE=(TRK,(255,15))
//REFMT2 DD DSN=&&REFMT2,
// DISP=(,),
// RECFM=VB,
// SPACE=(TRK,(255,15))
//*EFMTO1 DD SYSOUT=*,RECFM=V
//REFMTO1 DD DSN=&&REFMTO1,
// DISP=(,),
// RECFM=VB,
// SPACE=(TRK,(255,15))
//*EFMTO2 DD SYSOUT=*,RECFM=V
//REFMTO2 DD DSN=&&REFMTO2,
// DISP=(,),
// RECFM=VB,
// SPACE=(TRK,(255,15))
//*EFMTO3 DD SYSOUT=*,RECFM=V
//REFMTO3 DD DSN=&&REFMTO3,
// DISP=(,),
// RECFM=VB,
// SPACE=(TRK,(255,15))
//*EFMTO4 DD SYSOUT=*,RECFM=V
//REFMTO4 DD DSN=&&REFMTO4,
// DISP=(,),
// RECFM=VB,
// SPACE=(TRK,(255,15))
//*EFMTO5 DD SYSOUT=*
//REFMTO5 DD DSN=&&REFMTO5,
// DISP=(,),
// SPACE=(TRK,(255,15))
//DUPLICAT DD SYSOUT=* RECFM=V
//NOTFND DD SYSOUT=* RECFM=V
//NOTFNDF2 DD SYSOUT=* RECFM=V
//REFMTO6 DD SYSOUT=*
//TOOLIN DD *
COPY FROM(FMNREPT1) TO(REFMT1) USING(INPT)
COPY FROM(FMNREPT2) TO(REFMT2) USING(INPT)
COPY FROM(REFMT1) TO(REFMTO1) USING(REFM)
COPY FROM(REFMT2) TO(REFMTO2) USING(REF2)
SPLICE FROM(REFMTO1) WITHANY -
ON(84,6,ZD) - ID
WITH(49,8) - LOAD MODULE
WITH(57,20) - DATE/TIME
WITH(77,7) - LOAD MOD SIZE (HEX)
TO(REFMTO3)
SPLICE FROM(REFMTO2) WITHANY -
ON(84,6,ZD) - ID
WITH(49,8) - LOAD MODULE
WITH(57,20) - DATE/TIME
WITH(77,7) - LOAD MOD SIZE (HEX)
TO(REFMTO4)
COPY JKFROM USING(OUTP)
COPY FROM(REFMTO5) TO(REFMTO6) USING(REF5)
/*
//*
//INPTCNTL DD *
INCLUDE COND=(8,12,CH,EQ,C'Load Library',OR,
8,12,CH,EQ,C'Load Module ',OR,
13,10,CH,EQ,C'Linked on ',OR,
30,5,CH,EQ,C'Size ')
INREC IFOUTLEN=89,
IFTHEN=(WHEN=(8,12,CH,EQ,C'Load Library'),
PARSE=(%00=(ABSPOS=23,ENDBEFR=C' ',FIXLEN=44)),
BUILD=(1,4,%00)),
IFTHEN=(WHEN=(8,12,CH,EQ,C'Load Module '),
PARSE=(%01=(ABSPOS=23,ENDBEFR=C' ',FIXLEN=8)),
BUILD=(1,4,44X,%01)),
IFTHEN=(WHEN=(13,10,CH,EQ,C'Linked on '),
PARSE=(%02=(ABSPOS=23,ENDBEFR=C' by ',FIXLEN=20)),
BUILD=(1,4,52X,%02)),
IFTHEN=(WHEN=(30,5,CH,EQ,C'Size '),
PARSE=(%03=(ABSPOS=35,ENDBEFR=C' ',FIXLEN=7)),
BUILD=(1,4,72X,%03))
OPTION COPY,VLSCMP
/*
//*
//REFMCNTL DD *
OUTREC IFTHEN=(WHEN=GROUP,
BEGIN=(5,5,CH,EQ,JP0),
PUSH=(84:ID=6))
/*
//*
//REF2CNTL DD *
OUTREC IFTHEN=(WHEN=GROUP,
BEGIN=(5,5,CH,EQ,JP1),
PUSH=(84:ID=6))
/*
//*
//OUTPCNTL DD *
JOIN UNPAIRED,F2
JOINKEYS F1=REFMTO3,FIELDS=(49,8,A)
JOINKEYS F2=REFMTO4,FIELDS=(49,8,A)
REFORMAT FIELDS=(F1:1,89,F2:1,89,?)
OPTION COPY
OUTFIL VTOF,FNAMES=DUPLICAT,
INCLUDE=(179,1,CH,EQ,C'B'),
BUILD=(5,44,X,49,8,X,57,8,X,69,8,X,77,7,/,
94,44,X,138,8,X,146,8,X,158,8,X,166,7,/)
OUTFIL VTOF,FNAMES=REFMTO5,
INCLUDE=(179,1,CH,EQ,C'B'),
BUILD=(5,44,X,49,8,X,57,8,X,69,8,X,77,7,TRAN=UNHEX,X,
94,44,X,138,8,X,146,8,X,158,8,X,166,7,TRAN=UNHEX)
OUTFIL VTOF,FNAMES=NOTFND,
INCLUDE=(179,1,CH,EQ,C'1'),
BUILD=(5,44,X,49,8,X,57,8,X,69,8,X,77,7,/)
OUTFIL VTOF,FNAMES=NOTFNDF2,
INCLUDE=(179,1,CH,EQ,C'2'),
BUILD=(94,44,X,138,8,X,146,8,X,158,8,X,166,7,/)
/*
//*
//REF5CNTL DD *
INCLUDE COND=((46,8,CH,EQ,123,8,CH),AND, Program
((55,8,CH,GE,132,8,CH),OR, Create Date
(73,4,BI,GE,150,4,BI))) Module Size
OUTFIL BUILD=(1,72,73,4,TRAN=HEX,/,78,72,150,4,TRAN=HEX,/)
/*
//*
The following is the output to REFMT06:
DVPNV.#1.PROD.POLOADBT BTOAPPTR 23/10/30 10:08:05 0032BD00
TSTBT.U2A9.CICSLOAD BTOAPPTR 24/09/26 12:47:49 00329980
DVPNV.#1.PROD.POLOADBT BTOAPRRS 24/09/13 09:57:43 002F4E80
TSTBT.U2A9.CICSLOAD BTOAPRRS 24/10/28 13:17:56 002F1F00
DVPNV.#1.PROD.POLOADBT BTOLOGMP 24/04/03 16:50:53 00051200
TSTBT.U2A9.CICSLOAD BTOLOGMP 24/10/25 11:18:11 00050100
DVPNV.#1.PROD.POLOADBT BTOMQCDP 24/07/01 15:02:24 000A9440
TSTBT.U2A9.CICSLOAD BTOMQCDP 24/08/21 05:55:39 000A93C0
DVPNV.#1.PROD.POLOADBT BTOMSICI 24/09/13 09:59:07 000789C0
TSTBT.U2A9.CICSLOAD BTOMSICI 24/10/17 09:49:51 000789C0
Thank you.
------------------------------
Girish Sajja
Original Message:
Sent: Mon November 18, 2024 03:47 AM
From: Sri Hari Kolusu
Subject: SORT
>In comparing the load module sizes, it looks like the collating sequence does not always work.
Girish,
Conflicting information. You say you are comparing LOAD modules SIZES and how does Collatin sequence come into picture? Are you sorting the 3.4 listing of load module pds?
>>In converting the UNHEX, which I think created a 4-byte field, an additional zero is being added to the end of the value.
I highly doubt that UNHEX is creating an additional zeros if you are converting a 4 byte or 8 byte.
We would like to see the control cards. please show us the complete job and a sample of what you think is an additional zero
------------------------------
Sri Hari Kolusu
Original Message:
Sent: Fri November 15, 2024 09:37 PM
From: Girish Sajja
Subject: SORT
Hi,
In comparing the load module sizes, it looks like the collating sequence does not always work.
I used TRAN=UNHEX option and then performed a compare and it seems to work properly.
In converting the UNHEX, which I think created a 4-byte field, an additional zero is being added to the end of the value.
Please let me know if there is way to get rid of the additional zero.
Thank you very much.
------------------------------
Girish Sajja
------------------------------