SELECT 运算符
SELECT operator
//ICETSIM1 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYMNOUT DD SYSOUT=*
//NAMESIN DD *
LINK_REC;1,45
LINK_REFDATE;=,8,CH
LINK;*,16,CH
LINK_COLL;*,16,CH
LINK_TYPE;*,3,CH
LINK_LABEL;*,02,CH
LINK_P_LABEL;=,1,CH
LINK_S_LABEL;*,1,CH
//NAMESOUT DD DSN=&NAMES,DISP=(,PASS,DELETE),SPACE=(TRK,1)
//TOOLIN DD *
COPY FROM(NAMESIN) TO(NAMESOUT)
//S01 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYMNAMES DD DSN=&NAMES,DISP=(OLD,PASS)
//SYMNOUT DD SYSOUT=*
//IN2 DD DISP=SHR,DSN=LINKS.001
SELECT FROM(IN2) TO(OU2) ON(LINK) FIRST USING(CTL2)
//CTL2CNTL DD *
OUTFIL FNAMES=OU2,
OUTREC=(LINK_REFDATE,16X,LINK,500X,LINK_TYPE,C'22')
此 ICETOOL 选择 LINKS.001 中每个 LINK 值的第一条记录。问题是:SELECT 运算符是否期望对输入进行排序?如果是,则必须在 all LINKS.001 (REF_DATE, LINK, LINK_COLL 的字段上排序。 ..)?
我是 SORT symbols/SYMNAMES 的忠实粉丝,很高兴看到您以相当先进的方式使用它。您只需为您的记录指定一个起始位置,并将其他所有内容与前一个字段相关联,这是最灵活的方式。
没想到可以用分号,所以改成了逗号。不能有空行(可以有注释,*在第一栏,其余行留空。
我不知道你为什么要迈出第一步,所以在你解释之前我就放弃了。使用 SYMNAMES DD 的最佳方法是使用 DSN=,然后使用带有成员名称的 PDS/PDSE,然后将您的卡片放入成员中。为了解释,我使用 DD *.
在您的 USING 文件中,您有 SORT 控制卡,这是正确的,但它们的第一列必须有一个空白。
OUTFIL 上的 OUTREC 已过时,可用于向后兼容,因此我将其更改为 BUILD(这是 OUTFIL 上的 OUTREC 的同义词,以及 INREC 和 OUTREC 上的 FIELDS 的同义词 - 看看它有多少混淆坚持只构建?)。
默认情况下,ICETOOL 的 SELECT 运算符按照指定的顺序对您指定的每个 ON 字段上的数据进行排序。如果您的数据已经在正确的序列中,您可以使用 USING(无论如何您已经拥有)并在那里指定 SORT FIELDS=COPY
或 OPTION COPY
。您的数据将不会被重新排序。
//S01 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYMNAMES DD *
LINK_REC,1,45
LINK_REFDATE,=,8,CH
LINK,*,16,CH
LINK_COLL,*,16,CH
LINK_TYPE,*,3,CH
LINK_LABEL,*,02,CH
LINK_P_LABEL,=,1,CH
LINK_S_LABEL,*,1,CH
//SYMNOUT DD SYSOUT=*
//IN2 DD *
1111111111111111111
1111111111111111111
2222222222222222222
//OU2 DD SYSOUT=*
//TOOLIN DD *
SELECT FROM(IN2) TO(OU2) ON(LINK) FIRST USING(CTL2)
//CTL2CNTL DD *
SORT FIELDS=COPY
OUTFIL FNAMES=OU2,
BUILD=(LINK_REFDATE,
16X,
LINK,
500X,
LINK_TYPE,
C'22')
以上,加上我简单的测试数据,产生了你想要的结果。我修复了其他几个拼写错误(例如,没有 OU2 DD)运行。
//ICETSIM1 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYMNOUT DD SYSOUT=*
//NAMESIN DD *
LINK_REC;1,45
LINK_REFDATE;=,8,CH
LINK;*,16,CH
LINK_COLL;*,16,CH
LINK_TYPE;*,3,CH
LINK_LABEL;*,02,CH
LINK_P_LABEL;=,1,CH
LINK_S_LABEL;*,1,CH
//NAMESOUT DD DSN=&NAMES,DISP=(,PASS,DELETE),SPACE=(TRK,1)
//TOOLIN DD *
COPY FROM(NAMESIN) TO(NAMESOUT)
//S01 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYMNAMES DD DSN=&NAMES,DISP=(OLD,PASS)
//SYMNOUT DD SYSOUT=*
//IN2 DD DISP=SHR,DSN=LINKS.001
SELECT FROM(IN2) TO(OU2) ON(LINK) FIRST USING(CTL2)
//CTL2CNTL DD *
OUTFIL FNAMES=OU2,
OUTREC=(LINK_REFDATE,16X,LINK,500X,LINK_TYPE,C'22')
此 ICETOOL 选择 LINKS.001 中每个 LINK 值的第一条记录。问题是:SELECT 运算符是否期望对输入进行排序?如果是,则必须在 all LINKS.001 (REF_DATE, LINK, LINK_COLL 的字段上排序。 ..)?
我是 SORT symbols/SYMNAMES 的忠实粉丝,很高兴看到您以相当先进的方式使用它。您只需为您的记录指定一个起始位置,并将其他所有内容与前一个字段相关联,这是最灵活的方式。
没想到可以用分号,所以改成了逗号。不能有空行(可以有注释,*在第一栏,其余行留空。
我不知道你为什么要迈出第一步,所以在你解释之前我就放弃了。使用 SYMNAMES DD 的最佳方法是使用 DSN=,然后使用带有成员名称的 PDS/PDSE,然后将您的卡片放入成员中。为了解释,我使用 DD *.
在您的 USING 文件中,您有 SORT 控制卡,这是正确的,但它们的第一列必须有一个空白。
OUTFIL 上的 OUTREC 已过时,可用于向后兼容,因此我将其更改为 BUILD(这是 OUTFIL 上的 OUTREC 的同义词,以及 INREC 和 OUTREC 上的 FIELDS 的同义词 - 看看它有多少混淆坚持只构建?)。
默认情况下,ICETOOL 的 SELECT 运算符按照指定的顺序对您指定的每个 ON 字段上的数据进行排序。如果您的数据已经在正确的序列中,您可以使用 USING(无论如何您已经拥有)并在那里指定 SORT FIELDS=COPY
或 OPTION COPY
。您的数据将不会被重新排序。
//S01 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYMNAMES DD *
LINK_REC,1,45
LINK_REFDATE,=,8,CH
LINK,*,16,CH
LINK_COLL,*,16,CH
LINK_TYPE,*,3,CH
LINK_LABEL,*,02,CH
LINK_P_LABEL,=,1,CH
LINK_S_LABEL,*,1,CH
//SYMNOUT DD SYSOUT=*
//IN2 DD *
1111111111111111111
1111111111111111111
2222222222222222222
//OU2 DD SYSOUT=*
//TOOLIN DD *
SELECT FROM(IN2) TO(OU2) ON(LINK) FIRST USING(CTL2)
//CTL2CNTL DD *
SORT FIELDS=COPY
OUTFIL FNAMES=OU2,
BUILD=(LINK_REFDATE,
16X,
LINK,
500X,
LINK_TYPE,
C'22')
以上,加上我简单的测试数据,产生了你想要的结果。我修复了其他几个拼写错误(例如,没有 OU2 DD)运行。