使用joinkeys对不匹配的记录进行排序

时间:2017-04-24 17:51:33

标签: jcl dfsort

我有两个GDG文件(-1和0版本)。使用这两个文件需要生成一个平面文件,该文件将具有插入记录(记录不是-1版本但是在+0版本中),删除记录(记录在-1版本但不在+0版本中) )和更新记录(两个版本中的记录,但+0版本可能在某些字段中有更改)。我如何获得这些更新记录?我可以使用Joinkeys来做,如果有,怎么做?

注意:更新可以是从第1列到文件最后一列的任何位置(GDG的+0版本)

1 个答案:

答案 0 :(得分:5)

这是一个简单的JOINKEYS:

  OPTION COPY 
  JOINKEYS F1=INA,FIELDS=(4,80),SORTED,NOSEQCK 
  JOINKEYS F2=INB,FIELDS=(4,80),SORTED,NOSEQCK 
  JOIN UNPAIRED 
  REFORMAT FIELDS=(F1:1,227,F2:1,227,?) 

OPTION COPY用于主任务,即生成连接文件后运行的位。 SORT FIELDS=COPY相当于OPTION COPY。

假设您的数据已经按关键顺序排列。如果没有,请删除SORTED,NOSEQCK,但请记住,您可能会因为相等的键而不是相同于插入和删除的文件中的相同位置而获得“虚假”匹配。

JOIN UPAIRED为您提供匹配和两种类型的不匹配。 JOIN UNPAIRED,F1,F2是等效的。

REFORMAT语句定义已加入文件的记录。你想要来自两个/两个记录的所有数据,并且你想知道是否有匹配,如果没有匹配,哪个输入文件有记录。这就是问号(?)。它将包含'B'(在两个文件上),'1'(在F1上,或仅在第一个物理存在的JOINKEYS上)或'2'(仅在另一个JOINKEYS文件上)。

然后你需要输出数据。我假设您希望将数据放在不同的位置:

  OUTFIL FNAMES=INSERT,
         INCLUDE=(455,1,CH,EQ,C'1'),
         BUILD=(1,227)
  OUTFIL FNAMES=DELETE,
         INCLUDE=(455,1,CH,EQ,C'2'),
         BUILD=(228,227)
  OUTFIL FNAMES=CHANGE,
         INCLUDE=(455,1,CH,EQ,C'B',
                 AND,
                  1,227,CH,NE,228,227,CH),
         BUILD=(1,454)
  OUTFIL FNAMES=UNCHNGE,
         SAVE,
         BUILD=(1,227)

INCLUDE=(或OMIT=)包含或省略“OUTFIL组”中的数据。 OUTFILs同时“运行”(因为相同的记录依次呈现给每个记录,然后是下一条记录等)。

FNAMES为您提供了放入JCL的DDname。

对于CHANGE,INCLUDE是第一个记录(已知由于'B'的测试而匹配)不等于第二个记录。目前还不清楚你想要什么输出。目前,这些输出为F2附加到F1,并写入整个(两倍大小)记录。您也可以用“对”(BUILD =(1,227,/,228,227))或只记录一个或另一个记录来写记录。

SAVE是一个说“如果这个记录没有出现在任何OUTFIL上,请在这里输出。它对测试肯定是有用的,即使你不想在最终的代码中。