2016-03-30 5 views
0

ws-var1は、pic x(3)です。 ws-var2pic x(3)です。コブルールの英数字データの取り扱い

私はテーブルws-var1 = "1 "のフィールドを持っていて、別のフィールドws-var2にその値を移動したいとします。値は" 1"です。 ws-var1ws-var2の両方が英数字フィールドです。これを達成するための適切な方法を提案してください。

+0

...再定義のすべての問題だということは、ソース・データのための唯一の可能性ですか?ちょうど "1"? 1桁の数値ですか?または2,3桁もあるでしょうか? –

答えて

1

あなたは、一般的に(中間のスペースを含まない)の文字列を右寄せにしたいと仮定すると、あなたが使用することができます。

INSPECT ws-var1 TALLYING num-chars FOR CHARACTERS BEFORE SPACE 
MOVE ws-var1 (1:num-chars) TO ws-var2 (3 - num-chars + 1:) 
num-charsは初期値を持つ数字データ項目である

(また、TRIM組み込み関数を持つコンパイラを使用するのに十分なのであれば、ws-var2をJUSTIFIED RIGHTと宣言し、単純にMOVE FUNCTION TRIM(ws-var1) TO ws-var2と宣言することができます。

+0

リファレンス修正の例でもws-var2を初期化することをお勧めします。それ以外の場合は、次のデータが前のデータよりも短くなります。私は、OPによって選択されたデータ名が参照変更を必要とすると考えています。その場合、コードをあまり明確にしません:-) –

0

もちろんループで実行できます。事は、あなたは3バイトしか持っていないということです。 3バイトの長さのものでは、基本的なもの以外の何かを行うことは、合理的なものを超えたリソースが消費されるため、オーバー・ザ・トップです。リソースが払われず、毎日使用される多くのプログラムで非効率的なコードが繁殖しても誰も心配しないところでは、他の方法もあります。

01 A-MEANINGFUL-NAME. 
     88 AMN-NO-ACTUAL-DATA    VALUE SPACE. 
     05 AMN-FIRST-TWO-BYTES-OF-DATA. 
      10 AMN-FIRST-BYTE    PIC X. 
      10 FILLER      PIC X. 
       88 AMN-ONE-BYTE-OF-DATA VALUE SPACE. 
     05 FILLER       PIC X. 
      88 AMN-TWO-BYTES-OF-DATA  VALUE SPACE. 

    01 B-MEANINGFUL-NAME. 
     05 BMN-FIRST-BYTE     PIC X. 
     05 BMN-SECOND-TWO-BYTES. 
      10 FILLER      PIC X. 
      10 BMN-THIRD-BYTE    PIC X. 

     MOVE SPACE     TO B-MEANINGFUL-NAME 
     EVALUATE TRUE 
     WHEN AMN-NO-ACTUAL-DATA 
      CONTINUE 
     WHEN AMN-ONE-BYTE-OF-DATA 
      MOVE AMN-FIRST-BYTE  TO BMN-THIRD-BYTE 
     WHEN AMN-TWO-BYTES-OF-DATA 
      MOVE AMN-FIRST-TWO-BYTES-OF-DATA 
            TO BMN-SECOND-TWO-BYTES 
     WHEN OTHER 
      MOVE A-MEANINGFUL-NAME TO B-MEANINGFUL-NAME 
     END-EVALUATE 

これは効率的かつ明確な方法です。おそらく多くの人にとってあまりにも多くのタイプの入力ですが、それらは容易に理解され、容易に維持されるプログラムの必要性を考慮しない人々です。必要な宛先のバイトをブランキングするだけで、効率を上げることができますが、自分でそれを試みることができます。

埋め込みスペースで「そのまま」は動作しませんが、簡単に変更することができます。

さらに、エディタの力を使うほど、それほどタイピングはありません。

それとも

01 A-MEANINGFUL-NAME     PIC XXX. 
    01 B-MEANINGFUL-NAME     PIC XXX. 
    01 FILLER 
     REDEFINES B-MEANINGFUL-NAME. 
     05 C-MEANINGFUL-NAME    PIC XXX JUST RIGHT. 

     UNSTRING A-MEANINGFUL-NAME 
     DELIMITED BY SPACE 
     INTO      C-MEANINGFUL-NAME 

そんなにタイピング。効率が悪い。まだ明らかです。

埋め込みスペースでは機能しませんが、コードを簡単に組み込むことができます(条件付きでのみ使用できます)。

それとも

01 A-MEANINGFUL-NAME     PIC XXX. 
    01 B-MEANINGFUL-NAME     PIC XXX. 

    01 C-MEANINGFUL-NAME 
     REDEFINES B-MEANINGFUL-NAME   PIC ZZ9. 

     COMPUTE C-MEANINGFUL-NAME = FUNCTION NUMVAL 
             (A-MEANINGFUL-NAME) 

それほどタイピング、おそらくさらに効率が悪く、おそらく少し明確かつ十分に形成された数値であることソースに依存しています。

埋め込みスペースでは機能しません。これは整形式ではないためです。

エドワードHの回答が示しているように、参考変更を使用することができます。ここでそれを行うに書き換え最初の例は、参照修飾を通して失われることができるか明確に実証として、次のとおり

 MOVE SPACE TO B-MEANINGFUL-NAME 
     EVALUATE TRUE 
     WHEN A-MEANINGFUL-NAME = SPACES 
      CONTINUE 
     WHEN A-MEANINGFUL-NAME (2:1) = SPACES 
      MOVE A-MEANINGFUL-NAME (1:1) 
      TO B-MEANINGFUL-NAME (3:1) 
     WHEN A-MEANINGFUL-NAME (3:1) = SPACES 
      MOVE A-MEANINGFUL-NAME (1:2) 
      TO B-MEANINGFUL-NAME (2:) 
     WHEN OTHER 
      MOVE A-MEANINGFUL-NAME TO B-MEANINGFUL-NAME 
     END-EVALUATE 

ように、そのために生成された実行可能コードは、元の例と同じ(でなければならない)であろう効率的ですが、読むのがより困難であることが期待されます。 (もちろん、私はそれを書いていましたが、書式を違うようにしていましたが、少なくとも読むのは少し楽にしましたが、 "VAR1" - 人が空白をもっと入力しなくてもいいと思います。

0
01 WS-VAR-1. 
    88 FL-VAR1-999   VALUE SPACES. 
    03 WS-VAR1-999   PIC 9(03). 
01 FILLER 
     REDEFINES WS-VAR-1. 
    03 WS-VAR1-99   PIC 9(02). 
    03 FILLER    PIC X(01). 
     88 FL-VAR1-99  VALUE SPACES. 
01 FILLER 
     REDEFINES WS-VAR-1. 
    03 WS-VAR1-9   PIC 9(01). 
    03 FILLER    PIC X(02). 
     88 FL-VAR1-9   VALUE SPACES. 

01 WS-VAR-2. 
    03 WS-VAR1-ZZ9   PIC Z(02)9(01). 



    IF FL-VAR1-999   MOVE ZERO  TO WS-VAR1-ZZ9 
     ELSE 
     IF FL-VAR1-9   MOVE WS-VAR1-99 TO WS-VAR1-ZZ9 
     ELSE 
     IF FL-VAR1-99  MOVE WS-VAR1-9 TO WS-VAR1-ZZ9 
      ELSE    MOVE WS-VAR1 TO WS-VAR2. 

それは

+0

なぜWS-VAR-2に従属するフィールドWS-VAR1-ZZ9がありますか? VARの内容はすでに混乱していませんか?数字の使用でリスクがあります。これは悪いデータを良いものにすることにあります。 –

+0

@BillWoodger:私は、アルファメットフィールドと数値フィールドを区別して別々に保つことを好みます。私はこれが悪いデータを良いものにする方法がわかりません - AFAICS、これは明らかに有効な数字と後続スペースの組み合わせを扱い、他の組み合わせはSOC4を生成するはずです。 – Magoo

+0

サイン整流。 X'F1F100 'はX'F1F1F0'になることができます。あなたがPIC X(n)をPIC X(n)だけにすると、何の兆候もありません。私はあなたがS0C7(データ例外)を意味しないと思うS0C4(例外のアドレス指定)。人々が想像するように何度も起こることはありません。数値テストに合格しなかったものは、使用中のS0C7を取得しません。ちょうどUSAGE DISPLAY PIC 9(n)を同様のものに移動すると、S0C7を得ることができません。 –