🧩今日の学び
・FDでレコード構造を定義するだけでは外部ファイルを操作できず、FILE-CONTROLのSELECT ASSIGNで実ファイルと結びつける必要がある。
・同じファイル名に関するエラーが複数箇所へ出ても、一つの定義漏れから連鎖している場合がある。
・エラーメッセージを落ち着いて読み、最初の原因を直すことで、後続のエラーもまとめて解消できる。
なるお)じーちゃん生き返るって言ってるのに、なんて罰当たりなんだか。
係長)うるさいな、なんで生き返るから帰るになるんだよ!100%嘘だろが!
な)真実に少しばかりの曖昧さのスパイスが入ると事実っぽくなるんすよー
係)どこに事実があるんだよ…
な)じーちゃんがいるってとこ?
係)亡くなった人を変なことに使うなよ!
な)いや、勝手に殺さないでくださいよ!
係)生きてるのかよ!もうどうでもいいから、早く直せっての!
な)だって…
係)エラー内容出てるんだから、見てみろよ。

エラーメッセージはまず落ち着いて読む
な)だって…見る気なくなるじゃないすか!なんで英語なんすか!アメリカかぶれっすか!?MLBツアーに行ったぐらいでアメリカマウントっすか!?
って、いない!?
ぐぅぅ、しゃーないエラー内容見るか…
なんか同じこと書かれている感じ?
OUTPUT-FILEが、なんだかんだだって言ってるわ
ってことは、
OUTPUT-FILEがないってこと??
OUTPUT-FILEが原因ではないかと考える
な)でも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に準じる形にするってことで…こうっちゅ!
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.
な)ふぅ!
オレ、やりきった顔してますよね!
係)自分で言うなよ…、だったら、もう一回整形して実行してみろ。
な)ミラクルエクスキューション!!
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は処理を書く言語ではなく、使う資源を明確に宣言する言語だ。


コメント