
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は不要になりデータ部での定義はどうすればよいか?
色々と記載してしまったのですが、各々の仕組みについて教えてください。
No.1ベストアンサー
- 回答日時:
>数字項目として表示される
「表示される」って、何をしたいのか分かんないですが、数字として再定義は問題なくできますよ。
>IF 英数字1 NUMERIC
文法はうる覚えなのですが、「IS NUMERIC」じゃなかったかな?
>MOVE 英数字1 TO 数字1
これは、意味ないです。
英数字1を再定義したものが、数字1なので、わざわざ代入する必要はありません。
>ソースプログラムに記載するか、登録集原文に記載するか
変数の定義はDATAディビジョン、命令はPROCEDUREディビジョンにしか書けません(少なくとも私が知っているCOBOLでは)。
必然的に、変数の定義は登録集原文。判定のロジックはソースプログラムにコーディングするのが一般的だと思います。
>IF文の場合、REDEFINESは不要になりデータ部での定義はどうすればよいか?
NUMERICチェックは、英数字1で判定する必要があります。これを数字1で判定するとおかしな結果になることがあります(例えば,"AA"も数字と見なされる)。
NUMERICチェックで数字と判定された後に、実際の数値変数として使用する場合は、数字1を使います。
よって、「REDEFINESは不要」ってことにはなりません。
ご返答ありがとうございます。
わかりにくくて申し訳ございません、、、
「表示される」はゼロ埋めして出力したいということです。
例えば、
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のみ出力したいです。
お忙しい中、わかりにくい質問に親切にご返答いただいてありがとうございます!
追加で教えていただけると幸いです。
No.5
- 回答日時:
表示だけの問題なのか、その項目を計算に使う場合もあるのですか?
英数字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)
No.4
- 回答日時:
表示だけの問題なのか、その項目を計算に使う場合もあるのですか?
英数字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)
No.3
- 回答日時:
NUMERICかの判定は、数字項目で行ってください。
今回の場合は、数字1です。COBOLでは集団項目でのMOVEなどで、数字項目に容易に文字データが入ることがあります。
そのための判定機能です。
「COBOL IF NUMERIC」でネット検索すれば、事例もすぐに見つかります。
No.2
- 回答日時:
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で行います。
従って、両者を登録原文にする場合は、別々にすることになります。
ご返答ありがとうございます!
質問がわかりにくくて申し訳ございません、、、
03 英数字1 PIC X(2).
05 数字1 PIC 9(2).
英数字1に入っている値を数字として数字1のみ出力したい(1桁しか値がない場合、ゼロ埋めして出力)
場合でもご返答いただいた方法で可能でしょうか?
お忙しい中、ご返答いただきとても勉強になりました。
私の質問の仕方が悪く再度質問させていただきました。お手すきの時にご返答いただけると嬉しいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- その他(プログラミング・Web制作) 文字コード及びフォントに関する次の記述を読み,適切なものをすべて選べ。 ASCIIとは,英数字だけを 4 2023/01/11 19:10
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- PHP c言語 文字 - '1'+26 3 2022/03/26 20:58
- C言語・C++・C# int temp = 0; if(isdigit(arr[i])){//文字が数字であれば(0~9) 1 2022/03/27 01:37
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
多量のSUMIF式を軽くしたい
-
特定のデータの抽出方法を教え...
-
メモ帳(テキストデータ)をExc...
-
この行は既に別のテーブルに属...
-
配列でデータが入っている要素...
-
VBA 空白セルを削除ではない方...
-
EXCELVBAでSQLserverからデータ...
-
二分探索の平均探索回数
-
ユーザーフォームのテキストボ...
-
[C言語] コメント文字列を無視...
-
【エクセル】測定時間がバラバ...
-
ACCESSからEXCELに出力する際、...
-
CString型の文字列連結について
-
エクセルで2つの時系列のデー...
-
サムチェックのルール
-
COBOLの定義について
-
VBA 該当データがない時 ...
-
不規則なデータのfft処理
-
Excel VBAでのオートフィルター...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
VBA 空白セルを削除ではない方...
-
メモ帳(テキストデータ)をExc...
-
EXCELVBAでSQLserverからデータ...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
CString型の文字列連結について
-
ACCESSからEXCELに出力する際、...
-
ユーザーフォームのテキストボ...
-
エクセルで2つの時系列のデー...
-
C# でDataTableの更新を高速化...
-
特定のデータの抽出方法を教え...
-
C# ソケット通信でデータ受信時...
-
二分探索の平均探索回数
-
Excel VBAでのオートフィルター...
-
ブレーカー落ちで壊れたりしな...
-
Accessで該当データにフラグを...
-
VBAを使ってOutlookメール本文...
おすすめ情報