如何使用SYNCSORT格式化具有特定符号值的Packed Decimal字段?

我想使用SYNCSORT强制所有Packed Decimal字段为负号。关键要求是第二个半字节必须是Hex'D'。我有一种方法可行,但似乎太复杂了。为了与KISS原则保持一致,我希望有人有更好的方法。也许在最后4位使用位掩码?这是我提出的代码。有没有更好的办法? * *此排序逻辑旨在强制所有Packed Decimal金额 *有一个带有B'.... 1101'值的负号(Hex'xD')。 *  排序字段=复制  OUTFIL FILES = 1,    INCLUDE =(8,1,BI,NE,B'...... 1..1',或者,*正面包装的十进制             8,1,BI,EQ,B'.... 1111'),*未签名的包装十进制    OUTREC =(1:1,7,*包括+0            8:( - 1,MUL,8,1,PD),PD,LENGTH = 1,            9:9,72)  OUTFIL FILES = 2,    INCLUDE =(8,1,BI,EQ,B'.... 1..1',AND,* NEGATIVE PACKED DECIMAL             8,1,BI,NE,B'.... 1111'),* NOT UNSIGNED PACKED DECIMAL    OUTREC =(1:1,7,*包括-0            8:(+ 1,MUL,8,1,PD),PD,LENGTH = 1,            9:9,72)                                                   
已邀请:
在处理VSAM文件的代码中,您是否可以使用KEY GTEQ将读取逻辑更改为GET并检查<结果为0而不是进行特定的键控读取? 如果你这样做,你可以接受所有三个负包装值xA,xB和xD。     
你考虑过编写E15用户出口吗? E15用户出口让您 在输入排序过程时操纵记录。在这种情况下,你会有一个 REXX,COBOL或其他LE兼容语言子例程修补打包的十进制符号字段,因为它输入到排序过程。无需拆分成多个文件以便稍后合并。 这是一个示例JCL的链接 用于从DFSORT调用E15退出(与SYNCSORT相同的JCL)。本参考文献的第4章 描述了如何开发用户出口例程,这是一个DFSORT手册,但我相信SyncSort是 在这方面完全兼容。编写用户出口与编写任何其他子例程没有什么不同 - 获得正确的链接,其余的很容易。 这是一个非常概括的大纲,但我希望它有所帮助。     

bab

好吧,需要一些挖掘,但NEALB的建议是寻求MVSFORUMS.COM的帮助得到了回报......这是最终的结果。与SORT / MERGE一起使用的OUTREC逻辑取代了OUTFIL,并利用了Syncsort 1.3中我没有意识到的新功能(IFTHEN,WHEN和OVERLAY)。获得当前文档是值得的!
*                                                                
* This MERGE logic is intended to assert that the Packed Decimal 
* field has a negative sign with a B'....1101' value (Hex X'.D').
*                                                                
*                                                                
 MERGE FIELDS=(27,5.4,BI,A),EQUALS                               
 SUM FIELDS=NONE                                                 
 OUTREC IFTHEN=(WHEN=(32,1,BI,NE,B'....1..1',OR,                 
                      32,1,BI,EQ,B'....1111'),                   
                OVERLAY=(32:(-1,MUL,32,1,PD),PD,LENGTH=1)),      
        IFTHEN=(WHEN=(32,1,BI,EQ,B'....1..1',AND,                
                      32,1,BI,NE,B'....1111'),                   
                OVERLAY=(32:(+1,MUL,32,1,PD),PD,LENGTH=1))  
    
查看压缩字段的最后一个字节是可能的。您希望正/无符号为负数,因此如果它大于-1,则将其从零减去。 从MikeC的短命回答中,现在知道数据包含
non-preferred
符号(也就是说,它可以包含低位半字节中的A到F,而
preferred
符号可以是C(正数)或D (否定).F未签名,视为正面。 这是使用DFSORT测试的。它应该与SyncSORT一起使用。事实证明,DFSORT可以理解负的压缩十进制零,但它不会创建负的压缩十进制零(它将允许从负零压缩十进制创建分区十进制负零)。 这个想法是
non-preferred
符号是有效的,并且将被准确地签名以输入到十进制机器指令,但结果将始终是
preferred
符号,并且将是正确的。因此,首先添加零,该字段将变为
preferred
符号,然后-1的测试将按预期工作。对于压缩十进制字段的sign-nybble中的数据,SORT具有一些特定的和记录的行为,这在这里没有帮助。 由于只有一个值要处理成为负零,X'0C',在已经完成的符号归一化之后,有一个简单的测试并用负0的常数X'0D'替换。由于负零不起作用,第二次测试从原来的减1变为零。 在数据中有非首选标志:
SORT FIELDS=COPY
INREC IFTHEN=(WHEN=INIT,
               OVERLAY=(32:+0,ADD,32,1,PD,TO=PD,LENGTH=1)),
      IFTHEN=(WHEN=(32,1,CH,EQ,X'0C'),
               OVERLAY=(32:X'0D')), 
      IFTHEN=(WHEN=(32,1,PD,GT,0), 
               OVERLAY=(32:+0,SUB,32,1,PD,TO=PD,LENGTH=1))
有数据中的首选标志:
SORT FIELDS=COPY
INREC IFTHEN=(WHEN=(32,1,CH,EQ,X'0C'),
               OVERLAY=(32:X'0D')), 
      IFTHEN=(WHEN=(32,1,PD,GT,0), 
               OVERLAY=(32:+0,SUB,32,1,PD,TO=PD,LENGTH=1))
注意:如果通过COBOL程序填充
non-preferred
符号而不使用编译器选项NUMPROC(NOPFD),那么结果将是“有趣的”。     

要回复问题请先登录注册