1. 導入:なぜORD-MAXが必要なのか?
COBOLで複数の項目を比較し、「どれが一番大きい値か」を特定したい場面はよくあります。通常、IF文を繰り返して比較し、変数にインデックスを保持させるようなコーディングをしますが、これではコードが長くなり、バグの温床にもなりがちです。
今回紹介するORD-MAX関数を使えば、複数の引数の中から「最大値を持つものが何番目にあるか」を一発で取得できます。コードを劇的にスリム化し、可読性を高めるために非常に重要なTipsです。
2. 基礎知識:ORD-MAX関数とは?
ORD-MAXは、COBOLの「組込関数(Intrinsic Functions)」の一つです。
この関数の最大の特徴は、最大値そのものではなく、「引数リストの中で何番目にその値があるか(位置)」を返すという点です。
例えば、引数に (10, 50, 30) と渡せば、最大値である「50」は2番目にあるため、この関数は「2」を返します。この戻り値を利用することで、後の条件判定や配列操作が非常にスムーズになります。
3. 実装・解決策
使い方は非常にシンプルです。COMPUTE文の中で FUNCTION ORD-MAX(引数1, 引数2, …) と記述するだけです。
注意点として、ORD-MAXは「数字」だけでなく「英数字」の比較も可能です。その場合、文字コード順(ASCIIやEBCDICなど)に従って、最も大きい順序の文字がどこにあるかを判定します。
4. サンプルプログラム
以下のプログラムは、3つの売上数値の中から、最大値がどの店舗のものかを判定する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. ORD-MAX-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-SALES-A PIC 9(05) VALUE 1500.
01 WS-SALES-B PIC 9(05) VALUE 4200.
01 WS-SALES-C PIC 9(05) VALUE 3000.
01 WS-MAX-IDX PIC 9(01).
PROCEDURE DIVISION.
> ORD-MAX関数で最大値がある引数の位置を取得する
COMPUTE WS-MAX-IDX = FUNCTION ORD-MAX(WS-SALES-A, WS-SALES-B, WS-SALES-C).
> 取得した位置(インデックス)で判定を行う
EVALUATE WS-MAX-IDX
WHEN 1
DISPLAY “最大売上はA店舗です。”
WHEN 2
DISPLAY “最大売上はB店舗です。”
WHEN 3
DISPLAY “最大売上はC店舗です。”
END-EVALUATE.
GOBACK.
5. 応用・注意点
現場で使う際に気をつけてほしいポイントが2つあります。
一つ目は、「引数がすべて同じ値の場合」です。この場合、ORD-MAX関数は「1」を返します。仕様として「最初に見つかった位置」が優先されることを覚えておきましょう。
二つ目は、「引数の型」です。関数に渡す引数は、できるだけ型を揃えてください。数字と文字を混在させると、環境によっては意図しない比較結果になることがあります。
ORD-MAXを使いこなせば、複雑なIF文の連鎖から解放され、より保守性の高いCOBOLプログラムが書けるようになります。ぜひ次の実装で試してみてください。

コメント