我想使用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)
答案 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)酿然后的结果将是 “有趣”