【COBOL 書き1-12-7】FDだけではファイルは使えない!OUTPUT-FILEにもSELECT ASSIGNが必要〜ERの悲劇

🧩今日の学び
・FDでレコード構造を定義するだけでは外部ファイルを操作できず、FILE-CONTROLのSELECT ASSIGNで実ファイルと結びつける必要がある。
・同じファイル名に関するエラーが複数箇所へ出ても、一つの定義漏れから連鎖している場合がある。
・エラーメッセージを落ち着いて読み、最初の原因を直すことで、後続のエラーもまとめて解消できる。

なるお)じーちゃん生き返るって言ってるのに、なんて罰当たりなんだか。

係長)うるさいな、なんで生き返るから帰るになるんだよ!100%嘘だろが!

な)真実に少しばかりの曖昧さのスパイスが入ると事実っぽくなるんすよー

係)どこに事実があるんだよ…

な)じーちゃんがいるってとこ?

係)亡くなった人を変なことに使うなよ!

な)いや、勝手に殺さないでくださいよ!

係)生きてるのかよ!もうどうでもいいから、早く直せっての!

な)だって…

係)エラー内容出てるんだから、見てみろよ。

エラーメッセージはまず落ち着いて読む

な)だって…見る気なくなるじゃないすか!なんで英語なんすか!アメリカかぶれっすか!?MLBツアーに行ったぐらいでアメリカマウントっすか!?

って、いない!?

ぐぅぅ、しゃーないエラー内容見るか…

なんか同じこと書かれている感じ?

OUTPUT-FILEが、なんだかんだだって言ってるわ

ってことは、

OUTPUT-FILEがないってこと??

OUTPUT-FILEが原因ではないかと考える

な)でもFDで設定してるし…

📝 COBOL FD部
       FD INPUT-FILE.
       01 INPUT-RECORD.
           05 INPUT-SALE-DATE PIC X(10).
           05 INPUT-ITEM-NAME PIC X(20).
           05 INPUT-AMOUNT    PIC 9(5).

       SD SORT-FILE.
       01 SORT-RECORD.
           05 SORT-SALE-DATE PIC X(10).
           05 SORT-ITEM-NAME PIC X(20).
           05 SORT-AMOUNT    PIC 9(5).

       FD OUTPUT-FILE.          ←ここ
       01 OUTPUT-RECORD.
           05 OUTPUT-SALE-DATE PIC X(10).
           05 OUTPUT-ITEM-NAME PIC X(20).
           05 OUTPUT-AMOUNT    PIC 9(5).

はっ!?こぼるんの反乱か!?人類と牙を向けてきたこぼるんとの死闘を描いた壮大なスペクタクル!

係)うるさいな…、エラーで止まってるのにどうやって牙むくんだよ!

な)エラーを吐き続ける牙?

係)ただ単にお前がまちがってるだけだろ!

な)これだから今どきの中年は…、夢がないんだから…ノット・キャッチ・ザ・ドリームなんだから…

係)早くやれっての!

な)ぷんすかぷんすか!

でも、OUTPUT-FILEがどうにかこうにかってことは間違いなさそうよねぇ…

そういえば、FILE-CONTROLのとこ、INPUT-FILEとSORT-FILEしか設定してないけど、これOUTPUT-FILEも必要なんじゃ?

データを読み込んで、ソートして、最終結果を書き出すって流れだったはずだから、OUTPUT-FILEのファイル操作が必要なので、「OUTPUT-FILEをASSIGNしてない」ってことで、竹下景子さんに全部!

OUTPUT-FILEにもSELECT ASSIGNが必要だった

係)そうなんだけど、なんで竹下景子が出てくるんだよ…?

な)最近昔のクイズ番組見るのにハマってて!はらたいらに全部だと倍率低いから、やっぱり金を多くかっさらって行きつつ、リスクを抑えるなら、竹下景子だよなーって。

ってそんなことはどうでもいいじゃないですか!SELECTでASSIGNキメると、コンパイルがキマっちゃうやつでしょこれ!

係)なんで怪しい方に持っていくんだよ…

な)書き方はINPUT-FILEに準じる形にするってことで…こうっちゅ!

📝 COBOL sample.cob
    ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT INPUT-FILE
               ASSIGN TO "naruo2.txt"
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT SORT-FILE
               ASSIGN TO "sortwork.tmp".
           SELECT OUTPUT-FILE
               ASSIGN TO "naruo2_sorted.txt"
               ORGANIZATION IS LINE SEQUENTIAL.

な)ふぅ!

オレ、やりきった顔してますよね!

係)自分で言うなよ…、だったら、もう一回整形して実行してみろ。

な)ミラクルエクスキューション!!

📝 COBOL 完成?ファイル
  1       IDENTIFICATION DIVISION.
  2       PROGRAM-ID. NARUO.
  3
  4       ENVIRONMENT DIVISION.
  5       INPUT-OUTPUT SECTION.
  6       FILE-CONTROL.
  7           SELECT INPUT-FILE
  8               ASSIGN TO "naruo2.txt"
  9               ORGANIZATION IS LINE SEQUENTIAL.
 10           SELECT SORT-FILE
 11               ASSIGN TO "sortwork.tmp".
 12           SELECT OUTPUT-FILE
 13               ASSIGN TO "naruo2_sorted.txt"
 14               ORGANIZATION IS LINE SEQUENTIAL.
 15
 16       DATA DIVISION.
 17       FILE SECTION.
 18       FD INPUT-FILE.
 19       01 INPUT-RECORD.
 20           05 INPUT-SALE-DATE PIC X(10).
 21           05 INPUT-ITEM-NAME PIC X(20).
 22           05 INPUT-AMOUNT    PIC 9(5).
 23
 24       SD SORT-FILE.
 25       01 SORT-RECORD.
 26           05 SORT-SALE-DATE PIC X(10).
 27           05 SORT-ITEM-NAME PIC X(20).
 28           05 SORT-AMOUNT    PIC 9(5).
 29
 30       FD OUTPUT-FILE.
 31       01 OUTPUT-RECORD.
 32           05 OUTPUT-SALE-DATE PIC X(10).
 33           05 OUTPUT-ITEM-NAME PIC X(20).
 34           05 OUTPUT-AMOUNT    PIC 9(5).
 35
 36       WORKING-STORAGE SECTION.
 37       01 EOF-FLAG      PIC X VALUE "N".
 38       01 COUNT-LOOPING PIC 9(2) VALUE 0.
 39       01 READ-COUNT    PIC 9(2) VALUE 0.
 40       01 LOW-POS       PIC 9(2) VALUE 0.
 41       01 HIGH-POS      PIC 9(2) VALUE 0.
 42       01 LOW-VAL       PIC 9(5) VALUE 0.
 43       01 HIGH-VAL      PIC 9(5) VALUE 0.
 44       01 MEDIAN-VAL    PIC 9(5)V9 VALUE 0.
 45       
 46       PROCEDURE DIVISION.
 47           SORT SORT-FILE
 48               ON ASCENDING KEY SORT-AMOUNT
 49               USING INPUT-FILE
 50               GIVING OUTPUT-FILE.
 51
 52           OPEN INPUT OUTPUT-FILE.
 53           PERFORM UNTIL EOF-FLAG = "Y"
 54               READ OUTPUT-FILE
 55                   AT END
 56                       MOVE "Y" TO EOF-FLAG
 57                   NOT AT END
 58                       ADD 1 TO COUNT-LOOPING
 59               END-READ
 60           END-PERFORM.
 61           CLOSE OUTPUT-FILE.
 62
 63           COMPUTE LOW-POS  = COUNT-LOOPING / 2.
 64           COMPUTE HIGH-POS = LOW-POS + 1.
 65
 66           OPEN INPUT OUTPUT-FILE.
 67           MOVE "N" TO EOF-FLAG.
 68           PERFORM UNTIL EOF-FLAG = "Y"
 69               READ OUTPUT-FILE
 70                   AT END
 71                       MOVE "Y" TO EOF-FLAG
 72                   NOT AT END
 73                       ADD 1 TO READ-COUNT
 74                       IF READ-COUNT = LOW-POS
 75                           MOVE OUTPUT-AMOUNT TO LOW-VAL
 76                       END-IF
 77                       IF READ-COUNT = HIGH-POS
 78                           MOVE OUTPUT-AMOUNT TO HIGH-VAL
 79                       END-IF
 80               END-READ
 81           END-PERFORM.
 82           CLOSE OUTPUT-FILE.
 83
 84           COMPUTE MEDIAN-VAL = (LOW-VAL + HIGH-VAL) / 2.
 85           DISPLAY "COUNT=" COUNT-LOOPING
 86                   " LOW-POS=" LOW-POS " HIGH-POS=" HIGH-POS.
 87           DISPLAY "LOW-VAL=" LOW-VAL " HIGH-VAL=" HIGH-VAL.
 88           DISPLAY "MEDIAN IS " MEDIAN-VAL.
 89           STOP RUN.
 90           
💻 ターミナル出力 実行結果
COUNT=07 LOW-POS=03 HIGH-POS=04
LOW-VAL=00900 HIGH-VAL=01500
MEDIAN IS 01200.0

おお!マジカルミラクルER!

ここは救急救命室だと気づいて呆然とするエンディングへ!

おむすび

係)なんだって…?

な)Execution ResultだからERっすよね、ERは救急救命室だから、ここが救急救命室だと知って愕然とする猿の惑星的なオチだったと?

係)聞いても何もわからんわ…。

な)説明求めておいて、ひどくない!?

係)いいんだよ!おまえのその取ってつけたような説明は!

エラー内容から考えると、定義されていないかアサインされてないかってところだな。

ちゃんと見てれば分かる話を…

成長してそうで、そんなに成長してないことがわかってよかったな!

な)くぅ!

いいんすよいいんすよ!そんなこと言ってたら、絶対に介護なんかしてあげないんだから!床ずれしてても知らないんだから!

係)なんでお前に介護される前提なんだよ!

(まだ続くよー)

係長のワンポイント

SELECT ASSIGNは「ファイル名を書く命令」ではない。
本当は、そのファイルをプログラムで使うことを宣言する仕組みだ。
FDでレコードを定義しただけでは、COBOLはそのファイルを操作できない。
だから宣言が不足すると、「定義されていない」「ファイル名ではない」といったエラーになる。
ファイルを読み込む・書き込むなら、入力も出力もそれぞれSELECT ASSIGNが必要になる。
COBOLは処理を書く言語ではなく、使う資源を明確に宣言する言語だ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA