2016-05-05 22 views
0

私はフィールドピクチャX(03)の日付がX'160101 '形式yymmddである。バイナリコード化された10進数のデコード

私はそれをpic x(06)に変換する方法を知りたいと思います。

これまで9(03)のコンプに移動して、 9(03)のコンプを9(06)に移動しようとしましたが、動作しませんでした。

どうすればいいですか?

答えて

2

あなたはstackoverflowの検索した場合、あなたは答えを見つける必要があります(これは既に回答されています)。

しかし、(私の最新-xは、日付を保持している)のようなフィールドを作成します。

03 my-date-x   pic x(3). 
    03 my-date-9   pic 9(6). 

    03 date-ymdv0   pic 9(6)v9 comp-3. 
    03 date-x    pic x(3) redefines date-ymdv0. 

を、コードはそれが動作する理由は、9(6)V9のためである

Move 0     to date-ymdv0 
    Move my-date-x   to date-x 
    Move date-ymdv0   to my-date-9 

ですcomp3 160101はx'1601010c ' として保存されています(末尾に0c)。

+0

ありがとうございますこのソリューションは完璧に動作します! – user3127986

+1

@ user3127986あなたはこの答えを受け入れるべきです。答えの横にある大目盛りの輪郭が見えるはずです。それをクリックしてください。個人的には、REDEFINESをPIC X(FILLERにすることができます)を含むように別々に行います。(REDEFINESをグループにし、必要な部分をFILLERにしてください) tマッチ。それはそれが動作する方法に何の違いもありません、それはちょうど誰か頭を傷つける時間を節約します。もちろん、あなたが私のことを試していたなら、あなたはそれがうまくいくことが分かったでしょう。ちょうど異なるデータ定義。 –

3

あなたが持っているものは、バイナリコード10進数(BCD)です。つまり、データはバイナリフィールドに保持されますが、バイナリではなく小数点の表現であり、値にとって重要です。 X'160101 'は1,442,049になります。 X'160201 'は1,442,305になります。だからバイナリフィールドとして扱うことができたら(バイナリフィールドの正しい長さにするためにバイナリゼロを前に付ける必要があります)、あなたは愚かな計算をしなければなりません。

あなたは何か違ったやり方をします。 BCDはネイティブのCOBOLデータ型ではありません。 PACKED-DECIMAL(しばしばCOMP-3/COMPUTATIONAL-3と同じ)は、下位(最右端)の半バイトの符号値を含むBCDタイプです。そうではない、非常にBCDが、あなたは、このようにパック10進数としてあなたのBCDを扱うことができます。その後

01 BCD-TO-PACKED. 
    05 BTP-SOURCE-BCD     PIC XXX. 
    05 BTP-PACKED-ZERO PACKED-DECIMAL PIC 9 VALUE ZERO. 
01 FILLER 
    REDEFINES BCD-TO-PACKED. 
    05 BTP-PACKED-TO-MOVE 
         PAKCED-DECIMAL PIC 9(6)V9. 

01 DATE-AS-PIC-X      PIC X(6). 
01 DATA-AS-CHARACTER-NUMERIC 
    REDEFINES DATE-AS-PIC-X    PIC 9(6). 


    MOVE your-source-value  TO BTP-SOURCE-BCD 
    MOVE BTP-PACKED-TO-MOVE  TO DATA-AS-CHARACTER-NUMERIC 

をあなたは喜んであなたがそれをやりたいためにDATE-AS-PIC-Xを参照することができます。

BCD-TO-PACKEDは、VALUE句を介して変更されることのない4バイトのグループフィールドで、最後はX'0F 'です。これは、1桁の数字と0の値を持つ符号なしパックド小数フィールドです。

次に、BTP-SOURCE-BCDのX-to-X MOVEを実行します。 BCD-TO-PACKEDは次のようになります。X'1601010F '。これは、小数点以下の桁区切りに完全に有効です。あなたは日付を取得するために10で割ることができます(PACKED-DECIMAL PIC 9(7)として再定義します)、なぜCPUを無駄にするのでしょうか?

代わりに、再定義では小数点以下1桁(V9)を定義します。コンパイラが小数点のない別の数値フィールドにMOVEするコードを生成すると、小数点以下の桁数は削除されます。プレスト!分割せずに10で割る。

注:選択されたデータ名は説明を助けるためのものです。あなたは、単に「淡々とした」名前を使うのではなく、データに意味を持たせるべきです。 COGOLでは "Character numeric"はUSAGE DISPLAYと呼ばれ、USAGEが指定されていない場合はデフォルトです。使用法という言葉自体はめったに使用されません。 USAGE DISPLAYは、PIC XフィールドまたはPIC 9フィールドが他にない場合に使用します。

注:おそらく2桁の年を使用しないでください。 2000年以前の日付や2199年以降の日付は処理できません。2桁の年の歴史的な使用は、ディスクのストレージとデータの冗長性が高かったためです(すべての世紀の値は19でした。同じアカウントの異なる時間)。 2桁の年を使用する場合は、世紀に関連する何かがあることを確認してください。

注:数値フィールドにPIC Xフィールドを移動しようとすると、コンパイラは、元の試みが失敗した理由の一つである、あなたはフィールドに有効な文字の番号を持っていると仮定します。

+0

バイナリを書くときに_hexadecimal_を意味しませんか? – knittl

+0

@knittl本当にそうではありません。 16進数は単なる表記です。 –