【COBOL 書き1-9-12】SUMIFもどき!ACCEPTで入力した値で取り込むデータをハードボイルドに合計する

🧩今日の学び
ACCEPTで入力した値を変数に入れることで、実行時に集計条件を変えられる。
IF文の条件を固定文字列から変数比較に変えることで、SUMIFのような条件一致合計ができる。
ACCEPTREADループの外で一度だけ受けることで、毎回入力を求める事故を防げる。

なるお)係長!たのもー!

係長)な、なんだよ…

な)たのもーっすよ!

係)朝からうるさいな…

な)はいこれ!どうこれ!

📝 COBOL sum.cob
  1IDENTIFICATION DIVISION.
  2PROGRAM-ID. NARUO.
  3
  4ENVIRONMENT DIVISION.
  5INPUT-OUTPUT SECTION.
  6FILE-CONTROL.
  7    SELECT NARUO-FILE
  8        ASSIGN TO "naruo2.txt" ORGANIZATION IS LINE SEQUENTIAL.
  9
 10DATA DIVISION.
 11FILE SECTION.
 12
 13FD NARUO-FILE.
 1401 NARUO-RECORD.
 15    05 SALE-DATE   PIC X(10).
 16    05 ITEM-NAME   PIC X(20).
 17    05 AMOUNT      PIC 9(5).
 18
 19WORKING-STORAGE SECTION.
 2001 EOF-FLAG PIC X VALUE "N".
 21
 2201 TOTAL-AMOUNT PIC 9(7) VALUE 0.
 23
 24PROCEDURE DIVISION.
 25OPEN INPUT NARUO-FILE.
 26
 27PERFORM UNTIL EOF-FLAG = "Y"
 28    READ NARUO-FILE
 29        AT END
 30            MOVE "Y" TO EOF-FLAG
 31            DISPLAY "SEKAI NO OWARI"
 32        NOT AT END
 33            IF ITEM-NAME = "hoshiimo"
 34                ADD AMOUNT TO TOTAL-AMOUNT
 35            END-IF
 36    END-READ
 37END-PERFORM.
 38
 39DISPLAY "TOTAL: " TOTAL-AMOUNT.
 40
 41CLOSE NARUO-FILE.
 42STOP RUN.

係)んー?ちゃんとやったんだな。

な)そらやりますって!

はい、結果!

💻 ターミナル出力 実行結果
SEKAI NO OWARI
TOTAL: 0005000

はい!はい!はいはいはい!

係)だからうるさいって。

SEKAI NO OWARIっていつまで表示してるんだよ。

な)んが!

係)せめてなんの合計なのかぐらいは表示しろよ。

な)んがが!

せめて褒めてから、けなして!

係)ま、OKだな。

な)ほんとすか!ついに係長が褒めた!?

係)だったら、次は、これを「入力対応」にしてみろ。

な)んが!?

ACCEPTした値でSUMIFしたい

係)入力した条件の合計をするようにしてみろ。

な)まだ、おれたちの戦いは終わらない!?

係)そこまで1人でできたんだ、今回もできるだろ。

な)ぎゃふん…

…えーと?入力はACCEPTよね。

まずはACCEPTで受けた文字を条件に合計できるようにしてみよか

入力した文字を受け入れる変数を宣言!

📝 COBOL 検討中
WORKING-STORAGE SECTION.
01 EOF-FLAG PIC X VALUE "N".

01 INPUT-NAME PIC X(20).     ←追加
01 TOTAL-AMOUNT PIC 9(7) VALUE 0.

ACCEPTはループの外で受ける

ACCEPTはルーピングの外じゃないと毎回入力とかになっちゃうから、PERFORMの外でACCEPTしましょう。そうしましょう。

📝 COBOL 検討中
DISPLAY "ENTER".
ACCEPT INPUT-NAME.

PERFORM UNTIL EOF-FLAG = "Y"
    READ NARUO-FILE
        AT END
            MOVE "Y" TO EOF-FLAG
            DISPLAY "SEKAI NO OWARI"
        NOT AT END
            IF ITEM-NAME = "hoshiimo"
                ADD AMOUNT TO TOTAL-AMOUNT
            END-IF
    END-READ
END-PERFORM.

そうそう、まだ、条件が= "hoshiimo“のままなので、ここ直さなくちゃね。

ITEM-NAMEとINPUT-NAMEを比較する

INPUT-NAMEに入力した条件が入って、それをITEM-NAMEと対比させて正誤が決まるようになるんだから、こう!

📝 COBOL 検討中
PERFORM UNTIL EOF-FLAG = "Y"
    READ NARUO-FILE
        AT END
            MOVE "Y" TO EOF-FLAG
            DISPLAY "SEKAI NO OWARI"
        NOT AT END
            IF ITEM-NAME = INPUT-NAME      ← 修正
                ADD AMOUNT TO TOTAL-AMOUNT
            END-IF
    END-READ
END-PERFORM.

で、実行!

📝 COBOL データ
2025-12-31hoshiimo            02500
2026-01-01gyudon2             00900
2026-01-01curry               01500
2026-01-02gyudon2             00900
2026-01-03hoshiimo            02500

今回の条件はgyudon2でいく!

係)2ってなんだ?

な)牛丼2杯ですよ!常識ですよ常識!ほんと常識知らずなんだから!もう!そんなんでおじいさんになっちゃいけません!

係)あ、そ…。

って誰がおじいさんだよ!

な)んで、うっとり!

💻 ターミナル出力 実行結果
gyudon2
SEKAI NO OWARI
TOTAL: 0001800

な)むはーん!!出ちった、でちったよー、係長!

係)だからうるさいんだよ⋯。そしてSEKAI NO OWARI

な)もう「SEKAI NO OWARI」が無い世界なんて世界の終わりよ!

係)何言ってんだ…

おむすび

係)ま、まぁ、昨日からちゃんとやってたんだな。

な)そっすよ!先に帰るとはどういう了見すか!ちゃんと最後まで見ててくださいよ!目を離さないでくださいよ!Look at Me & My Soul!

係)ほんと、うちの犬と同じだな。

な)は?

係)トイレも見ててやらないとできないからな。

な)トイレは見ててほしくないから!

係長のワンポイント

SUMIFは「hoshiimo専用処理」ではない。
入力された条件を使って、実行時に比較内容を変えられる仕組みだ。
よくある誤解は「IFの文字を書き換える」ことだが、実際は比較対象を変数化している。
だから ACCEPT をループの外で一度受け、INPUT-NAME を比較条件として使う。
その結果、コードを書き換えなくても、「gyudon2」でも「curry」でも集計できる。
COBOLは固定処理を書く言語ではなく、“入力によって動作を変える流れ”を設計する言語だ。

【今回の完成コード】

📝 COBOL sum2.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. NARUO.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT NARUO-FILE
        ASSIGN TO "naruo2.txt" ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

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

WORKING-STORAGE SECTION.
01 EOF-FLAG PIC X VALUE "N".

01 INPUT-NAME PIC X(20).
01 TOTAL-AMOUNT PIC 9(7) VALUE 0.

PROCEDURE DIVISION.
OPEN INPUT NARUO-FILE.

DISPLAY "ENTER".
ACCEPT INPUT-NAME.

PERFORM UNTIL EOF-FLAG = "Y"
    READ NARUO-FILE
        AT END
            MOVE "Y" TO EOF-FLAG
            DISPLAY "SEKAI NO OWARI"
        NOT AT END
            IF ITEM-NAME = INPUT-NAME
                ADD AMOUNT TO TOTAL-AMOUNT
            END-IF
    END-READ
END-PERFORM.

DISPLAY "TOTAL: " TOTAL-AMOUNT.

CLOSE NARUO-FILE.
STOP RUN.

係)だから「SEKAI NO OWARI」!!

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

この記事を書いた人

コメント

コメントする

CAPTCHA