3

我想使用 SYNCSORT 将所有 Packed Decimal 字段强制为负号值。关键要求是第二个半字节必须是十六进制“D”。我有一个可行的方法,但它似乎太复杂了。按照 KISS 原则,我希望有人有更好的方法。也许在最后 4 位上使用位掩码?这是我想出的代码。有没有更好的办法?

*
* 此排序逻辑旨在强制所有 Packed Decimal 数量为
* 有一个带有 B'....1101' 值(十六进制'xD')的负号。
*
 排序字段=复制
 外文件=1,
   INCLUDE=(8,1,BI,NE,B'....1..1',OR, * 正压缩十进制
            8,1,BI,EQ,B'....1111'), * 无符号压缩十进制
   OUTREC=(1:1,7, * 包括 +0
           8:(-1,MUL,8,1,PD),PD,LENGTH=1,
           9:9,72)
 外文件=2,
   INCLUDE=(8,1,BI,EQ,B'....1..1',AND, * 负压缩十进制
            8,1,BI,NE,B'....1111'), * 非无符号压缩十进制
   OUTREC=(1:1,7, * 包括 -0
           8:(+1,MUL,8,1,PD),PD,LENGTH=1,
           9:9,72)

4

4 回答 4

1

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

如果这样做,您可以接受所有三个负压缩值 xA、xB 和 xD。

于 2010-10-19T18:39:50.077 回答
1

您是否考虑过编写 E15 用户出口?E15 用户出口允许您在记录输入到排序过程时对其进行操作。在这种情况下,您将有一个 REXX、COBOL 或其他与 LE 兼容的语言子例程修补压缩十进制符号字段,因为它输入到排序过程。无需拆分为多个文件以供以后合并。

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

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

于 2010-10-20T14:54:41.817 回答
1

查看打包字段的最后一个字节是可能的。你想要正/无符号到负,所以如果它大于-1,从零减去它。

从 MikeC 的一个短暂的回答中,现在知道数据包含non-preferred符号(即,它可以在低位半字节中包含 A 到 F,而preferred符号可能是 C(正)或 D(负). F 是无符号的,视为正数。

这是用 DFSORT 测试的。它应该与 SyncSORT 一起使用。事实证明,DFSORT 可以理解负压缩十进制零,但它不会创建负压缩十进制零(它将允许从负零压缩十进制创建分区十进制负零)。

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

由于只有一个值要处理成为负零,X'0C',在符号的标准化已经完成之后,对负零有一个简单的测试和替换为常数 X'0D'。由于负零不起作用,第二次测试由原来的负一改为零。

在数据中使用非首选符号:

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))

注意:如果non-preferred符号是通过不使用编译器选项 NUMPROC(NOPFD) 的 COBOL 程序填充的,那么结果将是“有趣的”。

于 2012-04-26T19:10:05.083 回答
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))  
于 2010-10-26T17:04:33.700 回答