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

问题描述 投票:0回答:1

当我尝试左右外连接这两个recfm 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。

有关如何解决这个问题的任何想法?

sorting mainframe dfsort
1个回答
0
投票

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

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

这将概念化您的连接(其中Output是连接数据,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 JOIN UNPAIRED,F1,F2,ONLY

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

OUTFIL FNAMES = EXT,VLTRIM = C'',IFTHEN =(WHEN =(81,1,CH,EQ,C'2'),BUILD =(1,4,82)),IFTHEN =(WHEN = NONE,BUILD =(1,4,5,76))

匹配标记,?,将被设置为1,用于匹配无法比拟的F2,2,用于匹配记录的无法匹配的F2和B(由于ONLY声明中的JOIN,您将无法获得)。

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

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

输出:

For EXT:
A 11111111111111111111111111111111111
B 4444444444444444                   
E 3                                  
F 6666666666666  

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

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

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

当IFTHEN为真时,IFTHEN =(WHEN =(logicalexpression)处理结束。因此代码中的组合实际上是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?以获取更多示例。

© www.soinside.com 2019 - 2024. All rights reserved.