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

时间:2010-10-08 19:01:55

标签: numeric mainframe jcl syncsort packed-decimal

我想使用SYNCSORT强制所有Packed Decimal字段为负号。关键要求是第二个半字节必须是Hex'D'。我有一种方法可行,但似乎太复杂了。为了与KISS原则保持一致,我希望有人有更好的方法。也许在最后4位使用位掩码?这是我提出的代码。还有更好的方法吗?

*
* This sort logic is intended to force all Packed Decimal amounts to
* have a negative sign with a B'....1101' value (Hex 'xD').
*
 SORT FIELDS=COPY
 OUTFIL FILES=1,
   INCLUDE=(8,1,BI,NE,B'....1..1',OR,     * POSITIVE PACKED DECIMAL
            8,1,BI,EQ,B'....1111'),       * UNSIGNED PACKED DECIMAL
   OUTREC=(1:1,7,                         * INCLUDING +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,                         * INCLUDING -0
           8:(+1,MUL,8,1,PD),PD,LENGTH=1,
           9:9,72)

4 个答案:

答案 0 :(得分:1)

在处理VSAM文件的代码中,您是否可以使用KEY GTEQ将读取逻辑更改为GET并检查<结果为0而不是进行特定的键控读取?

如果你这样做,你可以接受所有三个负包装值xA,xB和xD。

答案 1 :(得分:1)

您是否考虑过编写E15用户出口? E15用户出口让您 在输入排序过程时操纵记录。在这种情况下,你会有一个 REXX,COBOL或其他LE兼容语言子例程修补打包的十进制符号字段,因为它输入到排序过程。无需拆分成多个文件以便稍后合并。

以下是指向example JCL的链接 用于从DFSORT调用E15退出(与SYNCSORT相同的JCL)。 this reference的第4章 描述了如何开发用户出口例程,这是一个DFSORT手册,但我相信SyncSort是 在这方面完全兼容。编写用户出口与编写任何其他子例程没有什么不同 - 获得正确的链接,其余的很容易。

这是一个非常概括的大纲,但我希望它有所帮助。

答案 2 :(得分:1)

好的,需要一些挖掘,但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))  

答案 3 :(得分:1)

查看压缩字段的最后一个字节是可能的。您希望正/无符号为负数,因此如果它大于-1,则将其从零减去。

从由MikeC一个短暂的应答,它是目前已知的是,数据包含non-preferred的迹象(即,它可以在低序半字节包含A到F,而{{1符号将是C(正)或D(负).F是无符号的,被视为正数。

使用DFSORT测试。它应该与SyncSORT一起使用。原来,DFSORT可以的了解的包装小数零负,但它不会的创建的负填充小数为零(这将允许划小数负零从负零压缩十进制创建。

这个想法是preferred符号有效并且将被准确地签名以输入到十进制机器指令,但结果将始终是non-preferred符号,并且是正确的。因此,首先添加零,该字段将变为preferred符号,然后-1的测试将按预期工作。对于打包十进制字段的sign-nybble中的数据,SORT有一些特定的和记录的行为,这在这里没有帮助。

由于只有一个处理成为负零,X'0C值“标志已经完成的归一化之后,有一个简单的测试,并置换X'0D的恒定”为负零。由于负零不起作用,第二次测试从原来的减1变为零。

数据中包含非首选标志:

preferred

数据中有首选标志:

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程序不使用编译选项NUMPROC(NOPFD)酿然后的结果将是 “有趣”