使用连接键对不匹配的记录进行排序

Sort unmatched records using joinkeys

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

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

这是一个简单的 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 是Main Task,在joined文件生成后运行的位。 SORT FIELDS=COPY 相当于选项复制。

假设您的数据已经按关键顺序排列。如果不是,请删除 SORTED,NOSEQCKs 但请记住,您可能会得到 "spurious" 匹配项,通过不在文件中相对于插入和删除的相同位置的相同键。

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

REFORMAT 语句定义连接文件上的记录。您想要 both/either 记录中的所有数据,并且您想知道是否有匹配项,如果没有匹配项,则哪个输入文件有记录。这就是问号 (?) 的含义。它将包含 '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 Group" 中的数据。 OUTFILs "run" 同时发生(因为同一条记录依次呈现给每个人,然后是下一条记录,等等)。

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

对于 CHANGE,INCLUDE 是针对第一个记录(由于 'B' 的测试已知匹配)不等于第二个。您在这里想要什么输出并不十分清楚。目前,这些输出作为 F2 附加到 F1,并写入整个(两倍大小)记录。您也可以在 "pairs" (BUILD=(1,227,/,228,227)) 中写入记录,或者只写入一个或另一个记录。

SAVE 表示“如果此记录未出现在任何 OUTFIL 上,则将其输出到此处。它对测试肯定有用,即使您不希望在最终代码中使用它。