🧩今日の学び
・COBOLでは“文字が化けないかどうか”が設計判断の最優先になる
・昭和ホストのEBCDIC〜令和のUTF-8まで、環境で使える文字種が変わる
・本番帳票は1文字のバイト数ズレが致命傷になるため、今でもASCII優先文化が残る
今日のコード
WRITE-ERROR.
ADD 1 TO TOT-ERR
STRING IN-REC DELIMITED BY SIZE
"," DELIMITED BY SIZE
WS-MSG DELIMITED BY SIZE
INTO ERR-REC
END-STRING
WRITE ERR-REC.
WRITE-REPORT-HEADER.
MOVE SPACES TO OUT-REC
STRING
"=== DAILY SALES REPORT === "
DELIMITED BY SIZE
"Generated: "
DELIMITED BY SIZE
CD-YYYY "::" CD-MM "::" CD-DD
DELIMITED BY SIZE
" " CD-HH ":" CD-MN ":" CD-SS
DELIMITED BY SIZE
INTO OUT-REC
END-STRING
WRITE OUT-REC.
MOVE "----------------------------------------------"
TO OUT-REC
WRITE OUT-REC.
MOVE "DETAILS:" TO OUT-REC
WRITE OUT-REC.
なるお)もうこの程度なら簡単タンシチュー!
毎回毎回おんなじようなコード見せてくるとか、おじいちゃんはほんとしつこいよね。
係長)なんかいったか?
な)いや…今日もよろしくお願いします、師匠…という気持ちとか、そうでもない気持ちとか。
あ、アイス食います?
係)なんで、仕事中にアイス食ってんだよ。
な)だって、食べたいときが食べ時じゃないですかー。食べ時を逃すと食い逃すかもしれないじゃないですかー。
欲しがりません!焼き野菜!
でもライスは必要ですよ?ライスは野菜じゃないですし、肉5ライス5ぐらいでいきますよ。
だって、大盛りライスのほうが中盛ライス2つより安いんですよ?大盛りライス2つのほうが中盛ライス4つよりやすいんですよ?
係)だから太ってんだな。
な)太ってない!
係)さて、今日のコードだな。
な)太って…
係)たぶんお前、「なんか見慣れた感じだな」って思ったろ?
それは正解。
これはもう“COBOLの書式文化祭”の総集編みたいなもんだ。
な)太ってないからわかります!
WRITE-ERRORとヘッダー生成:COBOLの書式文化祭
係)まず WRITE-ERROR.だが
ADD 1 TO TOT-ERR
STRING IN-REC DELIMITED BY SIZE
"," DELIMITED BY SIZE
WS-MSG DELIMITED BY SIZE
INTO ERR-REC
END-STRING
WRITE ERR-REC.
これは「エラー行を記録」する処理。
ADD 1 TO TOT-ERR → エラー件数をカウントアップ。
STRING … INTO ERR-REC → 入力レコードとメッセージを “カンマ区切り” で連結。
WRITE ERR-REC → それをエラーファイルに書き出す。
つまり、“どんな行がエラーだったか”のログをCSVっぽく残してるんだ。
な)「太ってないから」どんどん理解できますよ!
係)こっちは帳票(レポート)のヘッダー部分。
WRITE-REPORT-HEADER.
レポート作るなら定番の「日付+タイトル+区切り線+見出し」だな。
STRING
"=== DAILY SALES REPORT === "
...
"Generated: " CD-YYYY "::" CD-MM "::" CD-DD
...
INTO OUT-REC
END-STRING
WRITE OUT-REC.
Generatedはアリ?英語・カタカナ論争の始まり
な)Generated: とかいきなり小文字使いだしてきて、おしゃれ気取ってるんですかこれ。
今どきちょいワルですか?ちょっとだけ見た目悪いとかですか?
俺、太ってないからちょい良ですよ!
係)あのな、GENERATEDよりGeneratedのほうが読みやすいだろ?そういうことだ。
な)だったら、Daisuki! とか日本語読みのほうがいいんじゃないですか?
Generatedとか英語使ってる俺最高!見た?俺の英語見た!?
って、太ってるやつのうざい感じしかしないです。
係)「Lunch Time」でも「昼飯」でも意味は同じだろ。
でも、「昼飯」って出た瞬間にテンション下がるやついるだろ。
報告書だって同じだ。
全部カタカナで“セールスレポート発生日時”って出るよりマシなんだよ。
カタカナは使える?昭和COBOLと令和COBOLの境界線
な)あれ?カタカタって普通に使えるんですか?
係)結論から言うとだな、COBOLそのものは“カタカナ使えない”わけじゃない。
でも、どんな環境で動かすかによって使える/使えないが変わる。
昭和マシン(汎用機COBOL)
昔のホスト機(IBMのz/OSとか)だと、文字コードが EBCDIC(えぶしでぃっく) ってやつで、今のパソコンのUTF-8とは違うんだ。
EBCDICではカタカナが「半角カタカナ」しかなかった時代があって、全角カタカナを使うと 化ける or 落ちる ってのが日常茶飯事。
だから昭和COBOLでは
MOVE "カタカナ" TO ITEM-NAME.
みたいな、半角カナならOKってケースが多かったというわけだ。
令和マシン編(GnuCOBOLとか)
今のGnuCOBOLみたいなオープン系COBOLは、ソースコードをUTF-8で扱える。
つまり
MOVE "カタカナ" TO WS-NAME.
MOVE "ひらがな" TO WS-NAME.
MOVE "漢字" TO WS-NAME.
…ぜんぶ動く。
ただし、出力先の端末やファイルの文字コードがUTF-8対応してることが条件となる。
注意点としては、
COBOLは固定長文化だから、「カタカナ1文字=2バイト」扱いが多い。
出力ファイルが「1文字=1バイト」で計算されてると、桁ズレ地獄になる。
だから本番環境では「ASCIIオンリーで出せ」って今でも言われるぞ。
おむすび
な)じゃあ、“出せるけど、出すと怒られる” いつものやつですね!
係)そうだ。
カタカナは使えるけど、使うとおっさんたちの心拍数が上がる。
な)はっ!
係長も同じく心拍数上がります??
係)まぁな。
な)ふむふむ、メモメモ。
係)何書いてんだ。
な)え、いや、なんでも…
いや違いますよ!係長の心拍数を高数値マークさせ続けようなんて思ってないですよ!?
ほら、俺太ってるから心拍数高くして、何もせず痩せようと思って!
係)やっぱりデブなんじゃねーか。
な)だから、デブじゃないです!
係)自分の言ったことには責任持てよ。
係長のワンポイント
COBOL は“動くかどうか”より“化けないかどうか”を優先する言語だ。
昭和ホストでは EBCDIC の都合で全角カナは事故要因、令和COBOLはUTF-8でも出力先次第で化ける。
固定長文化では「1文字=何バイトか」がズレると帳票が即崩壊する。
だから本番では今でも“ASCIIで出せ”が鉄の掟として残るわけだ。
使えるかより、使って安全か──それが文字種選びの判断基準だ。

コメント