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

このQ&Aのポイント
  • IBM COBOLでプログラムを作成しています。COBOL OCCURSを使用してデータの参照方法について教えてください。
  • 質問者はA-TABLEというTABLEを定義し、その中のCからHにデータを代入したいと考えていますが、エラーが出ています。
  • どのようにプログラムを修正すれば正しくデータを代入し参照することができるでしょうか。
回答を見る
  • ベストアンサー

COBOL 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) どなたかよろしくお願いします。

  • moxa
  • お礼率51% (71/137)

質問者が選んだベストアンサー

  • ベストアンサー
  • Fushino
  • ベストアンサー率59% (329/550)
回答No.3

>実行時に「OUTSIDE THE REGION OF THE TABLE.」というようなエラーが出力されてしまいました。 「テーブルの範囲外」を参照しているというエラーのようですから、添字に 1~100以外の値が入っている可能性が大です。 一般的には、以下の部分の再確認となります。 1. 添字の設定前にテーブルを参照、操作していないか。 2. テーブルの上限を超えた場合を考慮しているか。 3. テーブルの上限を超えた場合の処理に誤りはないか。 また、見落としがちなミスとしては、添字の有効桁数不足(今回の場合だと添字を 9(2)で定義していて、99+1で 0になっていた)等もあります。 なお、単純な増減であれば、指標でSET命令(UP BY、DOWN BY)でも可能ですし、今回のように1つの添字(指標)で参照するデータが多いテーブルだと指標を利用する方が処理効率がいい可能性もあります。(コンパイラ次第だとは思いますが)

その他の回答 (3)

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.4

まぁ単純にIDX1が0または100より大きいということでしょう。

回答No.2

>その後メインの処理の部分で「COMPUTE」によって「+1」してから、 >今回質問した処理に突入しています。 >過去に同じようなプログラムを作成した時は、 >添え字ではなくて、指標(INDEXED BY~)を使用しましたが、 >その時は問題なくできています。 >ですが今回は添え字の値を「COMPUTE」によって変化させる事で、 >TABLEの処理を制御したいため、 >うまくいかず困っている次第です。 INDEXED BYで定義しSETを使っていたものを、変数宣言しCOMPUTEでカウントアップするように変えた訳ではないのですよね? 処理内容の具体的な提示がなければ、誰も具体的にアドバイスできませんよ? 問題になっているのは、SEARCH命令中の処理だったりするのでしょうかね?

回答No.1

私の使っていたCOBOLでは、配列にVALUEで初期値を設定できなかったのですが、お使いのCOBOLではできるのですかね? >実行時に「OUTSIDE THE REGION OF THE TABLE.」というようなエラーが出力されてしまいました。 >MOVE I TO C(IDX1) IDX1は、どのように宣言しているのですかね? 初期値が入っていないとか、1~100以外の値が入っているのでは?

moxa
質問者

お礼

ご回答ありがとうございます。 本当に助かります。 配列にVALUE句の初期値設定は、 以前に作成したプログラムで稼動確認できていますので、 問題ないと思います。 「IDX1」の定義は以下の通りです。 01 IDX1 PIC 9(03) VALUE ZERO. その後メインの処理の部分で「COMPUTE」によって「+1」してから、 今回質問した処理に突入しています。 過去に同じようなプログラムを作成した時は、 添え字ではなくて、指標(INDEXED BY~)を使用しましたが、 その時は問題なくできています。 ですが今回は添え字の値を「COMPUTE」によって変化させる事で、 TABLEの処理を制御したいため、 うまくいかず困っている次第です。 何かご存知でしたらお願いいたします。

関連するQ&A

  • COBOL

    COBOLから.NETへ移す作業をしております。 以下の点で詰まりました。 1、pic X(03) COLUMN 7. このうち、COLUMNは何をしているのでしょうか? 調べてもわかりませんでした。 2、 MOVE ZEROとイニシャライズの違いについて MOVE R-TBL TO ZEROとINITIALIZE R-TBL 実際に何が違うのでしょうか? R-TBL内にname pic X(08)という変数と number pic 9(2)という変数があったとすると ZEROの方は name⇒"00000000" で number⇒0 INITHLIZEの方は name⇒""  で number ⇒ 0 でしょうか? 3、HIGH-VALUEについて HIGH-VALUEが取りうる最大値を表すことはわかりました。 VBでもC#でもchar.MAXVALUEみたいに取れます。 name pic X(10)にHIGH-VALUEを入れるとすると.NETで実現しようとすると string name = char.MAXVALUEとなります。 これを 01 R-TBL. 02 box PIC 9(5). 02 id PIC 9(5). に代入したいのですがうまく出来ません。 どうすればよいのでしょうか?

  • COBOLについて

    COBOL初心者なのですが。 COBOLで 01 A.   03 B PIC 9(02).   03 C PIC X(02). MOVE  SPACE  TO  A. とした時、基本項目であるBには何が入っているのでしょうか? 数字項目にSPACEというのはありえないですよね。 どなたかわかる方、教えていただけませんか?

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

    いつもお世話になっています。 WINDOWSでCOBOL85を使いながら、COBOLの勉強をしています。 JAVAを基本情報試験のために勉強したくらいの初心者です。 シーケンシャルファイルでマッチング処理を行う、 小さなプログラムを課題としている途中、 CALL文を使ってサブプログラムを作ってみてくださいと言われました。 そこで質問なのですが、 メインプログラムの集団項目をUSING指定で引数として、 サブプログラムで受け取り、処理をするまではいいのですが、 戻り値をどのようにして受け取ればいいのかが イメージがつかめません。 ・戻り値を受け取るための命令 ・戻り値は1つだと思うのですが、どの変数?に返ってくるのか (集団項目ごと返ってくる?) など、何かあればご助言をいただけないでしょうか? ソースは次の通りです。 よろしくお願いいたします。 ■メイン IDENTIFICATION DIVISION. PROGRAM-ID. MACHING_TEST. (省略) WORKING-STORAGE SECTION.   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. (以下略) ■サブ IDENTIFICATION DIVISION. PROGRAM-ID. JUDGE_FEMALE. DATA DIVISION. LINKAGE SECTION. 01 JUDGE_F.  03 KEY_F PIC 9(01).  03 CHANGE_F PIC X(06).  03 EXCEP_M PIC 9(01). PROCEDURE DIVISION USING JUDGE_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.

  • 何度もすみません(COBOLプログラミング)

    何度もすみません。 下記のようにプログラムを変更して実行しました。 IDENTIFICATION DIVISION. PROGRAM-ID. REI-01. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INFILE ASSIGN TO "C:\COBOL\kamokuUT.txt" ORGANIZATION LINE SEQUENTIAL. SELECT OUTFILE ASSIGN TO "C:\COBOL\UT3.csv" ORGANIZATION LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD INFILE. 01 INREC. 02 I-NUMBER PIC 9(2). 02 I-NAME PIC X(20). 02 I-KAMOKU-SYURUI PIC 9(3). 02 I-KAMOKU-TEN PIC X(3). FD OUTFILE. 01 OUTREC. 02 O-NUMBER PIC 9(2). 02 O-COMMA PIC X(1) VALUE ",". 02 O-NAME PIC X(20). 02 O-COMMA PIC X(1) VALUE ",". 02 O-KAMOKU-SYURUI PIC 9(3). 02 O-COMMA PIC X(1) VALUE ",". 02 O-KAMOKU-TEN PIC X(3). WORKING-STORAGE SECTION. 77 W-FLAG PIC X(1). 01 W-MIDASHI. 02 W-ID PIC X(8) VALUE "社員番号". 02 W-COMMA PIC X(1) VALUE ",". 02 W-NAME PIC X(4) VALUE "名前". 02 W-COMMA PIC X(1) VALUE ",". 02 W-KAMOKU PIC X(4) VALUE "科目". 02 W-COMMA PIC X(1) VALUE ",". 02 W-TEN PIC X(4) VALUE "点数". PROCEDURE DIVISION. PERFORM MAE-SHORI THRU MAE-SHORI-EXIT PERFORM SHU-SHORI THRU SHU-SHORI-EXIT UNTIL W-FLAG = "1" PERFORM ATO-SHORI THRU ATO-SHORI-EXIT STOP RUN. MAE-SHORI. OPEN INPUT INFILE OUTPUT OUTFILE MOVE "0" TO W-FLAG READ INFILE AT END MOVE "1" TO W-FLAG END-READ. MAE-SHORI-EXIT. EXIT. SHU-SHORI. WRITE OUTREC FROM W-MIDASHI. IF I-KAMOKU-TEN >= 70 THEN MOVE I-NUMBER TO O-NUMBER MOVE I-NAME TO O-NAME MOVE I-KAMOKU-SYURUI TO O-KAMOKU-SYURUI MOVE I-KAMOKU-TEN TO O-KAMOKU-TEN WRITE OUTREC FROM INREC ELSE CONTINUE END-IF. READ INFILE AT END MOVE "1" TO W-FLAG END-READ. SHU-SHORI-EXIT. EXIT. ATO-SHORI. CLOSE INFILE OUTFILE. ATO-SHORI-EXIT. EXIT. そして、CSVファイルを開くと、 ____________ 社員番号 名前 科目 点数 社員番号 名前 科目 点数 社員番号 名前 科目 点数 ____________ としか表示されませんでした。 入力ファイルは前回のものと同様です・・・ 参考書を基に色々調べてみたのですが、解決できませんでした。。 回答いただけると幸いです。 宜しくお願い致します。

  • COBOLのプログラムで・・。

    現在COBOLプログラムを作ってまして以下のプログラムで表示結果が「EQUAL」となるようにしたいのですがどうやったらいいでしょうか?回答のほうよろしくお願いします、以下がプログラムです。 IDENTIFICATION DIVISION. PROGRAM-ID. TEST9. DATA DIVISION. * WORKING-STORAGE SECTION. * 01 GR01. 02 DATA1 PIC N(2). * 01 DATA2 PIC N(2). 02 SPACE TO DATA2 * PROCEDURE DIVISION. * MOVE SPACE TO GR01. * MOVE SPACE TO DATA2. IF DATA1 = DATA2 THEN DISPLAY "EQUAL" ELSE DISPLAY "NOT EQUAL" END-IF. * * STOP RUN. * END PROGRAM TEST9.

  • cobolプログラムをCSV出力しても空白に...

    2度目の質問です。 宜しくお願いします。 COBOLを勉強し始めて間もないのですが、プログラムを何とか参考書を見ながら書いており、 エラーが出なくなったのですが、CSVファイルで出力しても空白になってしまい、原因がわからず困惑しております。 以下、プログラムを記載します。 何が原因がわかる方おりましたらアドバイスをいただけると幸いです。 IDENTIFICATION DIVISION. PROGRAM-ID. REI-01. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INFILE ASSIGN TO "C:\COBOL\kamokuUT2.txt" ORGANIZATION LINE SEQUENTIAL. SELECT OUTFILE ASSIGN TO "C:\COBOL\UT2.csv" ORGANIZATION LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD INFILE. 01 INREC. 02 I-NUMBER PIC 9(2). 02 I-NAME PIC X(20). 02 I-KAMOKU-SYURUI PIC 9(3). 02 I-KAMOKU-TEN PIC X(3). FD OUTFILE. 01 OUTREC PIC X(32). 01 W-MIDASHI. 02 W-ID PIC X(8) VALUE "社員番号". 02 W-COMMA PIC X(1) VALUE ",". 02 W-NAME PIC X(4) VALUE "名前". 02 W-COMMA PIC X(1) VALUE ",". 02 W-KAMOKU PIC X(4) VALUE "科目". 02 W-COMMA PIC X(1) VALUE ",". 02 W-TEN PIC X(4) VALUE "点数". 02 W-COMMA PIC X(1) VALUE ",". 01 W-MEISAI. 02 O-NUMBER PIC 9(2). 02 O-COMMA PIC X(1) VALUE ",". 02 O-NAME PIC X(20). 02 O-COMMA PIC X(1) VALUE ",". 02 O-KAMOKU-SYURUI PIC 9(3). 02 O-COMMA PIC X(1) VALUE ",". 02 O-KAMOKU-TEN PIC X(3). 02 O-COMMA PIC X(1) VALUE ",". WORKING-STORAGE SECTION. 77 W-FLAG PIC X(1). PROCEDURE DIVISION. PERFORM MAE-SHORI THRU MAE-SHORI-EXIT PERFORM SHU-SHORI THRU SHU-SHORI-EXIT UNTIL W-FLAG = "1" PERFORM ATO-SHORI THRU ATO-SHORI-EXIT STOP RUN. MAE-SHORI. OPEN INPUT INFILE OUTPUT OUTFILE MOVE "0" TO W-FLAG READ INFILE AT END MOVE "1" TO W-FLAG END-READ. MAE-SHORI-EXIT. EXIT. SHU-SHORI. WRITE OUTREC FROM W-MIDASHI. IF I-KAMOKU-TEN >= 70 THEN MOVE I-NUMBER TO O-NUMBER MOVE I-NAME TO O-NAME MOVE I-KAMOKU-SYURUI TO O-KAMOKU-SYURUI MOVE I-KAMOKU-TEN TO O-KAMOKU-TEN WRITE OUTREC FROM W-MEISAI ELSE CONTINUE END-IF. READ INFILE AT END MOVE "1" TO W-FLAG END-READ. SHU-SHORI-EXIT. EXIT. ATO-SHORI. CLOSE INFILE OUTFILE. ATO-SHORI-EXIT. EXIT. 【出力ファイル.csv】の完成系ですが、 ________________ 社員番号 名前 科目 点数 01 ○○ 010 073   ・     ・   ・    ・   ・     ・   ・    ・ ________________ 【入力ファイル.txt】はこのような形です。 ________________ 01あああああいいいいい010070 ________________ ※入力ファイルの得点が70点以上のファイルのみ出力したいのですが・・・ 長文になってしまいましたが宜しくお願いします。

  • COBOL 1:1のマッチングについて

    こんばんは。プログラム作成が行き詰ってしまったので、 アドバイス頂けると幸いです。 要件:マスタから名前を検索する 出力番号、名前、合計点の3つ 【マスタファイル】 生徒番号  名前 (数字3桁) (全角6文字)   ・       ・   ・       ・   ・       ・ 【トランザクションファイル】 生徒番号   合計点 (数字3桁)  (数字3桁)   ・       ・    ・       ・ 【出力ファイル】 生徒番号 氏名 合計点 001 ○○  □□ DATA DIVISION. FILE SECTION. FD INFILEM. 01 INRECM. 05 IM-ID PIC X(03). 05 IM-NAME PIC X(12). FD INFILET. 01 INRECT. 05 IT-ID PIC X(03). 05 IT-GOUKEI PIC 9(03). FD OUTFILE. 01 OUTREC. 05 O-ID PIC X(03). 05 O-NAME PIC X(12). 05 O-GOUKEI PIC ZZ9. WORKING-STORAGE SECTION. 01 WM-ID PIC X(03). 01 WT-ID PIC X(03). 01 W-GOUKEI PIC 9(03). PROCEDURE DIVISION. PERFORM MAE-SHORI THRU MAE-SHORI-EXIT PERFORM SHU-SHORI THRU SHU-SHORI-EXIT UNTIL WM-ID = HIGH-VALUE AND WT-ID = HIGH-VALUE PERFORM ATO-SHORI THRU ATO-SHORI-EXIT STOP RUN. MAE-SHORI. OPEN INPUT INFILEM INFILET OUTPUT OUTFILE MOVE SPACE TO WM-ID MOVE SPACE TO WT-ID READ INFILEM AT END MOVE HIGH-VALUE TO WM-ID END-READ IF WM-ID NOT = HIGH-VALUE THEN MOVE IM-ID TO WM-ID END-IF READ INFILET AT END MOVE HIGH-VALUE TO WT-ID END-READ IF WT-ID NOT = HIGH-VALUE THEN MOVE IT-ID TO WT-ID END-IF. MAE-SHORI-EXIT. EXIT. SHU-SHORI. IF WM-ID = WT-ID THEN PERFORM KOUSHIN THRU KOUSHIN-EXIT ELSE IF WM-ID < WT-ID THEN PERFORM SHUTURYOKU THRU SHUTURYOKU-EXIT ELSE PERFORM ERRORS THRU ERRORS-EXIT END-IF END-IF. SHU-SHORI-EXIT. EXIT. KOUSHIN. MOVE IT-GOUKEI TO W-GOUKEI MOVE IM-ID TO O-ID MOVE IM-NAME TO O-NAME MOVE W-GOUKEI TO O-GOUKEI WRITE OUTREC READ INFILEM AT END MOVE HIGH-VALUE TO WM-ID END-READ IF WM-ID NOT = HIGH-VALUE THEN MOVE IM-ID TO WM-ID END-IF READ INFILET AT END MOVE HIGH-VALUE TO WT-ID END-READ IF WT-ID NOT = HIGH-VALUE THEN MOVE IT-ID TO WT-ID END-IF. KOUSHIN-EXIT. EXIT. SHUTURYOKU. MOVE IM-ID TO O-ID MOVE IM-NAME TO O-NAME MOVE W-GOUKEI TO O-GOUKEI WRITE OUTREC READ INFILEM AT END MOVE HIGH-VALUE TO WM-ID END-READ IF WM-ID NOT = HIGH-VALUE THEN MOVE IM-ID TO WM-ID END-IF. SHUTURYOKU-EXIT. EXIT. ERRORS. DISPLAY "** ERROR ** IM-ID=" IM-ID " IT-ID=" IT-ID READ INFILET AT END MOVE HIGH-VALUE TO WT-ID END-READ IF WT-ID NOT = HIGH-VALUE THEN MOVE IT-ID TO WT-ID END-IF. ERRORS-EXIT. EXIT. ATO-SHORI. CLOSE INFILEM INFILET OUTFILE. ATO-SHORI-EXIT. EXIT. 上記のソースで実行すると 番号 名前 2桁の謎の数字が1レコードとしてでてきてしまいます。 詳しい方、ご教示くださいませ。

  • COBOLとCの変数定義

    いつもお世話になってます。 今回は、COBOLとC言語の変数定義の事で質問させていただきます。 以下のCOBOLの変数定義をC言語で記述するとどのようになるでしょうか? 01 wkarea. 05 wk-code. pic s9(03) comp. 05 wk-err-code. 10 filler. pic x(01) value '0'. 10 wk-err-code-9 pic 9(05) 412. 05 wk-err-mdl. 10 filler pic x(01) value '0'. 10 wk-err-mdl-9 pic 9(40) value space. 05 wk-e-code 10 filler pic x(01) value 'A'. 10 filler pic x(01) value 'B'. 10 wl-id pic x(02). 10 wk-no pic 9(03) value xero 10 wk-level pic x(01) value low-value. ちょっと手間かも分かりませんが、どなたか詳しい方いらっしゃいましたら、お答え頂けると有難いです。 よろしくお願いします。 .

  • COBOL数値転記の仕様

    このたび、まったくの未経験の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 API 初期フォルダを指定する方法

    COBOL で Windows APIでフォルダの選択を表示しましたが、 初期フォルダを指定する方法がわかりません。どなたか教えて下さい。 COBOLは富士通 NetCOBOLです。 コールバック関数をどうやって記述したらよいのかわかりません。 MOVE LOW-VALUE TO browseinfo. MOVE ハンドル TO hwndOwner. MOVE 17 TO pidlRoot MOVE LOW-VALUE TO lpszTitle-VALUE. STRING "フォルダを選択してください。" DELIMITED BY INTO Title-VALUE. MOVE FUNCTION ADDR(lpszTitle-VALUE) TO lpszTitle. COMPUTE ulFlags = H"01" + H"02" + H"04" + H"4000" MOVE LOW-VALUE TO lParam-VALUE. STRING "D:\CSVLOAD" DELIMITED BY SIZE INTO lParam-VALUE WITH POINTER X. MOVE FUNCTION ADDR(lParam-VALUE) TO lParam. DISPLAY "ulFlags = " ulFlags. CALL "SHBrowseForFolderA" WITH STDCALL LINKAGE USING BY REFERENCE browseinfo RETURNING pID . DISPLAY "SHBrowseForFolderAのReturnValue = " pID IF pID NOT = 0 CALL "SHGetPathFromIDList" WITH STDCALL LINKAGE USING BY VALUE pID BY REFERENCE pszPath RETURNING ReturnValue DISPLAY "SHGetPathFromIDListA = " ReturnValue DISPLAY " pszPath = " pszPath DISPLAY "pszDisplayName-VALUE = " pszDisplayName-VALUE END-IF.

専門家に質問してみよう