導入:なぜカウンタ変数の管理に疲弊するのか
長年COBOLの現場にいると、必ず一度は「テーブルの要素数管理」に頭を悩ませた経験があるはずです。動的に拡張されるテーブル(UNBOUNDEDテーブル)を扱う際、別途「カウンタ用変数」を定義し、追加のたびに加算、削除のたびに減算……という処理を行っていませんか?この方法だと、途中でロジックの修正が入った際、カウンタの更新漏れによる配列オーバーフローや、データとの不整合が発生しがちです。COBOL 2002以降では、こうした人為的なミスを根本から排除できる強力な機能が用意されています。
基礎知識:UNBOUNDEDテーブルとODO
COBOLにおけるテーブル定義で、OCCURS句にDEPENDING ON句を指定し、かつ最大要素数を指定しない(あるいはUNBOUNDEDを指定する)ことで、実行時にサイズが変化する動的テーブルを作成できます。これが「動的長テーブル」です。従来は、DEPENDING ONで指定した変数(ODOオブジェクト)の値を直接操作してサイズを制御していましたが、その値が「いまテーブル内に何件入っているか」と常に一致しているかを保証するのはプログラマの責務でした。
実装:FUNCTION ODO-COUNTの活用
現代的なCOBOL開発では、わざわざカウンタ変数を手動で監視する必要はありません。組み込み関数である「FUNCTION ODO-COUNT」を使用すれば、システムが内部的に保持している現在の要素数を一発で取得できます。これにより、ロジックが格段にスッキリし、保守性も向上します。
サンプルプログラム
以下のコードは、動的テーブルの件数を取得する最もシンプルな実装例です。
IDENTIFICATION DIVISION. PROGRAM-ID. DYNAMIC-TABLE-SAMPLE. DATA DIVISION. WORKING-STORAGE SECTION.
- 動的テーブルの定義(最大100件まで拡張可能)
- データの追加処理などをシミュレート
- FUNCTION ODO-COUNT を使用して現在の件数を取得
- これにより、WS-CURRENT-COUNT を直接参照するよりも
- 安全かつ確実に現在の有効な要素数を取得できる
応用・注意点:現場で生き残るためのヒント
FUNCTION ODO-COUNTを使用する際の最大のメリットは、プログラムの可読性向上だけでなく、デバッグの容易さにあります。もし「なぜか件数が合わない」というバグに遭遇した際、自前のカウンタ変数に依存していると、コード全体を追う必要があります。しかし、この関数を使えば「言語仕様として正しい数値」が返ってくるため、バグの原因が「自前のロジック(データの詰め方)」にあるのか「仕様理解」にあるのかを即座に切り分けられます。
ただし、注意点として、この関数はあくまで「そのテーブルの現在の有効要素数」を返すものです。テーブル内に「論理削除フラグ」を立ててデータを残している場合などは、フラグの条件を含めた集計は別途行う必要があります。あくまで「領域確保されているデータの個数」を扱う際に使う、強力な武器であると心得ておきましょう。

コメント