プロが教えるわが家の防犯対策術!

COBOL初心者のものです。
色々と調べたのですがわからないため投稿させていただきます。

COPY句の登録集原文に下記を定義
03 英数字1 PIC X(2).

上記の英数字1をPIC 9(2)にしたい場合は
登録集原文に

03 英数字1 PIC X(2).
03 数字 REDEFINES 英数字1.
05 数字1 PIC 9(2).

と記述すれば数字項目として表示されるのでしょうか?

また、英数字1に数字が入っているか
「IF 英数字1 NUMERIC
  THEN MOVE 英数字1 TO 数字1;
ELSE
CONTINUE;
ENDーIF.」
で確認したいのですが、ソースプログラムに記載するか、登録集原文に記載するかで迷っています。
また記載する場合はデータ部ではなく、手続き部に記載しなくてはならないのか調べても出てこず困っております、、、

IF文の場合、REDEFINESは不要になりデータ部での定義はどうすればよいか?

色々と記載してしまったのですが、各々の仕組みについて教えてください。

A 回答 (6件)

>数字項目として表示される


「表示される」って、何をしたいのか分かんないですが、数字として再定義は問題なくできますよ。

>IF 英数字1 NUMERIC
文法はうる覚えなのですが、「IS NUMERIC」じゃなかったかな?

>MOVE 英数字1 TO 数字1
これは、意味ないです。
英数字1を再定義したものが、数字1なので、わざわざ代入する必要はありません。

>ソースプログラムに記載するか、登録集原文に記載するか
変数の定義はDATAディビジョン、命令はPROCEDUREディビジョンにしか書けません(少なくとも私が知っているCOBOLでは)。
必然的に、変数の定義は登録集原文。判定のロジックはソースプログラムにコーディングするのが一般的だと思います。

>IF文の場合、REDEFINESは不要になりデータ部での定義はどうすればよいか?
NUMERICチェックは、英数字1で判定する必要があります。これを数字1で判定するとおかしな結果になることがあります(例えば,"AA"も数字と見なされる)。
NUMERICチェックで数字と判定された後に、実際の数値変数として使用する場合は、数字1を使います。
よって、「REDEFINESは不要」ってことにはなりません。
    • good
    • 0
この回答へのお礼

助かりました

ご返答ありがとうございます。
わかりにくくて申し訳ございません、、、
「表示される」はゼロ埋めして出力したいということです。
例えば、
X(2)に1が入っていると「1 」の表示になると思いますが、
9(2)に1が入っていると「01」の表示になるように
入っている値が1桁の場合「0」で埋めたいということです。

「IF 英数字1 IS NUMERIC
  THEN MOVE 英数字1 TO 数字1;
 ELSE
  CONTINUE;
 ENDーIF.」
「THEN MOVE 英数字1 TO 数字1」はいらないということですが、この場合は「英数字1」がNUMERICだった場合の処理は何がいいのでしょうか。
英数字1は出力せず、数字1のみ出力したいです。

お忙しい中、わかりにくい質問に親切にご返答いただいてありがとうございます!
追加で教えていただけると幸いです。

お礼日時:2022/06/15 23:14

あなたのように、当初の質問とはまったく異なることを聞いてくる人。


ネット検索すれば、すぐに見つかるようなことを人任せにする人に、時間を割くのは不本気です。
あなたが同じような姿勢で質問するなら、私はもう回答しません。
    • good
    • 0
この回答へのお礼

ご返答何度もありがとうございます。

詳しくご返答いただいているのに自身の質問の内容が悪く不快な気分にしてしまい申し訳ございません。
何度も調べ、見つからず行き詰まってしまい質問しましたが
後は自分で調べます。

ご親切にご指摘までいただきありがとうございます。

お礼日時:2022/06/16 10:02

表示だけの問題なのか、その項目を計算に使う場合もあるのですか?


英数字1には必ず1〜2桁の数字が入るのですか?

03 英数字1 PIC X(2) JUST RIGTH.
05 数字1 PIC 9(2).
05 FILLER REDIFNES 数字1.
07 FILLER PIC X.
07 数字1-1 PIC 9.

EVALUATE TRUE
WHEN 数字1 NUMERIC
 2桁数字の場合の処理
WHEN 数字1-1 NUMERIC
* 1桁数字の場合の処理
INSPECT 英数字1 REPLACING LEADING ' ' BY '0'
WHEN OTHER
数字以外の場合の処理
END-EVALUATE

これにより、2桁入力はそのまま、1桁入力は桁を右にずらした上で前に'0'を埋め込みます。
2桁数字を英数字1でも、数字1でも操作できます。
数字以外の入力(スペースなど)の場合は、そちらの要件で好きにしてください。

COBOL85といった古いCOBOLは、コメントの* は7カラムに入力してください。
INSPECTは、次の部分参照で置き換えられるかも知れません。

MOVE '0' TO 英数字1(1:1)
    • good
    • 0

表示だけの問題なのか、その項目を計算に使う場合もあるのですか?


英数字1には必ず1〜2桁の数字が入るのですか?

03 英数字1 PIC X(2) JUST RIGTH.
05 数字1 PIC 9(2).
05 FILLER REDIFNES 数字1.
07 FILLER PIC X.
07 数字1-1 PIC 9.

EVALUATE TRUE
WHEN 数字1 NUMERIC
 2桁数字の場合の処理
WHEN 数字1-1 NUMERIC
* 1桁数字の場合の処理
INSPECT 英数字1 REPLACING LEADING ' ' BY '0'
WHEN OTHER
数字以外の場合の処理
END-EVALUATE

これにより、2桁入力はそのまま、1桁入力は桁を右にずらした上で前に'0'を埋め込みます。
2桁数字を英数字1でも、数字1でも操作できます。
数字以外の入力(スペースなど)の場合は、そちらの要件で好きにしてください。

COBOL85といった古いCOBOLは、コメントの* は7カラムに入力してください。
INSPECTは、次の部分参照で置き換えられるかも知れません。

MOVE '0' TO 英数字1(1:1)
    • good
    • 0

NUMERICかの判定は、数字項目で行ってください。

今回の場合は、数字1です。
COBOLでは集団項目でのMOVEなどで、数字項目に容易に文字データが入ることがあります。
そのための判定機能です。

「COBOL IF NUMERIC」でネット検索すれば、事例もすぐに見つかります。
    • good
    • 0

03 英数字1.


05 数字1 PIC 9(2).

または
03 英数字1 PIC X(2).
05 数字1 PIC 9(2).

COBOLは集団項目(構造体)で扱うと、文字扱いになります。従って、その下に数値項目を入れるだけでいいです。
上位項目の英数字1のPIC X(2)は、大昔は記述できなかったのですが、COBOL85くらいには記述可となっているので、そのままで大丈夫と思います。

数字が入っているかは、数字1で判定します。

IF 数字1 NUMERIC
数字が入ってる場合の処理
ELSE
数字でなかった場合の処理
END-IF

上述した通り、集団項目にするだけでREDEFINESも必要ないし、MOVEも不要です。集団項目もREDEFINESも記憶域を共有する定義ですから。

変数宣言はDATA DIVISIONのWORKING-STORAGE SECTIONで行います。
処理部分は、PROCEDURE DIVISIONで行います。
従って、両者を登録原文にする場合は、別々にすることになります。
    • good
    • 0
この回答へのお礼

助かりました

ご返答ありがとうございます!

質問がわかりにくくて申し訳ございません、、、

03 英数字1 PIC X(2).
05 数字1 PIC 9(2).

英数字1に入っている値を数字として数字1のみ出力したい(1桁しか値がない場合、ゼロ埋めして出力)
場合でもご返答いただいた方法で可能でしょうか?

お忙しい中、ご返答いただきとても勉強になりました。
私の質問の仕方が悪く再度質問させていただきました。お手すきの時にご返答いただけると嬉しいです。

お礼日時:2022/06/15 23:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています