ジメジメする梅雨のお悩み、一挙解決! >>

COBOLを使ったプログラミングをすることになりました。
全くプログラミング未経験の新卒でして、三ヶ月の研修でjava、PHP、SQLあたりは多少触れましたがほぼほぼど素人です。
練習課題としてINVALID KEY句を使った索引読みをし、別テーブルからデータを持ってきて更新するプログラムを作っているのですが、仕組みがいまいちわからず大変苦戦しています。

MOVE キーとして欲しい値 TO KEY項目.
READ テーブル
INVALID KEY
該当しないデータだったときの処理
NOT INVALID KEY
該当するデータだったときの処理
END-READ.

というような感じだよと(すみません、これも良く分かっておりません)教わったのですが、なぜこれで狙ったレコードを引き出すことができるのでしょう?
例えば会社コード・会社名・住所が入ったデータテーブルAと、幾つかの会社コードだけが登録されたテーブルBがあったとして、Aの会社コードがキー項目になっていたとします。
その場合はBの会社コードをAの会社コードにMOVEし、AをREADする…という流れになると思うのですが、

1、もしAテーブルにおいてMOVEされた会社コードに該当するコードが4行目にあったとしてもいきなり4行目を読んできてくれるのですか?
2、参考サイトなどを見ると「これをキーにして読む」「キーがあれば読む」と書いてあったりするのですが、そもそもキーにする、キーがある・ないというのはどういうことでしょうか?
3、冒頭のMOVEというのはどこに対してMOVEしているのですか?KEY項目というのはWORKING SECTIONで宣言した変数の一つだと思うのですが、これがどうしてテーブルデータを読むときに作用するのですか?

どれもこれも的外れな質問かもしれませんが、本当に困っています。
どうかご教授のほどよろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こういうようなシステムですか?


https://www.support.nec.co.jp/DownLoad.aspx?file …

データーベース機能の部分に詳細な記述があります。これを手掛かりに理解できるかもしれません。(COBOLは使ったことがありませんのであしからず。COBOLは古い言語ですからCOBOLに組み込まれているDATABASEシステムによってやり方が統一されていないのでは?)
    • good
    • 0

昔の記憶を頼りに書いているので間違っているかもしれませんが、



>1、もしAテーブルにおいてMOVEされた会社コードに該当するコードが4行目にあったとしてもいきなり4行目を読んできてくれるのですか?

MOVEしただけでは読み込まれません。
READして読み込まれます。

> 2、参考サイトなどを見ると「これをキーにして読む」「キーがあれば読む」と書いてあったりするのですが、そもそもキーにする、キーがある・ないというのはどういうことでしょうか?

テーブルの定義を最初に行っていると思いますがそこでキー項目の設定を行っています。

> 3、冒頭のMOVEというのはどこに対してMOVEしているのですか?KEY項目というのはWORKING SECTIONで宣言した変数の一つだと思うのですが、これがどうしてテーブルデータを読むときに作用するのですか?

2、同様テーブルの定義を行うときにキー項目の定義も行っています。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCOBOLでのランダムアクセス

すみませんCOBOL初心者です。

FILE-CONTROL.
SELECT URIAGE-MOKUHYOU ASSIGN TO "c:\dat\mokuhyou.dat"
ORGANIZATION IS INDEXEDACCESS MODE IS RANDOM RECORD KEY IS UM-SHITEN-CODE.
DATADIVISION.
  FILESECTION.
  FD URIAGE-MOKUHYOU.
  01 UM-REC.
   05 UM-SHITEN.
    10 UM-SHITEN-CODEPIC X(4).
    10 UM-SHITEN-MEIPIC X(20).
   05 UM-KINGAKUPIC 9(10) OCCURS 12.
WORKING-STORAGESECTION.
  01 TSUKIPIC 9(2).
  01 WK-SHITEN-CODEPIC X(4).

PROCEDUREDIVISION.
  DISPLAY "支店コードを入力してください --> : "
  ACCEPT WK-SHITEN-CODE
  OPEN INPUT URIAGE-MOKUHYOU
  READ URIAGE-MOKUHYOU
   INVALID KEY
    DISPLAY "ERROR; 支店コード = " WK-SHITEN-CODE
   NOT INVALID KEY
    DISPLAY WK-SHITEN-CODE " の売上げ目標は " UM-REC
  END-READ.
  STOP RUN.

というプログラムを作成し、"mokuhyou.dat"という入力ファイルに正しくデータが格納されているのですが、コンパイルは問題なく、実行すると、
JMP0310I-U OPEN ERROR FILE=mokuhyou.dat. 'ACC-METHOD'. PGM=TEST046 ADR=00401258
とまず画面にでて、OKを押すと、
JMP0099I-U FORCED TERMINATION CODE=0310
というエラーになります。
おそらくファイルが正常に読み込めないものと推測されますが、解決法を教えてください。お願いします。

すみませんCOBOL初心者です。

FILE-CONTROL.
SELECT URIAGE-MOKUHYOU ASSIGN TO "c:\dat\mokuhyou.dat"
ORGANIZATION IS INDEXEDACCESS MODE IS RANDOM RECORD KEY IS UM-SHITEN-CODE.
DATADIVISION.
  FILESECTION.
  FD URIAGE-MOKUHYOU.
  01 UM-REC.
   05 UM-SHITEN.
    10 UM-SHITEN-CODEPIC X(4).
    10 UM-SHITEN-MEIPIC X(20).
   05 UM-KINGAKUPIC 9(10) OCCURS 12.
WORKING-STORAGESECTION.
  01 TSUKIPIC 9(2).
  01 WK-SHITEN-CODEPIC X(4).

PROCEDU...続きを読む

Aベストアンサー

う~ん、惜しい。

SELECT URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU.TXT"
  ORGANIZATION IS SEQUENTIAL.
か、
SELECT URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU.TXT"
  ORGANIZATION IS LINE SEQUENTIAL.
にする(行順ファイルがサポートされてて使える場合)

SELECT N-URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU"
  ORGANIZATION IS INDEXED
  ACCESS MODE IS DYNAMIC
  RECORD KEY IS NUM-SHITEN-CODE.
にする。索引ファイルを使う場合、主ファイル名は8文字以内に、拡張子は付けないのが無難。あと、ファイル名は大文字にしとく方が無難(後述)

  05 UM-KINGAKU PIC 9(10) OCCURS 12.
の後ろに
  05 FILLER PIC X(2).
が必要(改行コードのCRとLFの分)

  MOVE UM-REC TO NUM-REC
はやっちゃいけない(テキスト側に改行コードのフィラが増え、テキストファイルと索引ファイルのレコード構造が違ってしまったから。それに各項目ごとに移送してるから不要)

  REWRITE NUM-REC

  WRITE NUM-REC
   INVALID KEY
    REWRITE NUM-REC
  END-WRITE
にする。OUTPUTオープンしてるからファイルは空になってる。つまりレコードは1つも存在しないからREWRITEは出来ない。

「WRITEしてみてINVALID KEYだったらREWRITE」をする理由は、元のテキストファイルに
0001SHITEN-A旧店名、AAに変更済~~~
0001SHITEN-AA~~~~~~~~~~~~
0002SHITEN-B~~~~~~~~~~~~
0003SHITEN-C~~~~~~~~~~~~
のように「同一の支店コードが2つ書いてあった時」のため。REWRITEではなく「同一コードが2つある」とのエラー表示をして終了するのでも良い。

これでダメだとしたら
「使ってるCOBOLに方言があって、テキストファイルを扱う場合のSELECT文に、何か特殊な書き方をしなきゃならない」

「『c:\dat\』のように、ドライブやパス指定を書けない」

「索引ファイルのファイル名には『n-mokuhyou.dat』のように拡張子は付けちゃいけない」

「索引ファイルのファイル名は『n-mokuhyou』のように8文字を超えちゃいけない」

「ファイル名に英文字の小文字を含むと問答無用でエラー」
などの制約が存在する場合がある。

特に索引ファイルでの「拡張子は付けない」と「主ファイル名は8文字以内」は注意。これを守らないとCOBOLが内部でキーファイルのファイル名を自動生成する際に、生成に失敗して実行時にOPEN文で予期せぬエラーが出る可能性が。
古いMS-DOSの仕様を引きずってて廃止して欲しい制約なんだが…。

あと「古いMS-DOSの仕様」に関連してか、ファイル名は大文字を使うのが慣例になっている。ファイル名に小文字を使うと動かないCOBOLがあるらしいので。

う~ん、惜しい。

SELECT URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU.TXT"
  ORGANIZATION IS SEQUENTIAL.
か、
SELECT URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU.TXT"
  ORGANIZATION IS LINE SEQUENTIAL.
にする(行順ファイルがサポートされてて使える場合)

SELECT N-URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU"
  ORGANIZATION IS INDEXED
  ACCESS MODE IS DYNAMIC
  RECORD KEY IS NUM-SHITEN-CODE.
にする。索引ファイルを使う場合、主ファイル名は8文字...続きを読む

QCOBOLの論理演算子について質問です

長いブランクの後、不定期にCOBOLのソースを読むこともある仕事に就いた者です。
本日見た、

IF 区分1 NOT = "001" AND "002"

という記述について質問致します。
区分1は3桁の数字(でも文字列)が入っているのですが、「区分1が、001かつ002でない場合」ということですよね?
何だかこれって変じゃないですか?
どう変かは、うまく表現できないのですが…これだと、全ての入力レコードがELSEに流れてしまう気がします。
でも、実際はそうではありません。不思議です。
(他にも論理演算子で条件判断をしている箇所がありますので、上記のセクションの判断とは無関係なレコードもあると思います)
どなたか、このモヤモヤを解決して頂けないでしょうか。

Aベストアンサー

>IF 区分1 NOT = "001" AND "002"
>ではなく
>IF 区分1 NOT = '001' AND '002'
>でした。(エクセル関数と混同していました)

私の使用していたCOBOLコンパイラでは、引用符をコンパイラオプションで、「'」と「"」のどちらでも使用できたので、あまり気になりませんでした。

>区分が文字列なら、
>IF 区分1 NOT = '001' AND '002'
>IF 区分1 NOT = '001' OR '002'
>どちらも同じ意味になるという事でしょうか?

IF 区分1 NOT = '001' AND '002'
→IF 区分1 NOT = '001' AND 区分1 NOT = '002'
→'001'は偽、'002'も偽、'003'等は真

IF 区分1 NOT = '001' OR '002'
→IF 区分1 NOT = '001' OR 区分1 NOT = '002'
→'001'は真、'002'も真、'003'等も真
と意味のない条件になってしまいます。

>IF 区分1 NOT = "001" AND "002"
>ではなく
>IF 区分1 NOT = '001' AND '002'
>でした。(エクセル関数と混同していました)

私の使用していたCOBOLコンパイラでは、引用符をコンパイラオプションで、「'」と「"」のどちらでも使用できたので、あまり気になりませんでした。

>区分が文字列なら、
>IF 区分1 NOT = '001' AND '002'
>IF 区分1 NOT = '001' OR '002'
>どちらも同じ意味になるという事でしょうか?

IF 区分1 NOT = '001' AND '002'
→IF 区分1 NOT = '001' AND 区分1 NOT = '002'
→'...続きを読む

QCOBOLの計算方法

COBOLの計算方法について解らない事があり、
質問させて頂きます。

例えば、
111.112÷3=37.03733・・・
の計算で小数点第4位の切捨てまたは、切上をしたい場合、
どのようなコーディングをすればよろしいでしょうか?

Aベストアンサー

01 WORK-AREA.
03 WK-ANS PIC S9(09)V9(04).
03 WK-WK PIC S9(09)V9(04).
03 WK-SUTE PIC S9(09)V9(03).
********************
PROSEDURE DIVISION.
********************
* 切り上げ
COMPUTE WK-WK = 111.112 / 3.
ADD 0.0009 TO WK-WK.
MOVE WK-WK TO WK-ANS. *> 切り上げ
* 四捨五入
COMPUTE WK-ANS ROUNDED = 111.112 / 3.
* 切捨て
COMPUTE WK-SUTE = 111.112 / 3.

何も意識しなければ切捨てになります。
四捨五入はROUNDEDか、0.0005を足してもOK。
切り上げは0.0009する。

こんな感じで如何ですか!

QCOBOLのCALL文がいまいちつかめません。

いつもお世話になっています。
WINDOWSでCOBOL85を使いながら、COBOLの勉強をしています。
JAVAを基本情報試験のために勉強したくらいの初心者です。
シーケンシャルファイルでマッチング処理を行う、
小さなプログラムを課題としている途中、
CALL文を使ってサブプログラムを作ってみてくださいと言われました。

そこで質問なのですが、
メインプログラムの集団項目をUSING指定で引数として、
サブプログラムで受け取り、処理をするまではいいのですが、
戻り値をどのようにして受け取ればいいのかが
イメージがつかめません。
・戻り値を受け取るための命令
・戻り値は1つだと思うのですが、どの変数?に返ってくるのか
(集団項目ごと返ってくる?)
など、何かあればご助言をいただけないでしょうか?

ソースは次の通りです。
よろしくお願いいたします。

■メイン
IDENTIFICATIONDIVISION.
PROGRAM-ID.MACHING_TEST.
(省略)
WORKING-STORAGESECTION.
  01 JUDGE_F.
   03 KEY_F    PIC 9(01).
   03 CHANGE_F    PIC X(06).
   03 EXCEP_M    PIC 9(01).
(省略)
CALL "JUDGE_FEMALE" USING JUDGE_F
ON EXCEPTION
  DISPLAY N"エラーです。プログラムを終了します"
  STOP RUN

  NOT ON EXCEPTION
   IF EXCEP_M = 9
THEN
MOVE"ERRER!"TO FEMALE_OUT
ELSE
 IF EXCEP_M = 1
THEN
MOVE CHANGE_F TO FEMALE_OUT
 END-IF
   END-IF
   END-CALL.
(以下略)

■サブ
IDENTIFICATIONDIVISION.
PROGRAM-ID.JUDGE_FEMALE.

DATADIVISION.
LINKAGESECTION.
01 JUDGE_F.
 03 KEY_FPIC 9(01).
 03 CHANGE_FPIC X(06).
 03 EXCEP_MPIC 9(01).

PROCEDUREDIVISIONUSINGJUDGE_F.

IF KEY_F = 1
 THEN
  MOVE "オトコ" TO CHANGE_F
  MOVE 1 TO EXCEP_M
 ELSE
  IF KEY_F = 2
THEN
 MOVE "オンナ" TO CHANGE_F
 MOVE 1 TO EXCEP_M
ELSE
 MOVE 9 TO EXCEP_M
END-IF
END-IF.
PROGRAM-END.
 STOP RUN.

いつもお世話になっています。
WINDOWSでCOBOL85を使いながら、COBOLの勉強をしています。
JAVAを基本情報試験のために勉強したくらいの初心者です。
シーケンシャルファイルでマッチング処理を行う、
小さなプログラムを課題としている途中、
CALL文を使ってサブプログラムを作ってみてくださいと言われました。

そこで質問なのですが、
メインプログラムの集団項目をUSING指定で引数として、
サブプログラムで受け取り、処理をするまではいいのですが、
戻り値をどのようにして受け取ればいいのかが
...続きを読む

Aベストアンサー

メインからは
CALL "JUDGE_FEMALE" USING JUDGE_F
とJUDGE_Fいう項目を使ってサブをコールしてます。
質問文では書かれてませんが、CALLする前に、KEY-Fに1、2、もしくはそれ以外がセットされてるんだと思います。
つまり、8バイトの頭1バイトだけセットしてコールするわけです。
  01 JUDGE_F.
   03 KEY_F     PIC 9(01).
   03 CHANGE_F     PIC X(06).
   03 EXCEP_M     PIC 9(01).

サブの側ではコール元のプログラムが、KEY-Fに何をセットしてきたかを判定して、CHANGE-FとEXCEP-Mにデータをセットしています。

メインはサブから返されたJUDGE-Fを使って引き続き処理を行います。集団項目で渡して集団項目で帰ってくるだけです。この場合、CHANGE-FとEXCEP-Mをセットするためのサブプログラムですが、作りようによって何項目でも返せます。(必要なだけ定義して集団項目にすればよいです)

メインからは
CALL "JUDGE_FEMALE" USING JUDGE_F
とJUDGE_Fいう項目を使ってサブをコールしてます。
質問文では書かれてませんが、CALLする前に、KEY-Fに1、2、もしくはそれ以外がセットされてるんだと思います。
つまり、8バイトの頭1バイトだけセットしてコールするわけです。
  01 JUDGE_F.
   03 KEY_F     PIC 9(01).
   03 CHANGE_F     PIC X(06).
   03 EXCEP_M     PIC 9(01).

サブの側ではコール元のプログラムが、KEY-Fに何をセットしてきたかを...続きを読む

QCOBOLで文字タイプを数字タイプに変換する方法

すいませんコボル初心者の者です。周りに聞く人がいずに困っています。
アドバイスよろしくおねがします。

例えば、IN-SUNPO PIC X(7)に "0.25"や"0.025"と値が入っているとします。
この項目を OUT-SUNPO PIC 9(4)V9(3)にセットして出力したいのですが
いい方法が考えつきません。
どのようにすれば実現するのでしょうか。
また、IN-TANAK PIC 9(8)をOUT-TANKA PIC X(10)に左詰でセットするために
入力項目の頭のゼロをどう処理していいかもわかりません。
考えても結論がでませんでしたので、投稿しました。
宜しくお願いします。

Aベストアンサー

★ひとつ目の質問。
いろいろと特殊命令を使いますが簡単にコーディングできますし、覚えておくと便利です。

01 wk-seisu.
 03 wk-seisu9 pic 9(4).
01 wk-syosu.
 03 wk-syosu9 pic 9(3).

*<< in-sunpo の空白を0に置き換える >>
inspect in-sunpo replacing all " " by "0".

*<< 「.」で判断して整数と少数に分ける >>
unstring in-sunpo delimited by all "." into wk-seisu wk-syousu.

*<< 分けた数字を合わせる >>
compute in-sunpo = wk-seisu9 + (wk-syosu9 / 1000).



★ふたつ目は他の方が回答されているのと同じです。

*<< 符号(-)があるとき >>
01 wk-tanka.
 03 wk-kanka9  pic -------9.
*<< 符号(-)がないならこれでもいいです >>
01 wk-tanka.
 03 wk-tanka9  pic zzzzzzz9.

move in-tanta to wk-tanka9.
move wk-tanka to out-tanka.



お役に立つかちょっと不安ですが(^^;)
コボル言語は他の言語と違って、ある程度法則を覚えると簡単です。
頑張ってくださいね。

★ひとつ目の質問。
いろいろと特殊命令を使いますが簡単にコーディングできますし、覚えておくと便利です。

01 wk-seisu.
 03 wk-seisu9 pic 9(4).
01 wk-syosu.
 03 wk-syosu9 pic 9(3).

*<< in-sunpo の空白を0に置き換える >>
inspect in-sunpo replacing all " " by "0".

*<< 「.」で判断して整数と少数に分ける >>
unstring in-sunpo delimited by all "." into wk-seisu wk-syousu.

*<< 分けた数字を合わせる >>
compute in-sunpo = wk-seisu9 + (wk-syosu9...続きを読む

QCOBOLのIFの入れ子について

COBOLを最近学び出してわからないのですが、IF文の中のIF文はピリオドが要るのですか?それとも最初のIF文の終わりに(フローチャ-トの交わるところ)までピリオドは打たないのですか?初歩的な質問ですいませんがお願いします。

Aベストアンサー

COBOLでのIF分は最後にピリオドにつけます。
IF ○=□ (THENは省略)
IF △=△ ☆☆ ELSE ★★
ELSE
IF ×=□ ●● ELSE ■■.
という具合です。
ピリオドが途中にはいると、センテンスがピリオドで完結していまいますので、ピリオド以降が違うセンテンスになってしまいます。

QCOBOL数値転記の仕様

このたび、まったくの未経験の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の(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。

このたび、まったくの未経験のCOBOLをやることになりました。
で、数値データの表し方になんやかやとやたら方法があるようなのですが、それらを互いに「転記」したときに、どういう結果になるものか、皆目わからないんです(環境はCOBOL85でWindows上での開発です)。
テクニックとしては基本だと思うのですが、それでいてどこにも説明されていな~い!フリーのCOBOLツールは見つけてきましたが、使い方が???なもので…。
 たとえば、

 01 X1 PIC XX (数値が入ってるとしま...続きを読む

Aベストアンサー

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の場合ですが真似からなれるしかないかもしれません。)


参考になるでしょうか?

ShiozawanoYukiさんはCOBOL未経験とのことですが
ご質問のような数値と文字との間の転記はCOBOL上規約はありますが実際には例外的にしか行われないでしょう。

COBOLコードの厳しい社内ルールを定めてる会社では数値と文字との間の転記は禁止されています。
(桁あふれ、計算時に不能や範囲外の値になったり、ひどいとエラー終了になるか引き起こしたりするからです。)
転記する場合は同じ桁数同士のみで行う社内ルールを決めているところもあります。
(桁あるれ対策です。)

*数値と...続きを読む

QCOBOLの改行

COBOLでWRITEを使って<1>のように出力したいのですがAFTER(もしくはBEFORE) 1 LINE と指定すると<2>のように一行空いて出力されてしまうのはなぜなのでしょう。
ちなみにAFTERを指定しないと<3>のように改行が入らず出力されます。

<1>
AAAAAAAAAA
BBBBBBBBBB
CCCCCCCCCC

<2>
AAAAAAAAAA

BBBBBBBBBB

CCCCCCCCCC

<3>
AAAAAAAAAABBBBBBBBBBCCCCCCCCCC

Aベストアンサー

どんなOSのどんなCOBOLでしょうか?

ファイル出力のレコード記述は、どのようになっていますか?

私は長年、汎用機のCOBOL85を経験していますが、プリンタ制御文字に「空白」を指定する方法で、こういったトラブルには無縁でした。

FD LIST-FILE.
01 LIST-REC.
03 FILLER PIC X.
03 LIST=FLD PIC X(132).


MOVE SPACE TO LIST-REC.
→先頭1文字に空白を入れることで、出力毎に1行改行

QCOBOLの数字チェック

COBOLのコーディングで
ある項目が数字かどうかのチェックをする記述はどのようでしたか?
NUMERICチェックです。
久しぶりにコーディングしなければならないのですが、すでにマニュアル類も見当たりません・・・。

Aベストアンサー

たとえば
02 AAA  PIC 9(5).
をCHECKするには、
PROCEDURE DIVISION
で AAAに数字が入っていればZZZZに行く
IF AAA NUMERIC GO TO ZZZZ.
AAAに数字以外が入っていればZZZZに行く
IF AAA NOT NUMERIC GO TO ZZZZ.
ちなみに英字CHECKはNUMERICの代わりに
ALPHABETICで

QCOBOL OCCURSで指定したデータの参照の仕方

IBM COBOL でプログラムを作成しています。
初歩的な質問で恥ずかしいのですが、どなたか教えていただけますか。

まず、以下のようなTABLEを定義しました。

01 A-TABLE.
03 B OCCURS 100.
05 C PIC X(08) VALUE SPACE.
05 D PIC X(02) VALUE SPACE.
05 E PIC X(08) VALUE SPACE.
05 F PIC X(05) VALUE SPACE.
05 G PIC X(05) VALUE SPACE.
05 H PIC X(05) VALUE SPACE.


その後に、INPUTファイルからREADしたデータのうち、必要な部分だけを
該当のTABLEに添え字を使用して代入していく処理を作成したいと思っています。

その場合に、上記の「C」~「H」に代入するにはどうすればよいでしょうか?
また後続の処理で直接その値を参照したいのですが、どうすれば良いでしょうか?

私の考えられる範囲で以下のようにプログラムしましたが、
実行時に「OUTSIDE THE REGION OF THE TABLE.」というようなエラーが出力されてしまいました。


MOVE I TO C(IDX1)
MOVE J TO D(IDX1)
MOVE K TO E(IDX1)
MOVE L TO F(IDX1)
MOVE M TO G(IDX1)
MOVE N TO H(IDX1)


どなたかよろしくお願いします。

IBM COBOL でプログラムを作成しています。
初歩的な質問で恥ずかしいのですが、どなたか教えていただけますか。

まず、以下のようなTABLEを定義しました。

01 A-TABLE.
03 B OCCURS 100.
05 C PIC X(08) VALUE SPACE.
05 D PIC X(02) VALUE SPACE.
05 E PIC X(08) VALUE SPACE.
05 F PIC X(05) VALUE SPACE.
05 G PIC X(05) VALUE SPACE.
05 H PIC X(05) VALUE SPACE.


そ...続きを読む

Aベストアンサー

>実行時に「OUTSIDE THE REGION OF THE TABLE.」というようなエラーが出力されてしまいました。

「テーブルの範囲外」を参照しているというエラーのようですから、添字に 1~100以外の値が入っている可能性が大です。

一般的には、以下の部分の再確認となります。
1. 添字の設定前にテーブルを参照、操作していないか。
2. テーブルの上限を超えた場合を考慮しているか。
3. テーブルの上限を超えた場合の処理に誤りはないか。

また、見落としがちなミスとしては、添字の有効桁数不足(今回の場合だと添字を 9(2)で定義していて、99+1で 0になっていた)等もあります。

なお、単純な増減であれば、指標でSET命令(UP BY、DOWN BY)でも可能ですし、今回のように1つの添字(指標)で参照するデータが多いテーブルだと指標を利用する方が処理効率がいい可能性もあります。(コンパイラ次第だとは思いますが)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報