F2的vb文件的JOINKEYS REFORMAT字段无效

时间:2015-09-03 20:07:21

标签: sorting mainframe dfsort

当我尝试左右外接这两个recfma VB文件时 我从F2文件中得不到任何东西。

//STEP2000 EXEC PGM=SORT                          
//*   JOIN                                        
//*                                               
//SYSOUT   DD SYSOUT=*                            
//*                                               
//SORTJNF1 DD DSN=YXX122.TEMP.EXPORT.TYPEN,   
//            DISP=SHR                            
//*                                               
//SORTJNF2 DD DSN=YXX122.TEMP.EXPORT.TYPEC,   
//            DISP=SHR                            
//*                                               
//SORTOUT  DD DSN=YXX122.DYXX122.EXPORT.XSUM,
//            DISP=(NEW,CATLG,DELETE),            
//            UNIT=(DEV,2),                       
//            SPACE=(CYL,(150,20),RLSE),          
//            DCB=(RECFM=VB,LRECL=304,BLKSIZE=0)  
//*                                               
//SYSIN    DD *                                     
  SORT FIELDS=COPY                                  
  JOINKEYS FILES=F1,                                
  FIELDS=(13,4,A,18,5,A,17,1,A,23,1,A,33,8,A,41,4,A)
  JOINKEYS FILES=F2,                                
  FIELDS=(13,4,A,18,5,A,17,1,A,23,1,A,33,8,A,41,4,A)
  JOIN UNPAIRED,F1,F2                               
  REFORMAT FIELDS=(F1:5,300)                        
  OUTFIL FTOV                                       
//   

问题是我无法找到REFORMAT FIELDS F2文件的方式。

I tried with    REFORMAT FIELDS=(F1:5,300,F2:5,300)  but the outfile was with a length of 600.

我想知道如何在我的SORTOUT文件中使用VB长度为304的文件F1和F2。

有关如何解决此问题的想法吗?

1 个答案:

答案 0 :(得分:0)

事实证明你有DFSORT而不是SyncSORT,这使得事情变得更简单,因为你绝对可以在REFORMAT语句中使用匹配标记?。最新的SyncSORT可能会将匹配标记作为未记录的功能。

将所有不匹配的记录放在一个OUTFIL上可能会令人困惑(您不知道它们来自哪个输入)。

这概括了您的连接(其中输出是连接数据,b表示空白)。

F1
A
C
E

F2
B
C
F

Output
Ab
bB
Eb
bF

因此,如果你想要B和F,你需要从F2指定一些数据。您还需要识别"空白"这样你就知道REFORMAT记录的哪一部分当前有数据(DFSORT有一个匹配标记,SyncSORT没有)。

为此你需要在记录中识别一个永远不会为空的字节。如果那是不可能的,那么永远不会的一个字节是另一个给定值(您在REFORMAT上的FILL =上指定)。如果失败,则具有相同特征的两个或更多字节。作为最终的故障保护,您可以从一个文件或另一个文件中检查REFORMAT记录的整个部分是否为空白。

由于您需要V型输出,您可以创建REFORMAT记录变量:

REFORMAT FIELDS=(F1:1,4,?,F1:5,300,F2:5)

在OUTFIL上使用VLTRIM。

或修复:

REFORMAT FIELDS=(F1:5,300,F2:5,300)

在OUTFIL上使用FTOV和VLTRIM。

然后你需要一些代码,它们测试你选择的字节/字节/ partofdata为space / thevalueyouhavechosen并使用BUILD创建一个包含你想要的数据的记录(以及将被所有数据杀死的尾随空白/值) VLTRIM)。

 IFTHEN=(WHEN=(logicalexpression),
           BUILD=(1,4,5,300)),
 IFTHEN=(WHEN=NONE,
           BUILD=(1,4,305,300))

或者

 IFTHEN=(WHEN=(logicalexpression),
           BUILD=(1,300)),
 IFTHEN=(WHEN=NONE,
           BUILD=(301,300))

这里有一些代码可以满足您的需求。大概。我无法使用SyncSORT进行测试。

数据:

F1
A 11111111111111111111111111111111111
C 2222222222222222222222 
E 3 

F2
B 4444444444444444 
C 55555555555555555555555555
F 6666666666666 

代码:

选项复制

JOINKEYS F1 = INA,FIELDS =(5,1,A),SORTED,NOSEQCK   JOINKEYS F2 = INB,FIELDS =(5,1,A),SORTED,NOSEQCK   加入未使用,F1,F2,仅

改革领域=(F1:1,4,F1:5,76,F2:5)

OUTFIL FNAMES = EXT,VLTRIM = C' &#39 ;,          就(ifthen)=(WHEN =(81,1,CH,EQ,C' 2&#39),                    BUILD =(1,4,82)),          就(ifthen)=(WHEN = NONE,                    BUILD =(1,4,5,76))

匹配标记?,对于不匹配的F2将设置为1,对于匹配的记录将2设置为B,对于匹配的记录将设置为ONLY,因为JOIN声明中的For EXT: A 11111111111111111111111111111111111 B 4444444444444444 E 3 F 6666666666666

这假设您的数据已按顺序排列。删除SORTED,NOSEQCK以查找不按顺序排列的数据。

我使用了80的LRECL和一个简单的密钥和一些简单的数据。

输出:

StylesConfig

SORTOUT将显示未更改的REFORMAT记录。那是你看它是如何工作的。当您了解所有内容时,可以删除FNAMES = EXT或从JCL中删除SORTOUT。

F1:1,4确保REFORMAT记录是可变长度的。 5,300应该使用空白填充来缩短记录。这就是你以后需要VLTRIM的原因。 F2:5表示"文件2,位置5,到文件末尾的两个记录"。

如果您的数据可以有真正的尾随空白,那么您必须对同一个字符使用FILL =和VLTRIM =。

IFTHEN =(WHEN =(logicalexpression)处理在IFTHEN为真时结束。因此代码中的组合实际上是IF / ELSE。

有关更多示例,请参阅此内容,Compare two files and write it to "match" and "nomatch" filesSync sort, Unpaired records of File1 have spaces for no records in F2 file. Can we replace those specific column's spaces by ZEROS?