🧩今日の学び
・MOVEそのまま入れる、COMPUTE計算してから入れるという根本の違いを理解
・NUMVAL の「人は信じない思想」がCOBOLの設計を左右していることが判明
・処理は“変換 → 計算 → 格納”の流れで組むとエラーが激減する
今日のコード
*> 数値へ変換
MOVE FUNCTION NUMVAL(F-QUANTITY-A) TO N-QUANTITY.
MOVE FUNCTION NUMVAL(F-UNIT-PRICE-A) TO N-UNIT-PRICE.
MOVE FUNCTION NUMVAL(F-TAX-RATE-A) TO N-TAX-RATE.
*> 計算
COMPUTE N-LINE-NET = N-QUANTITY * N-UNIT-PRICE
COMPUTE N-LINE-TAX = N-LINE-NET * N-TAX-RATE
COMPUTE N-LINE-GROSS = N-LINE-NET + N-LINE-TAX
なるお)MOVEだから入れるんだよね。
FUNCTION NUMVAL(F-QUANTITY-A)を N-QUANTITYに入れる?
FUNCTION NUMVAL(F-QUANTITY-A)ってなにさ。
係長)FUNCTION NUMVAL(文字列) ってのは 文字列を数値に変換する組み込み関数 だ。
な)へ?文字列って「屍や 兵どもが ゾンビへと」とか?そんな俳句を数字にできるんすか?
係)どうでもいいことはすぐに思いつく役に立たない能力どうにかしろよ。
な)あ、「屍や」が季語です多分。夏だと溶けるんで。
係)あっそ。
「“123”」とか「“45.67”」みたいに数字っぽい文字列を、本物の数値データに変えてくれるんだよ。
- “123” → 123(数値)
- “45.67” → 45.67(数値)
- ” 89″(前後にスペースあり) → 89(数値に変換)
CSVで読んだ数量や単価は、もともと文字列として入ってるから、こういうのを扱うときに使うわけだ。
F-QUANTITY-A は PIC X(10) みたいな「文字列フィールド」だからな、そのまま計算しようとすると「数字じゃねぇよ!」って怒られる。
そこで NUMVAL をかませて N-QUANTITY(数値フィールド)に突っ込むというわけだ。
NUMVALで文字列を数値に変換する世界観
な)へー、そんな機能があるんですねー。
それじゃそもそも入力する人間を信じいないという性悪説がCOBOLというわけですね。
人間は生まれた瞬間から悪に染まっていると。
だからこの世の中は悪意に染まっているんですね。黒いんですね。漆黒ですね。漆黒の騎士ってわけですね!かっこいいっすね!
係)なんでそんな飛躍になるんだよ。
な)だって、NUMVALとか必須チェックとか、最初から「人間は絶対間違える」って前提で作られてるじゃないですか!
係)……まぁ、そこは否定できねぇな。
COBOLってのは、銀行や保険みたいに「間違えたら命取り」って世界で育った言語だ。
だから「入力は絶対に信用するな」「バリデーションしろ」って思想が根っこにある。
な)ほら、俺はすべてを信じない。お前も信じない!つまり、係長も信じられてないってことっすよ!
係)俺もお前を一切信じてないけどな。
でもまぁ、COBOLの世界観をよく表してるな。
「信じない」ってのは悪口じゃなくて、守るための仕組みなんだよ。
な)守るため?やっぱり騎士?
係)そうだ。人もシステムも、最初から「完璧に動く」なんて思ってたら、事故ったときに全部終わる。
だからCOBOLは「絶対に疑え」「チェックしろ」「おかしかったらそこで止めろ」って作りになってる。
な)つまり係長が俺のこと信じないのも…俺を守るため!?
係)んなわけあるかよ。
お前を信じたら、それを全部直すために、俺がサービス残業しなけりゃならねーだろうが。
な)いやーわかりましたよ、係長の部下を思う気持ちが!
係)え、いや…まぁな(テレっ)
バリデーション思想:人間を信じないCOBOLの流儀
*> 計算
COMPUTE N-LINE-NET = N-QUANTITY * N-UNIT-PRICE
COMPUTE N-LINE-TAX = N-LINE-NET * N-TAX-RATE
COMPUTE N-LINE-GROSS = N-LINE-NET + N-LINE-TAX
N-LINE-NET = N-QUANTITY * N-UNIT-PRICE
な)とあるから、もしかしてCOMPUTEは計算するなのかな?
係)珍しく正解だな。こりゃ今日で地球消失するんだな。
な)いやー(テレテレ)
係)なに照れてんだよ…地球なくなるんだぞ。
COMPUTE は「計算しろ」って命令。
普通に「=」で代入する代わりに、式を計算させて結果を変数に入れる。
COMPUTE 変数 = 式
って書くと、その式を計算して変数に MOVE するイメージだな。
な)えーなんでMOVEじゃないのにMOVEしちゃうんすかー。
そんなややこしいことするから、みんなから怖がられるんですよー。
係)やかましい!
おれが作ったわけじゃねーんだよ!
MOVE は「そのまま入れる」、COMPUTE は「計算してから入れる」。
って覚えておけ。
そして、
COBOL の COMPUTE は足し算・掛け算だけじゃなく、丸め処理や除算の余り処理なんかも一緒にやれる。
COMPUTE A = B / C ROUNDED みたいに書いたら、小数点の丸めまで込みでやってくれるんだよ。
MOVEとCOMPUTE:配送ドライバー vs 電卓ドライバー
な)へー、MOVEくんは何もしてくれないんすか?できないくんですか?
係)お前ほんとすぐ人格つけるな。
MOVE は「ただの運び屋」だ。
右辺にある値を左辺に そのままコピー するだけ。
計算?加工?そんなもん一切しない。おとなしく荷物だけ運んで終わり。
一方、COMPUTE は「算数のできる運び屋」だ。
運ぶ前にちょっと計算してから渡してくれるんで
だから丸めとか掛け算とか、そういう「おつかい+計算」ができるわけだな。
な)じゃあMOVEくんはただの配送ドライバーで、COMPUTEさんは電卓片手にやってくるドライバーってことっすね!
係)まぁそうだな。
ただし仕事の8割は「そのまま入れる」だから、MOVEくんのほうが出番は圧倒的に多い。
COMPUTEはここぞってときしか使わない。
な)うわー、やっぱりできないくんじゃないっすか!
おむすび
係)あのなぁ…MOVEがなきゃプログラム一行も動かねぇんだよ。どっちかっていうと、できないんじゃなくて「シンプルくん」だな。
な)それは「やりたくないくん」じゃないです?
係)おめーといっしょじゃねーか
な)びどい!俺は見てるだけくんですよ!
係)もっといらねーくんじゃねーか。
係長のワンポイント
NUMVAL は「数字っぽい文字列を“本物の数値”に変換するための関所」だ。
MOVE は“そのまま運ぶだけ”、COMPUTE は“計算してから渡す”という役割分担。
だから文字列→数値→計算の流れは NUMVAL → MOVE → COMPUTE が基本形になる。
COBOL が入力を絶対に信用しないのは“事故を防ぐ防御思想”ゆえだ。
計算前にまず疑え──それがCOBOLの鉄則だ。

コメント