有两种技术,JOINKEYS技术在短时间内更容易解释。
您将 JOINKEYS 与您的数据集名称一起用于两个输入文件。
您为两个输入定义 JNFnCNTL 数据集,并在每个输入中为每个记录附加一个序列号。一个(JNFCNTL1)序列号从零开始,另一个(JNFCNTL2)从一开始。序列号需要足够大,才能表达您的记录数。
您在文件上创建序列号的 JOINKEYS 键。
使用 JOIN UNPAIRED,F2(这将使您匹配,而在 F2 上不匹配)。
F1:1,3:F2:1,80 的重构
OMIT with COND= 用于主要任务,您可以删除 1,3 是 HDR 并且 1,3 匹配 4,3 的记录(之前的记录是标题)。
然后在主任务中BUILD=(4,80),去掉上一条记录的前三个字节。
在输入上,您的数据将如下所示,偏移以表示序列号:
F1 F2
HDR20170123
HDR20170124 HDR20170123
1.8988 ABCD HDR20170124
1.4324 PARE 1.8988 ABCD
HDR20170125 1.4324 PARE
1.5432 URST HDR20170125
1.5432 URST
关于改革:
HDR
HDRHDR20170123
1.8HDR20170124
1.41.8988 ABCD
HDR1.4324 PARE
1.5HDR20170125
1.5432 URST
您所取得的成果是在您拥有当前记录的同时,前一个记录中的数据(前三个字节,对于给定案例所需的数量)的数据可用性,因此测试前一个记录的值很容易。
现在是时候写一些代码了:
//SYSIN DD *
OPTION COPY
JOINKEYS F1=INA,FIELDS=(81,6,A),SORTED,NOSEQCK
JOINKEYS F2=INB,FIELDS=(81,6,A),SORTED,NOSEQCK
JOIN UNPAIRED,F2
REFORMAT FIELDS=(F1:1,3,
F2:1,80)
OMIT COND=(1,3,CH,EQ,C'HDR',
AND,
1,3,CH,EQ,4,3,CH)
INREC BUILD=(4,80)
//JNF1CNTL DD *
INREC OVERLAY=(81:SEQNUM,6,ZD,
START=0)
//JNF2CNTL DD *
INREC OVERLAY=(81:SEQNUM,6,ZD,
START=1)
//INA DD *
HDR20170123
HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST
//INB DD *
HDR20170123
HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST
这会产生您想要的输出:
HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST
一个 JOINKEYS 操作将包含三个同时操作的“任务”。 “主要任务”是一个完全正常的 SORT 步骤,由您想要的任何内容组成。
有两个子任务,每个输入数据集一个。这些子任务中的每一个都可以提供进一步的控制卡来修改其数据。这些是在 JNFnCNTL DD 上指定的。 JNF1CNTL 和 JNF2CNTL。根据实际要求,您可以不提供,也可以提供其中之一,或两者都提供。在这里你想要两个。
JNFnCNTL 数据集必须只包含正常控制卡的子集。它们可能不包含 OUTREC 或 OUTFIL。这是因为它们在 OUTREC 可能存在的地方与 Main Task 进行互操作。
在 JOINKEYS 语句中,指定 SORTED,NOSEQCK。这是因为,默认情况下,JOINKEYS 数据集是排序的(在匹配的键上),并且顺序已经保证(并且不需要检查),因为键的顺序是序列号。
REFORMAT 语句应仅包含主任务中所需的数据。这里只需要 HDR 可能存在的位置,以及 F2 的完整记录。
JOIN UNPAIRED,F2会获取所有匹配的记录,以及所有不匹配的F2(只有一条,最后一条记录,因为匹配在序号上,偏移1)。
要了解这一点(或进一步的任何 DSFORT 数据操作),请进行修改以显示中间阶段的数据。这里只有一个阶段,所以很简单:
//SYSIN DD *
OPTION COPY
JOINKEYS F1=INA,FIELDS=(81,6,A),SORTED,NOSEQCK
JOINKEYS F2=INB,FIELDS=(81,6,A),SORTED,NOSEQCK
JOIN UNPAIRED,F2
REFORMAT FIELDS=(F1:1,12,81,6,12,1,
F2:1,12,81,6,12,1,
?)
//JNF1CNTL DD *
INREC OVERLAY=(81:SEQNUM,6,ZD,
START=0)
//JNF2CNTL DD *
INREC OVERLAY=(81:SEQNUM,6,ZD,
START=1)
//INA DD *
HDR20170123
HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST
//INB DD *
HDR20170123
HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST
产生这个输出:
HDR20170124 000001 HDR20170123 000001 B
1.8988 ABCD 000002 HDR20170124 000002 B
1.4324 PARE 000003 1.8988 ABCD 000003 B
HDR20170125 000004 1.4324 PARE 000004 B
1.5432 URST 000005 HDR20170125 000005 B
1.5432 URST 000006 2
由于您在 80 字节数据中只显示 11 个字节的数据,因此在此 REFORMAT 语句中,前 12 个位置被占用(第 12 个留空)并且 12,1 也用作分隔符(文字不能在 REFORMAT 中使用)。还显示了相应的序列号,以及 REFORMAT 中的内置匹配标记(?(问号):B 表示两个文件,2 表示仅在 F2 上(没有显示 1,因为 JOIN 语句只要求匹配和不匹配 F2)。