ws-var1
は、pic x(3)
です。 ws-var2
もpic x(3)
です。コブルールの英数字データの取り扱い
私はテーブルws-var1 = "1 "
のフィールドを持っていて、別のフィールドws-var2
にその値を移動したいとします。値は" 1"
です。 ws-var1
とws-var2
の両方が英数字フィールドです。これを達成するための適切な方法を提案してください。
ws-var1
は、pic x(3)
です。 ws-var2
もpic x(3)
です。コブルールの英数字データの取り扱い
私はテーブルws-var1 = "1 "
のフィールドを持っていて、別のフィールドws-var2
にその値を移動したいとします。値は" 1"
です。 ws-var1
とws-var2
の両方が英数字フィールドです。これを達成するための適切な方法を提案してください。
あなたは、一般的に(中間のスペースを含まない)の文字列を右寄せにしたいと仮定すると、あなたが使用することができます。
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
と宣言することができます。
リファレンス修正の例でもws-var2を初期化することをお勧めします。それ以外の場合は、次のデータが前のデータよりも短くなります。私は、OPによって選択されたデータ名が参照変更を必要とすると考えています。その場合、コードをあまり明確にしません:-) –
もちろんループで実行できます。事は、あなたは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" - 人が空白をもっと入力しなくてもいいと思います。
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.
それは
なぜWS-VAR-2に従属するフィールドWS-VAR1-ZZ9がありますか? VARの内容はすでに混乱していませんか?数字の使用でリスクがあります。これは悪いデータを良いものにすることにあります。 –
@BillWoodger:私は、アルファメットフィールドと数値フィールドを区別して別々に保つことを好みます。私はこれが悪いデータを良いものにする方法がわかりません - AFAICS、これは明らかに有効な数字と後続スペースの組み合わせを扱い、他の組み合わせはSOC4を生成するはずです。 – Magoo
サイン整流。 X'F1F100 'はX'F1F1F0'になることができます。あなたがPIC X(n)をPIC X(n)だけにすると、何の兆候もありません。私はあなたがS0C7(データ例外)を意味しないと思うS0C4(例外のアドレス指定)。人々が想像するように何度も起こることはありません。数値テストに合格しなかったものは、使用中のS0C7を取得しません。ちょうどUSAGE DISPLAY PIC 9(n)を同様のものに移動すると、S0C7を得ることができません。 –
...再定義のすべての問題だということは、ソース・データのための唯一の可能性ですか?ちょうど "1"? 1桁の数値ですか?または2,3桁もあるでしょうか? –