【问题标题】:SELECT operator选择运算符
【发布时间】:2015-06-16 08:33:59
【问题描述】:
//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...)的所有字段排序?

【问题讨论】:

  • 从模拟器粘贴时需要注意大小写。您没有 NAMESOUT DD 或 OU2 DD。您的 OUTFIL 和 OUTREC 从第 1 列开始。要回答您的问题,请查看步骤中的 sysout。您将看到生成了所需的 SORT 语句。您的数据在该单个字段上是否已经有序?
  • 更正了错字。顺便说一句,我的数据在进入 IN2 时已经(按其所有字段)进行了排序。

标签: mainframe dfsort


【解决方案1】:

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

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

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

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

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

默认情况下,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)以使其运行。

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 2018-02-21
    • 2011-12-10
    • 2023-03-18
    • 2016-04-19
    • 2014-03-12
    • 1970-01-01
    • 2021-10-19
    • 2021-03-27
    相关资源
    最近更新 更多