【COBOL学習|初心者向け】【COBOL基礎】SUM句で「マイナス」が消える?集計時の符号(S)の重要性

導入:なぜ合計値が正しく表示されないのか?

報告書作成機能(REPORT WRITER)を使っている際、「計算結果がマイナスなのに、プラスとして表示されてしまう」という経験はありませんか?実はこれ、COBOLの集計処理における「符号(S)の伝播」を理解していないと陥りやすい、ベテランでもたまにやってしまうミスです。帳票の信頼性を守るため、集計項目の定義は非常に重要です。

基礎知識:PICTURE句の「S」とは何か

COBOLのPICTURE句における「S」は、その項目が「符号付き(Signed)」であることを示す記号です。
例えば「PIC 9(5)」と定義すると、その項目は0から99999までの正の数しか扱えません。ここにマイナスの値を代入しても、符号が切り捨てられ、ただの正数として扱われてしまいます。
一方、「PIC S9(5)」と定義すれば、内部的に符号ビットが確保され、マイナス値も正しく保持できるようになります。

実装・解決策:SUM句と定義の整合性

REPORT WRITERのSUM句を使用して集計を行う際、集計先となる項目のPICTURE句に「S」を忘れると、計算結果がマイナスになった瞬間に符号が落ちてしまいます。特に収支計算や減算を含む集計を行う帳票では、「集計元(ソース)」と「集計先(合計欄)」の両方に必ず「S」を付けるのが、会計系システム開発における鉄則です。

サンプルプログラム

以下は、売上から経費を引いた「純利益」を計算し、合計を表示する簡単な例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-SUM.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 集計元のデータ(符号付きで定義)

01 WS-NET-INC PIC S9(9).

REPORT SECTION.
01 REP-LINE.
03 COL 10 PIC X(10) VALUE “合計金額:”.

  • SUM句で集計。ここにも必ずSを付ける

03 COL 22 SUM WS-NET-INC PIC S9(9).

PROCEDURE DIVISION.

  • 実際にはここでREPORT WRITERの制御を行います
  • 符号付きのWS-NET-INCがマイナス値になっても、
  • 上記のSUM定義にSがあるため、正しく負の値として出力されます。

STOP RUN.

応用・注意点:現場で役立つ補足

実務上の注意点として、「出力編集(PIC Z,ZZ9など)」との組み合わせがあります。
もし合計欄に「PIC Z,ZZ9」のように編集記号を付けている場合、Sを付けていてもマイナス符号が表示されないことがあります。その場合は「PIC SZZ,ZZ9」や「PIC -ZZ,ZZ9」のように、符号を表示するための編集記号を忘れずに指定してください。

また、古い仕様のコンパイラでは、集計処理の途中でオーバーフローが発生した場合に意図しない値になることもあります。集計先の桁数は、ソースデータの最大値よりも余裕を持って定義する(桁あふれを防ぐ)のが、バグを未然に防ぐベテランの流儀です。

コメント

タイトルとURLをコピーしました