我定义了一个生成数据组(GDG),限制参数为5,让我们把(1,2,3,4,5)作为成员(假设5是当前位置)。
我使用的工作有2个步骤,每个步骤都会尝试使用IEFBR14实用程序删除成员。
//STEP10 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=*
//SYSDEL DD DSN=DATA.TEST.GDG(-1),
// DISP=(MOD,DELETE,DELETE)
//****************************************
//STEP20 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=*
//SYSDEL DD DSN=DATA.TEST.GDG(-2),
// DISP=(MOD,DELETE,DELETE)
我希望我能得到结果为(1,2,5),但事实上(1,3,5)还剩下,会员2和成员4被删除了?在步骤1之后,似乎有一个提交操作,任何人都可以帮我这个吗?
但另一方面,如果我尝试删除member(0)和member(-2),结果就像我预期的那样。
//STEP10 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=*
//SYSDEL DD DSN=DATA.TEST.GDG(0),
// DISP=(MOD,DELETE,DELETE)
//****************************************
//STEP20 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=*
//SYSDEL DD DSN=DATA.TEST.GDG(-2),
// DISP=(MOD,DELETE,DELETE)
我得到结果(1,2,4),成员3和成员5被删除。
答案 0 :(得分:2)
JOB1删除成员2和4.以下是它的工作原理。
enter code here
//STEP1 EXEC PGM=IEFBR14
//DD1 DD DSN=DATA.GDG.TEST(-1),DISP=(MOD,DELETE,DELETE)
//*
//STEP2 EXEC PGM=SORT <==note:i added this step for TEST purpose only
//SORTIN DD DSN=DATA.GDG.TEST(-1),DISP=SHR
//SORTOUT DD DUMMY
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
/*
//STEP3 EXEC PGM=IEFBR14
//DD2 DD DSN=DATA.GDG.TEST(-2),DISP=(MOD,DELETE,DELETE)
如果我们看一下JESYMSG,我们可以找到如下消息:
IEF142I GDGTST STEP1 - STEP WAS EXECUTED - COND CODE 0000
IGD105I DATA.GDG.TEST.G0004V00 DELETED, DDNAME=DD1 <==(-1) to 5
**please note here in STEP2 the GDG member refered is 03 not 04 as expected**
IEF142I GDGTST STEP2 - STEP WAS EXECUTED - COND CODE 0000
IGD104I DATA.GDG.TEST.G0003V00 RETAINED, DDNAME=SORTIN <==(-1) to 4
IEF142I GDGTST STEP3 - STEP WAS EXECUTED - COND CODE 0000
IGD105I DATA.GDG.TEST.G0002V00 DELETED, DDNAME=DD2 <==(-2) to 4
首次在作业中使用生成数据组的相对世代号时,系统会建立相对世代号与绝对世代号之间的关系。系统在整个工作中保持这种关系。(参考:z / OS MVS JCL用户指南 - 附录B)
例如,如果您创建一个相对世代号为(+1)的世代数据集,系统会将整个作业中对(+ 1)的任何后续引用识别为具有相同的绝对世代数。
(+ 3) - &GT; (+1)到(+2)
同样,在你发布的JOB1中,引用被设置为(-1),即作业开始时的G0004V00。在整个作业中保持这种(-1)关系。在我的工作中,STEP2的结果证明了这一点。
因此,为了在JOB1的两个步骤(STEP10和STEP20)中得到结果(1,3,5),给出(-1)。那可行。 以上结果适用于JES2,不确定JES3
和主要问题中的JOB2:
//STEP1 EXEC PGM=IEFBR14
//DD1 DD DSN=DATA.GDG.TEST(0),DISP=(MOD,DELETE,DELETE)
//SYSOUT DD SYSOUT=*
//STEP2 EXEC PGM=SORT
//SORTIN DD DSN=DATA.GDG.TEST(-1),DISP=SHR
//SORTOUT DD DUMMY
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
/*
//STEP3 EXEC PGM=IEFBR14
//DD2 DD DSN=DATA.GDG.TEST(-2),DISP=(MOD,DELETE)
//SYSOUT DD SYSOUT=*
//STEP4 EXEC PGM=IEFBR14
//MODEL1 DD DSN=DATA.GDG.TEST(-1),DISP=(MOD,DELETE)
JESYMSG如下:
IEF142I GDGTST STEP1 - STEP WAS EXECUTED - COND CODE 0000
IGD105I DATA.GDG.TEST.G0005V00 DELETED, DDNAME=DD1
IEF142I GDGTST STEP2 - STEP WAS EXECUTED - COND CODE 0000
IGD104I DATA.GDG.TEST.G0004V00 RETAINED, DDNAME=SORTIN
IEF142I GDGTST STEP3 - STEP WAS EXECUTED - COND CODE 0000
IGD105I DATA.GDG.TEST.G0003V00 DELETED, DDNAME=DD2
IEF142I GDGTST STEP4 - STEP WAS EXECUTED - COND CODE 0000
IGD105I DATA.GDG.TEST.G0004V00 DELETED, DDNAME=MODEL1
正如我之前解释的那样,绝对和相对GDG之间的关系是在作业第一次遇到RELATIVE引用时建立的。所以在这个工作中,它第一次遇到(0)。因此,当发起者在每一步发出ENQ时,将参考JOB2中的(0)来解析世代号。 如果我们在这里观察它删除(0,3,4) - &gt;对于步骤1,步骤3,步骤4中的(0),( - 2),( - 1)。这意味着,在执行每个步骤后它没有提交。在步骤4中参考(-1)与(0)有关,该步骤在步骤1中建立。
让我们再考虑以下一个例子:如果我在上面的工作中添加一个更多步骤的STEP5
//STEP1 EXEC PGM=IEFBR14
//DD1 DD DSN=DATA.GDG.TEST(-0),DISP=(MOD,DELETE,DELETE)
//SYSOUT DD SYSOUT=*
//STEP2 EXEC PGM=SORT
//SORTIN DD DSN=DATA.GDG.TEST(-1),DISP=SHR
//SORTOUT DD DUMMY
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
/*
//STEP3 EXEC PGM=IEFBR14
//DD2 DD DSN=DATA.GDG.TEST(-2),DISP=(MOD,DELETE,DELETE)
//SYSOUT DD SYSOUT=*
//STEP4 EXEC PGM=IEFBR14
//MODEL1 DD DSN=DATA.GDG.TEST(-2),DISP=(MOD,DELETE)
//STEP5 EXEC PGM=IEFBR14
//DD2 DD DSN=DATA.GDG.TEST(-1),DISP=(MOD,DELETE,DELETE)
//STEP6 EXEC PGM=IEFBR14
//DD2 DD DSN=DATA.GDG.TEST(-2),DISP=(MOD,DELETE,DELETE)
删除(0,3,2,4) - &gt;因为在STEP4的开始它遇到了歧义,所以它解决了对catologue的引用。对于STEP6,它又有歧义,所以它再次尝试根据catologue解析引用,现在因为没有足够的生成成员(因为我们只创建了5个成员并且已经删除了4个成员),它会抛出如下消息:
IEF286I GDGTST STEP6 DD2 - DISP FIELD INCOMPATIBLE WITH DSNAME
IEF272I GDGTST STEP6 - STEP WAS NOT EXECUTED.