|
View previous topic :: View next topic
|
| Author |
Message |
rkpyla
New User
Joined: 22 Mar 2007 Posts: 5 Location: Bangalore
|
|
|
|
Hi,
Can anybody please help me with SYNCTOOL Job for following requirement:
I have 2 input datasets (PDS) which may or may not have members in common.
If a member is present in both the PDS, the Job should place the contents of first PDS member on top of the contents of second PDS member and copy it to output PDS.
Ex:
Input PDS1 - ID.CTL1
Input PDS2 - ID.CTL2
Output PDS - ID.CTL3
Common member in both PDS - MEMBER1
ID.CTL1(MEMBER1):
// DD DSN=ID.FIX1(FIXMEM1),DISP=SHR
ID.CTL2(MEMBER1):
// DD DSN=ID.FIX2(FIXMEM2),DISP=SHR
The job should provide the output as follows:
ID.CTL3(MEMBER1):
// DD DSN=ID.FIX1(FIXMEM1),DISP=SHR
// DD DSN=ID.FIX2(FIXMEM2),DISP=SHR
Thanks
RK |
|
| Back to top |
|
 |
expat
Global Moderator

Joined: 14 Mar 2007 Posts: 8797 Location: Welsh Wales
|
|
|
|
| Quote: |
| If a member is present in both the PDS, the Job should place the contents of first PDS member on top of the contents of second PDS member and copy it to output PDS. |
Do you mean over write the contents of PDS2 ?
What other processing considerations should there be, member exists in PDS 1 but not PDS 2 and vise versa |
|
| Back to top |
|
 |
rkpyla
New User
Joined: 22 Mar 2007 Posts: 5 Location: Bangalore
|
|
|
|
Hi,
The contents of input datasets should not be changed. Both the contents should be merged (in a temporary dataset) and copy it to output PDS.
And if the member is not common in datastes...provide a report of such members.
Thanks,
RK |
|
| Back to top |
|
 |
enrico-sorichetti
Superior Member

Joined: 14 Mar 2007 Posts: 10903 Location: italy
|
|
|
|
the best approach would be...
use ispf superc to compare the directories for matched and not_matched entries
process the superc output in order to
build a IEBCOPY jcl to run the copy from PDS1 to PDS3 for matched entries
| Quote: |
| the Job should place the contents of first PDS member on top of the contents of second PDS |
I do not see the PDS2 member content involved at all |
|
| Back to top |
|
 |
expat
Global Moderator

Joined: 14 Mar 2007 Posts: 8797 Location: Welsh Wales
|
|
|
|
Enrico, I believe that the OP means to concatenate the two members, rather than place one on top of the other
| Quote: |
ID.CTL3(MEMBER1):
// DD DSN=ID.FIX1(FIXMEM1),DISP=SHR
// DD DSN=ID.FIX2(FIXMEM2),DISP=SHR
|
To be honest, I am not sure that SORT would be the best tool for this requirement, but no doubt Frank will prove me wrong  |
|
| Back to top |
|
 |
enrico-sorichetti
Superior Member

Joined: 14 Mar 2007 Posts: 10903 Location: italy
|
|
|
|
Hi Expat,
whatever he meant, it does not look like the process can be done by a simple ICETOOL job
let' s wait for a clarification  |
|
| Back to top |
|
 |
rkpyla
New User
Joined: 22 Mar 2007 Posts: 5 Location: Bangalore
|
|
|
|
Hi All,
Thanks for your inputs.
This request is for a job that concatenates the contents of the common member in 2 PDS.
ID.CTL3(MEMBER1):
// DD DSN=ID.FIX1(FIXMEM1),DISP=SHR
// DD DSN=ID.FIX2(FIXMEM2),DISP=SHR
Please note that its not mandatory that the job should use ICETOOL.
Thanks,
RK |
|
| Back to top |
|
 |
Frank Yaeger
DFSORT Developer

Joined: 15 Feb 2005 Posts: 7129 Location: San Jose, CA
|
|
|
|
| Quote: |
| To be honest, I am not sure that SORT would be the best tool for this requirement, but no doubt Frank will prove me wrong |
No, you're not wrong. DFSORT/ICETOOL only deals with a pds(member) as a sequential data set. It does NOT do anything with comparing/matching multiple members of a PDS.
Kolusu is better at this sort of thing then I am and might be able to come up with a way to do it, but he's in class today. |
|
| Back to top |
|
 |
Bill Dennis
Active Member

Joined: 17 Aug 2007 Posts: 562 Location: Iowa, USA
|
|
|
|
| Combining the data in PDS members is not easy. I wrote my own BPAM access method program to do this. |
|
| Back to top |
|
 |
gcicchet
Senior Member
Joined: 28 Jul 2006 Posts: 1702 Location: Australia
|
|
|
|
Hi,
1. obtain a list of the members of each PDS.
2. use the ALLDUP function to select duplicate member names.
3. SUM FIELDS=NONE will give you the name of the member that needs to concatenated to produce the new member.
4. Generate the JCL using 3 as input giving something like this
| Code: |
//IEBGENER EXEC PGM=IEBGENER
//SYSUT1 DD DSN=DSN1(MEMA),DISP=SHR
// DD DSN=DSN2(MEMA),DISP=SHR
//SYSUT2 DD DSN=DSN1(MEMA),DISP=SHR NEW DATASET
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
|
Gerry |
|
| Back to top |
|
 |
gcicchet
Senior Member
Joined: 28 Jul 2006 Posts: 1702 Location: Australia
|
|
|
|
Hi,
this might do the trick, the only issue I have, the SQZ is not yet supported with the current version of DFSORT on my system, so the member name with less than 8 bytes will generate with spaces
| Code: |
//**********************************************************************
//*
//STEP0001 EXEC PGM=IKJEFT01
//SYSTSPRT DD DSN=&&LISTDS,
// DISP=(,PASS,DELETE),
// SPACE=(TRK,(15,5),RLSE)
//SYSTSIN DD *
LISTDS 'CSCSGLC.PDS1' MEMBERS
LISTDS 'CSCSGLC.PDS2' MEMBERS
/*
//*
//**********************************************************************
//*
//STEP0002 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN DD DSN=&&LISTDS,
// DISP=(OLD,DELETE)
//T1 DD DSN=&&T1,DISP=(,PASS),SPACE=(CYL,(5,5),RLSE)
//OUT DD DSN=&&MEMNAMES,
// DISP=(,PASS,DELETE),
// SPACE=(TRK,(15,5),RLSE)
//OUT DD SYSOUT=*
//TOOLIN DD *
COPY FROM(IN) USING(CTL1)
SPLICE FROM(T1) TO(OUT) WITHALL ON(55,8,CH) WITH(45,10) USING(CTL2)
/*
//CTL1CNTL DD *
INREC IFTHEN=(WHEN=INIT,
OVERLAY=(138:SEQNUM,8,ZD,155:6,44)),
IFTHEN=(WHEN=(157,6,CH,EQ,C'LISTDS'),
OVERLAY=(138:SEQNUM,8,ZD)),
IFTHEN=(WHEN=NONE,
OVERLAY=(146:SEQNUM,8,ZD,
138:138,8,ZD,SUB,146,8,ZD,M11,LENGTH=8))
OUTREC IFTHEN=(WHEN=INIT,
BUILD=(1,4,155,44,138,8,SEQNUM,8,ZD,RESTART=(138,8)))
OUTFIL FNAMES=T1,VTOF,BUILD=(5,60,80:X)
/*
//CTL2CNTL DD *
SORT FIELDS=COPY
OMIT COND=(01,5,CH,EQ,C'READY',OR,
01,3,CH,EQ,C'END',OR,
53,8,ZD,EQ,1,OR,
(53,8,ZD,GT,2,AND,53,8,ZD,LT,8))
INREC IFTHEN=(WHEN=INIT,
BUILD=(01,44,55:45,16)),
IFTHEN=(WHEN=(63,8,ZD,NE,2),
BUILD=(44X,2,10,55,16))
OUTFIL FNAMES=OUT,BUILD=(01,54)
/*
//*
//**********************************************************************
//*
//STEP0003 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN DD DSN=&&MEMNAMES,
// DISP=(OLD,DELETE)
//ALLDUPS DD DSN=&&ALLDUPS,
// DISP=(,PASS,DELETE),
// SPACE=(TRK,(15,5),RLSE)
//NONDUP DD SYSOUT=*
//TOOLIN DD *
SELECT FROM(IN) TO(ALLDUPS) ON(46,8,CH) ALLDUPS DISCARD(NONDUP)
//*
//*
//**********************************************************************
//*
//STEP0004 EXEC PGM=SORT
//SORTIN DD DSN=&&ALLDUPS,
// DISP=(OLD,DELETE)
//SORTOUT DD DSN=&&FIRSTDUP,
// DISP=(,PASS,DELETE),
// SPACE=(TRK,(15,5),RLSE)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(46,8,BI,A)
SUM FIELDS=NONE
//*
//**********************************************************************
//*
//STEP0005 EXEC PGM=ICEMAN
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=&&FIRSTDUP,
// DISP=(OLD,DELETE)
//SORTOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
OUTFIL REMOVECC,
HEADER1=('//JOBNAME JOB GERRY,''MERGE '',',/,
'// CLASS=A, ',/,
'// MSGCLASS=X, ',/,
'// NOTIFY=&SYSUID ',/,
'//* '),
BUILD=(C'//MERGE EXEC PGM=IEBGENER ',/,
C'//SYSPRINT DD SYSOUT=* ',/,
C'//SYSIN DD DUMMY ',/,
C'//SYSUT1 DISP=SHR,DSN=PDS1(',46,8,38:C')',80:X,/,
C'// DISP=SHR,DSN=PDS2(',46,8,38:C')',80:X,/,
C'//SYSUT2 DISP=SHR,DSN=PDS3(',46,8,38:C')',80:X,/,
C'//*',80:X)
/* |
The SORTOUT in STEP0005 is the generated JCL, at the moment it's going to SYSOUT. Also depending on the number of matches, there maybe too many steps in the generated job.
The NONDUP DD in STEP0003 will give you the mismatches.
Specify the 2 PDS's in STEP0001
Gerry |
|
| Back to top |
|
 |
Frank Yaeger
DFSORT Developer

Joined: 15 Feb 2005 Posts: 7129 Location: San Jose, CA
|
|
|
|
| Quote: |
| SQZ is not yet supported with the current version of DFSORT on my system |
For the record, SQZ has been available with DFSORT since April, 2006. |
|
| Back to top |
|
 |
Skolusu
Senior Member
Joined: 07 Dec 2007 Posts: 2205 Location: San Jose
|
|
|
|
rkpyla,
Here is a simplified version of Getting the desired results.
| Code: |
//STEP0100 EXEC PGM=IKJEFT01
//SYSTSPRT DD DSN=&&L,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(15,5),RLSE),
// DCB=(LRECL=80,RECFM=FB,BLKSIZE=0)
//SYSTSIN DD *
LISTDS 'YOUR PDS1' MEMBERS
LISTDS 'YOUR PDS2' MEMBERS
/*
//STEP0200 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN DD DSN=&&L,DISP=SHR
//T1 DD DSN=&&T1,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//OUT1 DD SYSOUT=*
//OUT2 DD SYSOUT=*
//TOOLIN DD *
COPY FROM(IN) USING(CTL1)
SELECT FROM(T1) TO(OUT1) ON(1,10,CH) LASTDUP USING(CTL2)
//CTL1CNTL DD *
OMIT COND=(01,3,CH,EQ,C'END')
INREC IFTHEN=(WHEN=INIT,OVERLAY=(81:SEQNUM,8,ZD)),
IFTHEN=(WHEN=(1,5,CH,EQ,C'READY'),
OVERLAY=(81:SEQNUM,8,ZD)),
IFTHEN=(WHEN=NONE,
OVERLAY=(89:SEQNUM,8,ZD,
81:81,8,ZD,SUB,89,8,ZD,M11,LENGTH=8))
OUTREC IFTHEN=(WHEN=INIT,OVERLAY=(89:SEQNUM,8,ZD,RESTART=(81,8)))
OUTFIL FNAMES=T1,OMIT=(89,8,ZD,LE,9),IFOUTLEN=10,
IFTHEN=(WHEN=INIT,BUILD=(C'(',3,8,C')')),
IFTHEN=(WHEN=INIT,OVERLAY=(01:01,10,SQZ=(SHIFT=LEFT)))
/*
//CTL2CNTL DD *
OUTFIL FNAMES=OUT1,REMOVECC,ENDREC=250,
HEADER1=('//TIDXXXXA JOB ','''','COPY''',/,
'// CLASS=A,',/,
'// MSGCLASS=Y,',/,
'// MSGLEVEL=(1,1),',/,
'// NOTIFY=&SYSUID',/,
'//*'),
BUILD=(C'//STEP0',SEQNUM,3,ZD,C' EXEC PGM=IEBGENER ',/,
C'//SYSPRINT DD SYSOUT=* ',/,
C'//SYSIN DD DUMMY ',/,
C'//SYSUT1 DISP=SHR,DSN=PDS1',01,10,80:X,/,
C'// DISP=SHR,DSN=PDS2',01,10,80:X,/,
C'//SYSUT2 DISP=SHR,DSN=PDS3',01,10,80:X,/,
C'//*',80:X)
OUTFIL FNAMES=OUT2,REMOVECC,STARTREC=251,ENDREC=500,
HEADER1=('//TIDXXXXB JOB ','''','COPY''',/,
'// CLASS=A,',/,
'// MSGCLASS=Y,',/,
'// MSGLEVEL=(1,1),',/,
'// NOTIFY=&SYSUID',/,
'//*'),
BUILD=(C'//STEP0',SEQNUM,3,ZD,C' EXEC PGM=IEBGENER ',/,
C'//SYSPRINT DD SYSOUT=* ',/,
C'//SYSIN DD DUMMY ',/,
C'//SYSUT1 DISP=SHR,DSN=PDS1',01,10,80:X,/,
C'// DISP=SHR,DSN=PDS2',01,10,80:X,/,
C'//SYSUT2 DISP=SHR,DSN=PDS3',01,10,80:X,/,
C'//*',80:X)
/*
|
The job takes care of 500 matched duplicate member names. if you have more than that you can just code another OUTFIL statement in ctl2cntl.
Once you have verified that jcl created is correct, change the following statements
| Code: |
//OUT1 DD SYSOUT=*
//OUT2 DD SYSOUT=*
|
to
| Code: |
//OUT1 DD SYSOUT=(*,INTRDR)
//OUT2 DD SYSOUT=(*,INTRDR)
|
|
|
| Back to top |
|
 |
|
|
 |
All times are GMT + 6 Hours |
|