On Tue, 11 Nov 2008 08:22:40 +0100, Hunkeler Peter (KIUK 3) 
<[EMAIL PROTECTED]> wrote:
>Try this:
>
>//IGYWC  PROC  LNGPRFX='IGY.V3R3M0',SYSLBLK=3200
>//COBOL  EXEC PGM=IGYCRCTL,REGION=2048K
>//STEPLIB  DD  DSNAME=&LNGPRFX..SIGYCOMP,
>//             DISP=SHR
>//*
>//SYSLIB    DD DDNAME=OWNSYSLB
>//          DD DISP=SHR,DSN=APPL.PROD.COPYLIB
>//*
>//OWNSYSLB  DD DISP=(NEW,KEEP),DSN=&&amp;OWNSYSLB,
>//          SPACE=(TRK,(1,,1)),RECFM=U,LRECL=32760
>//*
>...
>...
>
>
>If you don't need any personal SYSLIB library, code:
>
>//S1     EXEC IGYWC....
>//*
>//COBOL.SYSIN DD *
> your cobol code goes here....
>/*
>
>and the compiler will only see APPL.PROD.COPYLIB
>
>If you need one private library ahead of the APPL-lib,
>code:
>
>//S1     EXEC IGYWC....
>//*
>//OWNSYSLB DD DISP=SHR,DSN=your.own.private.copy.lib1
>//*
>//COBOL.SYSIN DD *
> your cobol code goes here....
>/*
>
>and the compiler will see your private library ahead of
>the APPL.PROD.COPYLIB library.
>
>If you need more than one private library, three in this
>example, code:
>
>//S1     EXEC IGYWC....
>//*
>//OWNSYSLB DD DISP=SHR,DSN=your.own.private.copy.lib1
>//         DD DISP=SHR,DSN=your.own.private.copy.lib2
>//         DD DISP=SHR,DSN=your.own.private.copy.lib3
>//*
>//COBOL.SYSIN DD *
> your cobol code goes here....
>/*
>
>and the compiler will see all the three private libraries
>ahead of the APPL.PROD.COPYLIB library.

This seems to be a great idea.  Such a great idea that I had already tried it.  
But it does not work as you might expect!

"Location of DD Statements for Concatenated Data Sets:
To concatenate data sets to a data set defined with a DDNAME parameter, 
the unnamed DD statements must follow the DD statement that contains the 
DDNAME parameter, not the referenced DD statement that defines the data 
set."

"References to Concatenated Data Sets:
If you make a forward reference to a concatenation, the forward 
reference resolves to the first data set in the concatenation. If there 
are no DD statements between the forward reference and the 
concatenation, the rest of the data sets in the concatenation are 
appended to the first data set in the concatenation."

Basically, this appears to say that only the named DD in the override is used 
to replace the the DD where the DDNAME is specified.  Take the following 
example:

(proc)
//COBOL     PROC COBOPT=                                 
//COB       EXEC PGM=IGYCRCTL,REGION=4096K,PARM='&COBOPT'
//SYSIN     DD DISP=SHR,DSN=FJS.PDSE.COBOL(&MEMBER)      
//SYSPRINT  DD SYSOUT=*                                  
//          INCLUDE MEMBER=COBWORK                       
//SYSLIN    DD DSN=&&amp;OBJECT,DISP=(NEW,PASS,DELETE),      
//          SPACE=(400,(100,50))                         
//DUMBDD    DD                                           
//SYSLIB    DD DDNAME=SYSLIBC                            
//          DD DISP=SHR,DSN=APPL.PROD.COPYLIB            
//SYSLIBC   DD DISP=SHR,DSN=FJS.DUMMY.COBOL              
//          PEND                                         

(job)
//COBOBJ    JOB CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID,COND=(4,LT)
//          SET MEMBER=OBJ1               
//STEP01    EXEC COBOL                    
//SYSLIBC   DD DISP=SHR,DSN=FJS.PDSE.COBOL
//          DD DISP=SHR,DSN=FJS.TEST.COBOL

This actually *almost* works.  But it is only coincidence, and even then it 
still 
doesn't do what I require.
Take a look at this from JESYSMSG:

IGD106I SYS08317.T170101.RA000.COBOBJ.OBJECT.H01     PASSED,    
DDNAME=SYSLIN
IGD104I FJS.PDSE.COBOL                               RETAINED,  DDNAME=SYSLIB
IGD104I APPL.PROD.COPYLIB                            RETAINED,  DDNAME=      
IGD104I FJS.TEST.COBOL                               RETAINED,  DDNAME=      

What happened here is that FJS.PDSE.COBOL, which is the DSN in the DD 
override named SYSLIBC replaces the one in the proc (FJS.DUMMY.COBOL).  
The unnamed one (FJS.TEST.COBOL) is not inserted between this one and the 
unnamed one in the proc (APPL.PROD.COPYLIB).  Rather, it is appended to the 
end.

And the only reason *that* even happens is because SYSLIB is the last DD 
that is not a DD specified in DDNAME.  Or something like that.  Specifically, 
look what happens when I insert "//DUMBDD DD" between SYSLIB and SYSLIBC 
in the proc:

IGD106I SYS08317.T170324.RA000.COBOBJ.OBJECT.H01     PASSED,    
DDNAME=SYSLIN
IGD104I FJS.PDSE.COBOL                               RETAINED,  DDNAME=SYSLIB
IGD104I APPL.PROD.COPYLIB                            RETAINED,  DDNAME=      
IGD105I SYS08317.T170324.RA000.COBOBJ.R0100136       DELETED,   
DDNAME=DUMBDD
IGD104I FJS.TEST.COBOL                               RETAINED,  DDNAME=      

This shows you that the unnamed DD in the job gets concatenated to, in this 
case, DUMBDD.

Honestly I have a hard time imagining anyone actually wanting this to work 
this way.  I can see wanting both concatenating to the end or concatenating 
to the front of specific DD's, but to just do it to the end of one just because 
it's the last one; Yikes!
Had I not both read and tested this I never would have believed it!

It does, by the way, give you a warning that this occured:
"25 IEF694I DDNAME REFERENCE TO DD CONCATENATION REFERS ONLY TO 
FIRST DD".

Frank

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [EMAIL PROTECTED] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html

Reply via email to