0

我定义了一个生成数据组(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 步之后,有一个提交操作,有人可以帮我吗?

但另一方面,如果我尝试删除成员 (0) 和成员 (-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 被删除。

4

1 回答 1

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)--> 向最近添加的成员添加一个成员(即(0))
  • (+2)-->(+1) 到 (+1)
  • (+3)--> (+1) 到 (+2)

    同样,在您发布的 JOB1 中,参考设置为 (-1),即在作业开始时 G0004V00。这种 (-1) 关系在整个工作中保持不变。我所写的工作中STEP2的结果证明了这一点。

所以要在 JOB1 的两个步骤(STEP10 和 STEP20)中给出(-1)的结果(1,3,5)。那可行。 以上结果适用于 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)。所以当initiator在每一步发出ENQ时,都会参考JOB2中的(0)来解析生成号。如果我们在这里观察,它在 STEP1、STEP3、STEP4 中删除了(0,3,4)--> for(0),(-2),(-1)。这意味着,它在每一步执行后都没有提交。STEP4 中对 (-1) 的引用根据 STEP1 中建立的 (0) 进行解析。

让我们再考虑一个例子,如下所示:如果我在上面的工作中再添加一个如下所示的步骤 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)--> 因为在 STEP4 开始时它遇到了歧义,所以它解决了对目录的引用。对于 STEP6,它再次有歧义,所以它再次尝试根据目录解析引用,现在由于没有足够的生成成员存在(因为我们只创建了 5 个成员并删除了 4 个),它抛出如下消息:

IEF286I GDGTST STEP6 DD2 - DISP FIELD INCOMPATIBLE WITH DSNAME
IEF272I GDGTST STEP6 - STEP WAS NOT EXECUTED.
于 2013-10-17T14:20:34.440 回答