1
//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 运算符是否期望输入被排序?如果是,它必须按 LINKS.001 的所有字段排序(REF_DATE、LINK、LINK_COLL...)?

4

1 回答 1

1

我是 SORT 符号/SYMNAMES 的忠实粉丝,很高兴看到您使用它,并且以一种相当先进的方式。您只需为记录指定一个起始位置,并将其他所有内容与前一个字段相关联,这是最灵活的方法。

我没有意识到可以使用分号,所以我把它改成了逗号。您不能有空行(您可以在第一列中添加注释、*,并将该行的其余部分留空。

我不知道你为什么要迈出第一步,所以在你解释之前我已经放弃了。使用 SYMNAMES DD 的最佳方式是使用 DSN=,然后使用带有成员名称的 PDS/PDSE,然后将您的卡放入成员中。为了解释,我使用 DD *.

在您的 USING 文件中,您有 SORT 控制卡,这是正确的,但它们必须在第一列中有一个空白。

OUTFIL 上的 OUTREC 已过时,可用于向后兼容,因此我将其更改为 BUILD(这是 OUTFIL 上的 OUTREC 和 INREC 和 OUTREC 上的 FIELDS 的同义词 - 看看坚持只使用 BUILD 会减少多少混乱? )。

默认情况下,ICETOOL 的 SELECT 运算符按指定的顺序对您指定的每个 ON 字段上的数据进行排序。如果您的数据已经按正确的顺序排列,则使用 USING(无论如何您已经拥有)并在此处指定SORT FIELDS=COPYOPTION 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)以使其运行。

于 2015-06-18T15:15:43.423 回答