【COBOL 書き1-9-11】単純合計コード完成からの条件合致合計のSUMIFに昇華〜ひとりでできるもん!

🧩今日の学び
・COBOLでは、読み込んだ金額をTOTAL-AMOUNTADDすることで単純合計を作れる。
SUMIF的な条件付き合計は、特別な命令ではなく「READループの中でIF判定して足す」処理構造で実現する。
・COBOLは関数を呼ぶだけの言語ではなく、条件と流れを組み立てて処理を作る言語だ。

なるお)んじゃ、改行コードは気をつけるという標語をトイレに貼っときますから、みんなで確認しましょう!

今日の敵は明日も敵!はい!

係長)いらんことしてないで、合計しろ。

なるお)ほ?

係)だから、金額を合計してみろって。

な)なんの?

係)今何やってるのか忘れてんのか!

な)えー、マイナスドライバーでプラスのネジ穴を回したら、ずるってなめちゃったから、とりあえず、なかったことにしておく感じとか?

係)何の話だよ…

な) なんでプラスドライバー置いてないのって話ですよ!

係)どうでもいいわ!

いいから、お前が贅肉を溜め込むために使ってる金額を合計しろって言ってんだよ!

な)また、溜めハラですか…

係)SUMの流れをいまやってるんだろが。

今は1件ずつ表示しただけだ。でも本当にやることはなんだった?データを読み込んで、合計することだろ。

な)あー、途方もなく昔の話なんで…long long time agoじゃ片付けられないぐらい遠い昔の話なんで。金星ぐらい遠いんで。でも金星は一番地球から近いという矛盾に悩まされ続ける。

困ったもんですね…

係)困ってるのはお前だけだろ…

読み込んだ金額を合計していく

係)そんなことはいいから、これを合計して

💡 ポイント
2500
900
1500
900
2500

こうしたいってわけだ。

💡 ポイント
8300

これをどうやるんだって話だ。

データを読み込むってだけで、合計はすでに一回やった話だ。

だからやってみろ。

な)あい…

READループの中でADDTOTAL-AMOUNTに加算し続ける

うー、データを読み込んで、そのなかの金額を足していく変数を別途作って、それを足していくって感じかな?

今回は金額がAMOUNTだから、TOTAL-AMOUNTという変数をつくることにしといて…

TOTAL-AMOUNTにゼロを入れて、ルーピングにイン

データを読み込むとAMOUNTに1行目の金額が入る

AMOUNTTOTAL-AMOUNTを足し合わせる

んで、次のルーピングへイン

データが最後まで行ったら、EOF-FLAGにY入れて合計を表示して終わり…

みたいなんで、どうざましょ?

係)それで作ってみろ。

な)あーい

📝 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            ADD AMOUNT TO TOTAL-AMOUNT
 34    END-READ
 35END-PERFORM.
 36
 37DISPLAY "TOTAL: " TOTAL-AMOUNT.
 38
 39CLOSE NARUO-FILE.
 40STOP RUN.

こんなんでどうでげす?

係)実行してみろ。

な)あいー

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

おほ!一発ツモ!裏ドラ8で、クソみたいなリーのみが三倍満すよ!完璧!ミラクルワンダーボーイ!

係)ミラクルだと困るんだよ!そもそもどこにドラ8の要素あるんだよ…

な)なんかミラクルがリアルに置き換わってきたって感じですね!

係)……

な)どしたんす?怖い顔して?あ、いつもか! ケラケラ

係)……間違えろよ!!

な)は!?

係)なにちゃんとしたコード一発で出してきてんだ!正解を一発で書くなんてお前らしくないだろが!お前を困らせるのが俺の日課だってのに!

な)また、なに言ってんのこの人!?

係)わかった。よーくわかった。

だったら、条件合致合計のSUMIF作ってみろ!

な)へ!?

係)いいか、俺は帰るから、やっとけよ!明日報告しろ!

な)…ほんとに帰りやがった…

くそー!あのおっさん、なに変な逆ギレしてんの!?ほんと老害 over 老害なんだから!ガンカー・プンスムを超える人類未踏のTop老害ヤーなんだから!

条件付き合計はIFで分岐する

ま、いいや…

…んで…SUMIFって、条件指定して、その条件に合う値を足していくってやつだから…

例えば、干し芋だけ取り出して、合計ってかんじよね

📝 COBOL naruo2.txt
2025-12-31hoshiimo            02500
2026-01-01gyudon2             00900
2026-01-01curry               01500
2026-01-02gyudon2             00900
2026-01-03hoshiimo            02500

データがこうで

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

変数がこうだから、

📝 COBOL 検討中
IF ITEM-NAME = "hoshiimo"
    ADD AMOUNT TO TOTAL-AMOUNT
END-IF

ITEM-NAMEを条件判断で、条件を満たせば合計にプラスするみたいなことを考えてー、これをルーピングに組み込んじゃうみたいな?

📝 COBOL sum.cobの一部
PERFORM UNTIL EOF-FLAG = "Y"
    READ NARUO-FILE
        AT END
            MOVE "Y" TO EOF-FLAG
            DISPLAY "SEKAI NO OWARI"
        NOT AT END
            ADD AMOUNT TO TOTAL-AMOUNT
    END-READ
END-PERFORM.

DISPLAY "TOTAL: " TOTAL-AMOUNT.

IFをループの中へ組み込む

組み込むのはっと…NOT AT ENDの中よね。今のADD AMOUNT TO TOTAL-AMOUNTと置き換えると。

📝 COBOL sum.cobの一部
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.

DISPLAY "TOTAL: " TOTAL-AMOUNT.

んで全体整理して…

📝 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

うほー!てやんでぃ!

ぐふふ、また係長の悔しそうな顔が目に浮かぶ、悔やんで悔しがれってんだ!

おむすび

くそーこうなったら、明日呑気な顔して出社してきたら、ギッコンバッタンにして、あーして、こーして…

……

殺されちゃうかな…短い命なのかな…セミなのかな

でも地上に出てきたセミの命って1か月とかにもなるっちゅーから長いとか言われるようになったわね。

でも1か月だからね!もうそれ余命だからね!

…ま…帰ろ…

(次回に続く)

係長のワンポイント

SUMIFは特別な命令じゃない。
「読む → 条件判定 → 足す」を組み合わせた処理構造だ。
よくある誤解は「SUMIFという魔法がある」だが、実際はIFで分岐しているだけだ。
だから条件を変えれば、「干し芋だけ」「900円以上だけ」など自由に集計できる。
その結果、ループの中で“データを選別しながら処理する”という考え方が生まれる。
COBOLは関数を呼ぶ言語ではなく、条件と流れを組み立てて処理を作る言語だ。

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

この記事を書いた人

コメント

コメントする

CAPTCHA