Jcl 简明教程

JCL - Basic Sort Tricks

下面说明了企业环境中可以使用实用程序实现的日常应用程序要求:

1. A file has 100 records. The first 10 records need to be written to output file.

//JSTEP020 EXEC PGM=ICETOOL
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//IN1      DD DSN=MYDATA.URMI.STOPAFT,DISP=SHR
//OUT1	   DD SYSOUT=*
//TOOLIN   DD *
  COPY FROM(IN1) TO(OUT1) USING(CTL1)
/*
//CTL1CNTL DD *
  OPTION STOPAFT=10
/*

STOPAFT 选项将在读取完第 10 条记录后停止读取输入文件并终止程序。因此,10 条记录将被写入输出。

2. Input file has one or more records for same employee number. Write unique records to output.

//STEP010  EXEC PGM=SORT
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=MYDATA.URMI.DUPIN,DISP=SHR
//SORTOUT  DD SYSOUT=*
//SYSIN    DD *
  SORT FIELDS=(1,15,ZD,A)
  SUM FIELDS=NONE
/*

SUM FIELDS=NONE 会删除 SORT FIELDS 中指定字段中的重复内容。在上述示例中,员工编号在字段位置 1,15。输出文件将包含以升序排序的唯一员工编号。

3. Overwrite input record content.

//JSTEP010 EXEC PGM=SORT
//SORTIN   DD DSN= MYDATA.URMI.SAMPLE.MAIN,DISP=SHR
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
 OPTION COPY
  INREC OVERLAY=(47:1,6)
/*

在输入文件中,位置 1,6 中的内容被覆盖到位置 47,6,然后复制到输出文件中。INREC OVERLAY 操作用于在复制到输出之前重新写入输入文件中的数据。

4. Adding a sequence number to the output file.

//JSTEP010 EXEC PGM=SORT
//SORTIN   DD *
  data1
  data2
  data3
/*
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
 OPTION COPY
 BUILD=(1:1,5,10:SEQNUM,4,ZD,START=1000,INCR=2)
/*

输出将为:

data1    1000
data2    1002
data3    1004

4 位序列号从 1000 开始并针对每条记录增加 2,添加到输出中的位置 10。

5. Adding Header/Trailer to output file.

//JSTEP010 EXEC PGM=SORT
//SORTIN   DD *
  data1
  data2
  data3
/*
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
 SORT FIELDS=COPY
  OUTFIL REMOVECC,
  HEADER1=(1:C'HDR',10:X'020110131C'),
  TRAILER1=(1:C'TRL',TOT=(10,9,PD,TO=PD,LENGTH=9))
/*

输出将为:

HDR       20110131
data1
data2
data3
TRL       000000003

TOT 计算输入文件中的记录数。HDR 和 TRL 作为标识符添加到页眉/尾部,它是由用户定义的,并且可以根据用户的需要进行自定义。

6. Conditional Processing

//JSTEP010 EXEC PGM=SORT
//SORTIN   DD *
  data1select
  data2
  data3select
/*
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
  INREC  IFTHEN=(WHEN=(6,1,CH,NE,C' '),BUILD=(1:1,15),
         IFTHEN=(WHEN=(6,1,CH,EQ,C' '),BUILD=(1:1,5,7:C'EMPTY    ')
  OPTION COPY
/*

输出将为:

data1select
data2 EMPTY
data3select

基于文件的第 6 个位置,输出文件 BUILD 会有所不同。如果第 6 个位置为空格,那么文本“EMPTY”将附加到输入记录。否则,输入记录将按原样写入输出。

7. Backing up a file

//JSTEP001 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
//SYSOUT   DD SYSOUT=*
//SORTOUT  DD DUMMY
//SYSUT1   DD DSN=MYDATA.URMI.ORIG,DISP=SHR
//SYSUT2   DD DSN=MYDATA.URMI.BACKUP,DISP=(NEW,CATLG,DELETE),
//             DCB=*.SYSUT1,SPACE=(CYL,(50,1),RLSE)

IEBGENER 将 SYSUT1 中的文件复制到 SYSUT2 中的文件。请注意,SYSUT2 中的文件采用的 DCB 与上述示例中的 SYSUT1 相同。

8. File Comparison

//STEP010  EXEC PGM=SORT
//MAIN     DD *
  1000
  1001
  1003
  1005
//LOOKUP   DD *
  1000
  1002
  1003
//MATCH    DD DSN=MYDATA.URMI.SAMPLE.MATCH,DISP=OLD
//NOMATCH1 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH1,DISP=OLD
//NOMATCH2 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH2,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
  JOINKEYS F1=MAIN,FIELDS=(1,4,A)
  JOINKEYS F2=LOOKUP,FIELDS=(1,4,A)
  JOIN UNPAIRED,F1,F2
  REFORMAT FIELDS=(?,F1:1,4,F2:1,4)
  OPTION COPY
  OUTFIL FNAMES=MATCH,INCLUDE=(1,1,CH,EQ,C'B'),BUILD=(1:2,4)
  OUTFIL FNAMES=NOMATCH1,INCLUDE=(1,1,CH,EQ,C'1'),BUILD=(1:2,4)
  OUTFIL FNAMES=NOMATCH2,INCLUDE=(1,1,CH,EQ,C'2'),BUILD=(1:2,4)
/*
  1. JOINKEYS 指定在该字段上比较两个文件。

  2. REFORMAT FIELDS=? 在输出 BUILD 的第一位放入“B”(匹配记录)、“1”(文件 1 中存在但文件 2 中不存在)或“2”(文件 2 中存在但文件 1 中不存在)。

  3. JOIN UNPAIRED 在两个文件上执行全外部连接。

输出将为:

MATCH File
1000
1003

NOMATCH1 File
1001
1005

NOMATCH2 File
1002

使用 ICETOOL 也可以实现相同的功能。