3

SYNCSORTを使用して、すべてのPackedDecimalフィールドを負の符号値に強制したいと思います。重要な要件は、2番目のニブルが16進数の「D」でなければならないことです。私にはうまくいく方法がありますが、それはあまりにも複雑に思えます。KISSの原則に沿って、誰かがより良い方法を持っていることを望んでいます。おそらく最後の4ビットにビットマスクを使用していますか?これが私が思いついたコードです。もっと良い方法はありますか?

*
*このソートロジックは、すべてのPackedDecimalの金額を強制することを目的としています。
* B'.... 1101'値(16進数'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、*+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')、*符号なしパック10進数ではありません
   OUTREC =(1:1,7、*-0を含む
           8:(+ 1、MUL、8,1、PD)、PD、LENGTH = 1、
           9:9,72)

4

4 に答える 4

1

E15 ユーザー出口を作成することを検討しましたか? E15 ユーザー出口を使用すると、ソート プロセスへの入力時にレコードを操作できます。この場合、REXX、COBOL、またはその他の LE 互換言語サブルーチンを使用して、パック 10 進数フィールドがソート プロセスに入力されるときにパッチを適用します。後でマージするために複数のファイルに分割する必要はありません。

以下は、 DFSORT から E15 出口を呼び出すためのサンプル JCLへのリンク です (SYNCSORT の同じ JCL)。このリファレンスの第 4 章では 、ユーザー出口ルーチンの開発方法について説明しています。これも DFSORT のマニュアルですが、SyncSort はこの点で完全に互換性があると思います。ユーザー出口を作成することは、他のサブルーチンを作成することと何ら変わりはありません。リンケージを正しく行えば、あとは簡単です。

大まかな流れですが、参考になれば幸いです。

于 2010-10-20T14:54:41.817 に答える
1

わかりました、少し掘り下げましたが、MVSFORUMS.COM で助けを求めるという NEALB の提案は報われました...これが最終結果です。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 に答える
1

VSAM ファイルを処理するコードで、特定のキー付き読み取りを行う代わりに、読み取りロジックを KEY GTEQ で GET に変更し、結果で < 0 をチェックできますか?

これを行うと、3 つの負のパック値 xA、xB、および xD をすべて受け入れることができます。

于 2010-10-19T18:39:50.077 に答える
1

パックされたフィールドの最後のバイトを見ることができます。正/符号なしを負にする必要があるため、-1 より大きい場合はゼロから減算します。

MikeC による短命の回答から、データにnon-preferred符号が含まれていることがわかりました (つまり、下位半バイトに A から F を含めることができますが、preferred符号は C (正) または D (負) ). F は符号なしで、正として扱われます。

これは、DFSORT でテストされます。SyncSORT で動作するはずです。DFSORT は負のパック 10 進数のゼロを理解できるが、負のパック 10 進数のゼロを作成しないことがわかります (負のゼロのパック 10 進数からゾーン 10 進数の負のゼロを作成できます)。

non-preferred符号は有効であり、10 進数の機械語命令への入力に対して正確に符号化されますが、結果は常に符号であり、正しいという考え方ですpreferred。したがって、最初にゼロを追加すると、フィールドが符号に変わりpreferred、-1 のテストが期待どおりに機能します。パック 10 進数フィールドの符号ニブル内のデータを使用すると、SORT には特定の文書化された動作がいくつかありますが、ここではたまたま役に立ちません。

負のゼロ X'0C' になるために処理する値は 1 つしかないため、符号の正規化が既に行われた後、単純なテストと負のゼロの定数 X'0D' での置換があります。負のゼロは機能しないため、2 番目のテストは元のマイナス 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))

注:non-preferredコンパイラー・オプション NUMPROC(NOPFD) を使用しない COBOL プログラムを介して符号が詰め込まれている場合、結果は「興味深い」ものになります。

于 2012-04-26T19:10:05.083 に答える