
このたび、まったくの未経験のCOBOLをやることになりました。
で、数値データの表し方になんやかやとやたら方法があるようなのですが、それらを互いに「転記」したときに、どういう結果になるものか、皆目わからないんです(環境はCOBOL85でWindows上での開発です)。
テクニックとしては基本だと思うのですが、それでいてどこにも説明されていな~い!フリーのCOBOLツールは見つけてきましたが、使い方が???なもので…。
たとえば、
01 X1 PIC XX (数値が入ってるとします)
01 N1 PIC 99
01 D1 PIC 99 COMP
01 B1 PIC 1(16) BIT
な場合、X1とN1は直接
MOVE N1 TO X1
などとやってもデータは失われないと思うんですが、他の形式での操作は(桁あふれとか無視して)ちゃんと転記できるのでしょうか。
いま特に、D1からX1へというパターンが多いです。1バイトの2進データを、数値の文字列として使おう、というんです。いわば、1バイトを3バイトに展開してやるんです。何も考えずに書けば、
01 D2 PIC 9(4) COMP VALUE 97
01 X2 PIC X(3)
MOVE D2 TO X2
でしょうけど、たぶん'a△△'になるだけのような気がします…。
それとも、
01 N2 PIC 9(4)
MOVE D2 TO N2
MOVE N2 TO X2
などとやっていけたりするのでしょうか。
いったいどうなるのでしょう、いろいろ書いちゃいましたけど、各々の転記の仕組みを教えてください。
また、COBOLの(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。
No.2ベストアンサー
- 回答日時:
ShiozawanoYukiさんはCOBOL未経験とのことですが
ご質問のような数値と文字との間の転記はCOBOL上規約はありますが実際には例外的にしか行われないでしょう。
COBOLコードの厳しい社内ルールを定めてる会社では数値と文字との間の転記は禁止されています。
(桁あふれ、計算時に不能や範囲外の値になったり、ひどいとエラー終了になるか引き起こしたりするからです。)
転記する場合は同じ桁数同士のみで行う社内ルールを決めているところもあります。
(桁あるれ対策です。)
*数値と文字との間の転記はデータの定義で対処します。
COBOLのデータは構造体になっています。
(ご質問のようなデータ構造はフラグ、繰り返しや一時的な変数などには使用しますが普通はレベルを使用したデータ構造で定義します。)
>MOVE N1 TO X1
のコードのデータは
01 X.
02 X1 PIC 99.
01 N1 PIC 99.
などと定義し転記後に文字で使用する場合は”X”(2桁)を使用します。
しかし、ただ”N1”を文字として使用するだけである場合は
01 NX.
02 N1 PIC 99.
と定義し、”NX”(2桁)を文字として使用する方法もあります。
(これは9タイプとXタイプの内容が同じため利用できますがバイナリなどでは転記してから利用します。)
逆に数値から文字に転記する場合は
01 D2 PIC 9(4) COMP VALUE 97.
01 X2.
02 X9 PIC 9(4).
01 XR REDEFINES X2.
02 XR1 PIC X(02).
02 XR2 PIC X(02).
MOVE D2 TO X9.
となり文字として使用する場合は”X2”(4桁)を使用します。
”X2”は数字から転記されたので”0097”が入っています。
”X2”を”△△97”にする場合は”X9”を”ZZZ9”または”ZZZZ”(”Z(04)”)の編集項目で定義すれば実現できます。
(”0”(”0000”)を転記した場合に”ZZZ9”は”△△△0”、”ZZZZ”は”△△△△”になります。)
4桁を上2桁と下2桁で使用する場合は上記のように”X2”を再定義(REDEFINES)し”XR1”、”XR2”を使用します。
(個人的には最上位レベルでの再定義は避けるようにしています。)
*実は転記を悩まずに行うには、実は上の厳しい社内ルールと記した”同じ項目種類、桁数でのみ転記”を行い、項目種類の変換はデータ定義で行うのがポイントです。
*COBOLを理解するためにはデータ構造を理解することが良いと思います。
(命令は他の言語より少なく対応が容易です。ただ、少ない分、自分でコード作成が必要です。ここが他の言語しか知らないプログラマには大変かもしれません。)
後、ピリオドを付けないとのルールがないなら、命令の最後にはピリオドを付けましょう。
(IF文の中では逆に付けません。そのため逆にピリオドがトラブルの原因ともなり、モジュールの最後だけに付けるとの社内ルールを決めているところもあります。)
>また、COBOLの(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。
残念ですがCOBOLは他の言語と違い歴史がある割りには定番類があまりありません。
最新のCOBOLは他の言語のように色々な命令が追加されているようですが、本来は当時のプログラミングの専門家以外でもプログラムを作成することを目標に設計されています。
(当時といっても、もう半世紀も前の話ですが・・・)
そのため、元は限られた命令と定義されたデータ構造だけでプログラムが作成できます。
(バッチであればファイル処理と帳票処理を中心に憶えれば良いと思います。問題はオンラインとWebの場合ですが真似からなれるしかないかもしれません。)
参考になるでしょうか?
No.3
- 回答日時:
文字タイプを数字タイプにMOVEするのは良くないことですね
01 A PIC XX.
01 B PIC 99.
で
MOVE A TO B
は
COMPUTE B = A
と同じです・・・・
★
01 A.
02 A-R PIC 99.
として
IF A NUMERIC
MOVE A-R TO B
ELSE
MOVE 0 TO B.(数値以外であればとりあえず0にする)
★
01 C PIC 9(4) COMP VALUE 97.
これは 一度
数値項目の
01 D PIC 9(4).
01 D-R REDEFINES D PIC XXXX.
で
MOVE C TO D.
元データにサインがある時はPICのところでS9(4)にして、MOVEで受取ると駄目ですね。
この場合は、
01 E PIC S9(9).
01 F PIC -------.や ZZZZZZ-.の編集タイプにすれば
MOVE C TO E.
MOVE E TO F.の2回MOVEですね.
BITタイプもこれの応用です
でも、昔と違い、COMPやCOMP-3などはあまり使わなくても良いのでは・・・・メモリも大きくなったし、レコード長の制限も緩和されているから・・・・
No.1
- 回答日時:
COBOLはしばらく使っていませんが、どなたからも回答がありませんので
記憶を頼りですがお答えします。
先ず、COMP指定がある等は難しく考えないで良いです。
内部で演算の際に、その処理系の演算に適したデータ形式が取られる・・・
位に考えてください(ちょっと乱暴ではありますが)
詳しく知りたかったらマニュアルに書かれています。
するとずっとシンプルに見えてきます。
MOVE N1 TO X1
等、D1からX1へというパターン・・・
数値項目を文字項目に転記・・・は出力の為の編集では頻繁に使います。
桁数にだけは気をつけてください。
MOVE D2 TO X2
想像された”a△△"の意味は解りませんが、結果は”097”でしょう。
MOVE D2 TO N2
MOVE N2 TO X2
は問題ありませんが、後者は桁落ちする場合があります。
上記のすべての例は、符号は考慮されていない(すべて+)事にも注意してください。
・蛇足ですが、数値項目は文字項目に転記できるが、その後演算には使用できない。
・文字項目から数値項目への転記はできない。
(データが確実に数字なら実行時エラーにはならないが・・・)
お役立ちサイト を検索してみましたが、
http://www.koganet.ne.jp/~kitagawa/shome/index.h …
http://www.t3.rim.or.jp/~buchi/proco.html
処理系は違っても、文法規格は国際統一されていますので役に立つのではないでしょうか!
ありがとうございますっ!ちょっと感動入っています。
むかしCを触っていたのでその中でビット仕様を意識する習慣がついてしまったということになりましょうか。
ですと、PICの型(?)を問わず、数値であれば中身のビットを気にせずに転記できるということになるわけでしょうか。であれば、型によるちがいはコンパイラがうまくやってくれるということでしょうか。
97が'a'と解釈できるのは、文字'a'のコードが(たしか)97であるところからきてます。
ちなみにビットで定義した
01 B1 PIC 1(16) BIT
は、転記に際しては文字通りビットを写すだけになりましょうか。たとえば
MOVE '0000000001100001' TO B1 (←97:10進)
に対して
MOVE B1 TO X1
MOVE B1 TO D1
とかやると、それぞれ'a'と97(あれ符号がない?…)になったりするわけでしょうか。
なんかやっぱり難しいですね。=_=
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) COBOL数値転記をCOPY句内での仕様 6 2022/06/15 18:48
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- 数学 3次対称群S3はシロー部分群で因数分解できない この問題の証明が分かりません。できる範囲で教えていた 1 2022/12/13 13:10
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
このQ&Aを見た人はこんなQ&Aも見ています
-
COBOLのMOVEで桁数が異なる場合
その他(プログラミング・Web制作)
-
COBOLで文字タイプを数字タイプに変換する方法
その他(プログラミング・Web制作)
-
S9タイプからXタイプにデータは移行できるのか。(COBOL)
その他(プログラミング・Web制作)
-
-
4
COBOLのCOMP形式について
その他(プログラミング・Web制作)
-
5
COBOLの桁落ち
その他(プログラミング・Web制作)
-
6
【COBOL】文字列から数値項目に転記するにあたって
その他(プログラミング・Web制作)
-
7
COBOLのS9タイプからXタイプへ変換する過程
その他(プログラミング・Web制作)
-
8
COBOLについて
その他(プログラミング・Web制作)
-
9
COBOL 9(02)で定義した変数にマイナス値をセットすると?
その他(プログラミング・Web制作)
-
10
COBOL、項目末尾に空白がある場合削除の方法その他
その他(プログラミング・Web制作)
-
11
COBOLでのNOT = の AND条件
その他(プログラミング・Web制作)
-
12
COBOLの基本的な事なのですが。。。
その他(プログラミング・Web制作)
-
13
COBOLのイニシャライズとバリュー句について
その他(プログラミング・Web制作)
-
14
COBOLで集団項目から符号付き数字項目へのMOVEの結果は?
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
プログラミングを学べる!?進化している子どものおもちゃについて専門家に聞いた!
プログラミングを学べるレゴブロックがあることはご存知だろうか。レゴに限らず最近のおもちゃには、プログラミングの要素がどんどん取り入れられているようだ。「教えて!goo」にも、「プログラミングを学べる子供...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#】textBoxの指定行のデータ...
-
batでレジストリキーから読み取...
-
vbaで出来ますか?
-
VBAでアクセスDBからデータの取...
-
ListViewで表示されたデータの...
-
COBOL数値転記の仕様
-
「Nullの使い方が不正です」の...
-
VBAコンボボックスの内容が反映...
-
C# DataTableに最後に追加した...
-
Excel VBAでフォルダ内の全テキ...
-
Excel VBAで1週間毎にカテゴリ...
-
『列名 '担当者CD' があいま...
-
C#,繰り返し処理での最大値の取...
-
複数のテーブルからのデータ取...
-
エクセルでXY座標に並べられた...
-
VBA 変数名に変数を使用したい。
-
「シフトJIS X 0213」形式の文...
-
VB6でデータベースを変えるとテ...
-
WORD型をCString型に変換する方法
-
配列のペースト出力結果の書式...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# DataTableに最後に追加した...
-
【C#】textBoxの指定行のデータ...
-
VBAコンボボックスの内容が反映...
-
VBAでアクセスDBからデータの取...
-
【VB.NET】Excelの最終行までの...
-
XMLでデータとして画像を指定す...
-
VB2010で、選択した系列を最前...
-
Excel VBAで1週間毎にカテゴリ...
-
COBOL数値転記の仕様
-
【ExcelVBA】値を変更しながら...
-
非同期のプロセス間通信(パイプ...
-
「Nullの使い方が不正です」の...
-
エクセルのマクロ コンボボッ...
-
ExcelVBAで戻り値を返すには
-
Excel VBAでフォルダ内の全テキ...
-
ListViewで表示されたデータの...
-
クリスタルレポートでレコード...
-
Excel VBA で日付を4ケタの数値...
-
ActiveReportのdetailをデータ...
-
アクセスでウェブ上のデータを...
おすすめ情報