如何在不同的步骤中删除2个GDG成员

时间:2013-10-14 06:53:46

标签: mainframe jcl

我定义了一个生成数据组(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被删除。

1 个答案:

答案 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)的任何后续引用识别为具有相同的绝对世代数。

  • (+ 1) - &GT;向最近添加的成员添加成员raltive(即,(0))
  • (+ 2) - &gt;(+ 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.