COBOL 組み込み関数 活用術をマスターして、プログラミングをもっと楽にしませんか?
COBOLで「うーん、この処理もっと短く書けないかな…」「なんだかコードが読みにくいぞ…」なんて悩んでいませんか?実はCOBOLには、まるで魔法の呪文のように便利な「組み込み関数」という機能がたくさん用意されているんです!
組み込み関数を使えば、今まで苦労していた処理があっという間に終わったり、誰が見ても分かりやすいスッキリしたコードになったりします。まさに、COBOLプログラミングのレベルアップには欠かせない武器なのです!
この記事で学べることリストを紹介しますね。
- COBOL組み込み関数ってそもそも何?
- 使うとどんないいことがあるの?
- 基本的な使い方(ルールの説明)
- よく使う文字列操作の関数(長さ取得、一部切り出し)
- 面倒な数値計算が楽になる関数(整数化、文字から数値へ)
- 日付や時刻を扱う便利な関数(今日の日付取得)
- 使うときに気をつけたいポイント
COBOLの組み込み関数とは?活用のメリットを解説
さて、まずは「COBOL組み込み関数」が何者なのか、簡単にお話ししましょう。
ものすごく平たく言うと、COBOLが最初から用意してくれている便利な機能のセットみたいなものです。例えば、「文字の数を数える」とか、「数字の小数点以下を切り捨てる」とか、よく使いそうな処理を、短い命令(関数)で呼び出せるようにしてくれています。
では、組み込み関数を使うと、どんないいことがあるのでしょうか?
- コードが短くなる
今まで何行も書いていた処理が、関数を使えばたった1行で済むことも!タイプ量が減って楽ちんですね。 - コードが読みやすくなる
関数名を見れば「ああ、ここで文字数を数えてるんだな」と、処理内容がパッと見て分かりやすくなります。他の人が読んでも、未来の自分が見返しても理解しやすい! - バグが減るかも?
自分で複雑なロジックを書くと、うっかりミスも増えがち…。でも、用意された関数を使えば、その部分の品質は保証されているので、バグを作り込むリスクを減らせます。 - 開発がスピードアップ!
コードを書く時間も、読む時間も、デバッグする時間も短縮できるので、結果的にプログラムを作るスピードが上がります。
どうでしょう?使わない手はない!って思いませんか?これが組み込み関数を活用する大きなメリットなのです。
COBOLの組み込み関数の基本的な使い方
「便利そうなのは分かったけど、どうやって使うの?」と思いますよね。ご心配なく!使い方は意外とシンプルです。
基本の形はこうなっています。
FUNCTION 関数名 (引数1 引数2 ...)
`FUNCTION` というキーワードの後に、使いたい関数名を書きます。そして、関数によっては処理に必要な情報(これを引数(ひきすう)と呼びます)をカッコ `()` の中に書きます。引数が不要な関数もあれば、複数必要な関数もあります。
例えば、「ABC」という文字の長さを知りたいときは、`LENGTH` という関数を使って、こんな風に書けます。
FUNCTION LENGTH ("ABC")
簡単でしょう?
この「FUNCTION 関数名(引数...)」の塊が、関数の処理結果(例えば、LENGTH関数の場合は文字数「3」)に置き換わるイメージです。計算式の中で使ったり、変数に結果を入れたりできます。
まずは、`FUNCTION 関数名 (引数)` の形を覚えるところからスタートしましょう!
文字列操作に役立つCOBOL組み込み関数活用法
COBOLのお仕事では、文字データを扱うことが本当によくあります。氏名、住所、商品名、メッセージなどなど…。
そんな時、組み込み関数を知っていると作業が格段に楽になりますよ!ここでは、特によく使う文字列操作の関数をピックアップして紹介しますね。これを知っておくと、かなり武器になります!
FUNCTION LENGTH: 文字列の長さを取得する関数の活用
まずは基本中の基本、`FUNCTION LENGTH` です!これは、指定したデータ項目や文字リテラル(""で囲まれた文字)のバイト数を教えてくれる関数です。
例えば、こんな風に使います。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE-LENGTH. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NAME PIC X(10) VALUE "TARO YAMADA". 01 WS-LENGTH PIC 9(3). PROCEDURE DIVISION. *>-- WS-NAME の長さを取得 COMPUTE WS-LENGTH = FUNCTION LENGTH (WS-NAME) DISPLAY "WS-NAMEの内容: " WS-NAME. DISPLAY "WS-NAMEの長さ: " WS-LENGTH " バイト". *>-- 文字リテラルの長さを取得 COMPUTE WS-LENGTH = FUNCTION LENGTH ("COBOL") DISPLAY "COBOL の長さ: " WS-LENGTH " バイト". STOP RUN.
このプログラムを実行すると、こんな結果が表示されます。
WS-NAMEの内容: TARO YAMADA WS-NAMEの長さ: 010 バイト COBOL の長さ: 005 バイト
WS-NAME は `PIC X(10)` で定義したので、長さは10バイトですね。文字リテラル "COBOL" は5文字なので、5バイトと表示されます。
この関数は、入力されたデータの桁数チェックや、後で紹介する SUBSTRING 関数と組み合わせて使うなど、様々な場面で活躍しますよ!データ項目の定義上の長さ(バイト数)を返す、と覚えておきましょう。
FUNCTION SUBSTRING: 文字列の一部を切り出す関数の活用
次に紹介するのは `FUNCTION SUBSTRING` です。これも超便利!指定した文字列の中から、好きな部分だけを切り出すことができる関数です。
使い方はこんな感じです。
FUNCTION SUBSTRING (元の文字列 開始位置 切り出す長さ)
「元の文字列」の「開始位置」から「切り出す長さ」分の文字を取り出してくれます。
実際のプログラムを見てみましょう。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE-SUBSTRING. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-POSTAL-CODE PIC X(8) VALUE "123-4567". 01 WS-FIRST-3 PIC X(3). 01 WS-LAST-4 PIC X(4). PROCEDURE DIVISION. *>-- 郵便番号の前3桁を切り出す (1バイト目から3バイト分) COMPUTE WS-FIRST-3 = FUNCTION SUBSTRING (WS-POSTAL-CODE 1 3) DISPLAY "郵便番号: " WS-POSTAL-CODE. DISPLAY "前3桁 : " WS-FIRST-3. *>-- 郵便番号の後4桁を切り出す (5バイト目から4バイト分) COMPUTE WS-LAST-4 = FUNCTION SUBSTRING (WS-POSTAL-CODE 5 4) DISPLAY "後4桁 : " WS-LAST-4. STOP RUN.
実行結果はこうなります。
郵便番号: 123-4567 前3桁 : 123 後4桁 : 4567
ね、簡単でしょう?郵便番号から市外局番と市内局番を分けたり、長いコードの中から必要な部分だけを取り出したり、データの一部を取り出してチェックしたりと、使い道は無限大です!開始位置と切り出す長さを指定するのがポイントですよ。
数値計算を楽にする組み込み関数活用テクニック
COBOLは事務処理計算が得意な言語ですが、組み込み関数を使えば、数値の扱いがもっと楽ちんになります。
「えーっと、この数字の小数点以下を切り捨てたいんだけど…」とか、「ファイルから読み込んだ文字の数字を、計算に使えるようにしたい!」なんて時に、大活躍してくれる関数たちを紹介しますね!
FUNCTION INTEGER / INTEGER-PART: 小数点以下を切り捨てる関数の活用
小数点以下の端数を処理したい場面、ありますよね。そんな時に便利なのが `FUNCTION INTEGER` と `FUNCTION INTEGER-PART` です。どちらも数値の整数部分を取り出す関数ですが、少しだけ動きが違います。
- `FUNCTION INTEGER`: その数値に最も近い整数を返します。(四捨五入とはちょっと違う動きなので注意!)
- `FUNCTION INTEGER-PART`: 単純に小数点以下をバッサリ切り捨てます。
言葉だけだと分かりにくいので、例を見てみましょう。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE-INTEGER. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUM1 PIC S9(5)V99 VALUE +123.45. 01 WS-NUM2 PIC S9(5)V99 VALUE +123.50. 01 WS-NUM3 PIC S9(5)V99 VALUE -123.45. 01 WS-NUM4 PIC S9(5)V99 VALUE -123.50. 01 WS-RESULT-INT PIC S9(5). 01 WS-RESULT-INTPT PIC S9(5). PROCEDURE DIVISION. DISPLAY "--- FUNCTION INTEGER ---". COMPUTE WS-RESULT-INT = FUNCTION INTEGER (WS-NUM1). DISPLAY WS-NUM1 " -> " WS-RESULT-INT. COMPUTE WS-RESULT-INT = FUNCTION INTEGER (WS-NUM2). DISPLAY WS-NUM2 " -> " WS-RESULT-INT. COMPUTE WS-RESULT-INT = FUNCTION INTEGER (WS-NUM3). DISPLAY WS-NUM3 " -> " WS-RESULT-INT. COMPUTE WS-RESULT-INT = FUNCTION INTEGER (WS-NUM4). DISPLAY WS-NUM4 " -> " WS-RESULT-INT. DISPLAY "--- FUNCTION INTEGER-PART ---". COMPUTE WS-RESULT-INTPT = FUNCTION INTEGER-PART (WS-NUM1). DISPLAY WS-NUM1 " -> " WS-RESULT-INTPT. COMPUTE WS-RESULT-INTPT = FUNCTION INTEGER-PART (WS-NUM2). DISPLAY WS-NUM2 " -> " WS-RESULT-INTPT. COMPUTE WS-RESULT-INTPT = FUNCTION INTEGER-PART (WS-NUM3). DISPLAY WS-NUM3 " -> " WS-RESULT-INTPT. COMPUTE WS-RESULT-INTPT = FUNCTION INTEGER-PART (WS-NUM4). DISPLAY WS-NUM4 " -> " WS-RESULT-INTPT. STOP RUN.
実行結果です。
--- FUNCTION INTEGER --- +00123.45 -> +00123 +00123.50 -> +00124 -00123.45 -> -00123 -00123.50 -> -00124 --- FUNCTION INTEGER-PART --- +00123.45 -> +00123 +00123.50 -> +00123 -00123.45 -> -00123 -00123.50 -> -00123
違いが分かりましたか? `INTEGER` は 0.5 を境に絶対値が大きい方の整数になりますが、`INTEGER-PART` はプラスでもマイナスでも、単純に小数点以下を切り捨てていますね。
年齢計算(生年月日から単純に年数だけ取り出す)や、消費税計算後の端数処理など、目的に合わせて使い分けましょう。
FUNCTION NUMVAL / NUMVAL-C: 文字列を数値に変換する関数の活用
ファイルからデータを読み込んだ時、数字が「文字」として格納されていること、よくありますよね。(例:" 1,234" や "+500" など)
そのままでは計算に使えませんが、`FUNCTION NUMVAL` や `FUNCTION NUMVAL-C` を使えば、文字で表現された数字を、計算可能な数値形式に変換できます!
- `FUNCTION NUMVAL`: 通貨記号(¥,$など)やコンマ(,)を無視して数値に変換します。前後のスペースも無視してくれます。
- `FUNCTION NUMVAL-C`: 通貨記号やコンマも解釈して数値に変換します。こちらも前後のスペースは無視します。引数で通貨記号を指定することもできます。
これもプログラム例を見てみましょう。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE-NUMVAL. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-STR1 PIC X(10) VALUE " 1234 ". 01 WS-STR2 PIC X(10) VALUE " +5678 ". 01 WS-STR3 PIC X(10) VALUE "-9,012 ". 01 WS-STR4 PIC X(10) VALUE " ¥1,234 ". 01 WS-NUM PIC S9(7)V99. PROCEDURE DIVISION. DISPLAY "--- FUNCTION NUMVAL ---". COMPUTE WS-NUM = FUNCTION NUMVAL (WS-STR1). DISPLAY WS-STR1 " -> " WS-NUM. COMPUTE WS-NUM = FUNCTION NUMVAL (WS-STR2). DISPLAY WS-STR2 " -> " WS-NUM. COMPUTE WS-NUM = FUNCTION NUMVAL (WS-STR3). *> コンマは無視される DISPLAY WS-STR3 " -> " WS-NUM. *> COMPUTE WS-NUM = FUNCTION NUMVAL (WS-STR4). *> 通貨記号があるとエラーになる! DISPLAY "--- FUNCTION NUMVAL-C ---". COMPUTE WS-NUM = FUNCTION NUMVAL-C (WS-STR1). DISPLAY WS-STR1 " -> " WS-NUM. COMPUTE WS-NUM = FUNCTION NUMVAL-C (WS-STR2). DISPLAY WS-STR2 " -> " WS-NUM. COMPUTE WS-NUM = FUNCTION NUMVAL-C (WS-STR3). DISPLAY WS-STR3 " -> " WS-NUM. COMPUTE WS-NUM = FUNCTION NUMVAL-C (WS-STR4). *> 通貨記号もOK! DISPLAY WS-STR4 " -> " WS-NUM. STOP RUN.
実行結果は以下のようになります。(NUMVALでWS-STR4を変換しようとするとエラーになるのでコメントアウトしています)
--- FUNCTION NUMVAL --- 1234 -> +0001234.00 +5678 -> +0005678.00 -9,012 -> -0009012.00 --- FUNCTION NUMVAL-C --- 1234 -> +0001234.00 +5678 -> +0005678.00 -9,012 -> -0009012.00 ¥1,234 -> +0001234.00
`NUMVAL` はコンマを無視しますが、通貨記号があるとエラーになります。一方、`NUMVAL-C` はコンマも通貨記号もちゃんと解釈して数値にしてくれますね。
入力データの形式に合わせて、`NUMVAL` と `NUMVAL-C` を使い分けることがコツです。
日付・時刻処理に便利な組み込み関数
プログラムを作っていると、「今日の日付を使いたい」「処理した時間を記録したい」という場面が必ず出てきます。
COBOLにも、そんな日付や時刻の処理を簡単にしてくれる組み込み関数が用意されています。これを使えば、システム日付の取得や加工がずっと楽になりますよ!
FUNCTION CURRENT-DATE: 現在の日付と時刻を取得する関数の活用
システム開発で「今日の情報が欲しい!」という時の強い味方が `FUNCTION CURRENT-DATE` です。この関数を呼び出すと、プログラムを実行した時点での日付や時刻などの情報を、まとめて取得できます。
ただし、ちょっとクセがあって、戻り値は21バイトの特殊な形式になっています。その内訳はこんな感じです。
1-4バイト目 : 西暦年 (YYYY) 5-6バイト目 : 月 (MM) 7-8バイト目 : 日 (DD) 9-10バイト目: 時 (HH 24時間表記) 11-12バイト目: 分 (MM) 13-14バイト目: 秒 (SS) 15-16バイト目: 100分の1秒 (ss) 17バイト目 : GMT(グリニッジ標準時)との時差 (+ or - or 0) 18-19バイト目: 時差(時) 20-21バイト目: 時差(分)
必要な部分を、後で紹介した SUBSTRING 関数などを使って取り出して使うのが一般的です。
実際に使ってみましょう。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE-CURRENT-DATE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CURRENT-DATETIME PIC X(21). 01 WS-DATE-YYYYMMDD PIC X(8). 01 WS-TIME-HHMMSS PIC X(6). PROCEDURE DIVISION. *>-- 現在日時を取得 MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATETIME. DISPLAY "CURRENT-DATE raw: " WS-CURRENT-DATETIME. *>-- 年月日 (YYYYMMDD) を取り出す MOVE FUNCTION SUBSTRING(WS-CURRENT-DATETIME 1 8) TO WS-DATE-YYYYMMDD. DISPLAY "今日の日付(YYYYMMDD): " WS-DATE-YYYYMMDD. *>-- 時分秒 (HHMMSS) を取り出す MOVE FUNCTION SUBSTRING(WS-CURRENT-DATETIME 9 6) TO WS-TIME-HHMMSS. DISPLAY "現在の時刻(HHMMSS) : " WS-TIME-HHMMSS. STOP RUN.
実行すると、例えばこんな結果になります。(実行するタイミングで値は変わります)
CURRENT-DATE raw: 2025041114240912+0900 今日の日付(YYYYMMDD): 20250411 現在の時刻(HHMMSS) : 142409
ログファイルに処理時刻を記録したり、帳票に印刷する日付に使ったり、データの有効期限をチェックしたりと、用途は様々です。戻り値のフォーマットを理解して、必要な部分を切り出して使うのがポイントですね!
COBOLの組み込み関数を活用する際の注意点
ここまで便利な組み込み関数を紹介してきましたが、使う上でいくつか気をつけておきたい点があります。これを知っておけば、思わぬエラーを防いだり、もっと上手に活用できたりしますよ。
- 引数のデータ型や桁数
関数が期待しているデータの種類(数字なのか文字なのか)や、桁数が合っていないと、エラーになったり、予期せぬ結果になったりすることがあります。使う前に関数の仕様を軽く確認しておくと安心ですね。 - エラー処理を忘れずに
`NUMVAL` や `NUMVAL-C` で、数字に見えない文字(例:"ABC")を変換しようとするとエラーになります。入力データが必ず正しいとは限らないので、予期せぬデータが入ってきた場合にプログラムが止まらないよう、エラー処理を組み込むことを検討しましょう。(`ON EXCEPTION` などを使う方法があります) - 関数の実行コスト
とても便利な関数ですが、複雑な処理をする関数をループの中で何度も呼び出すと、プログラム全体の処理速度に影響が出る可能性もゼロではありません。パフォーマンスが求められる箇所では、少し意識してみるとよいでしょう。 - 環境による違い
使うCOBOLコンパイラのメーカーやバージョン、OSによって、使える関数や細かい動作が少し違う場合があります。もし「あれ、この関数使えないぞ?」となったら、使っている環境のマニュアルを確認してみてください。
難しく考えすぎる必要はありませんが、これらの点を頭の片隅に置いておくと、よりスムーズに関数を使いこなせるようになりますよ!
【まとめ】COBOL組み込み関数を使いこなして開発効率UP!
お疲れ様でした!今回は、COBOLプログラミングを強力にバックアップしてくれる「組み込み関数」について、基本的な使い方から、文字列、数値、日付処理でよく使うものをピックアップして解説しました。
もう一度ポイントをおさらいしましょう。
- 組み込み関数はCOBOLが用意してくれた便利機能セット!
- コードが短く、読みやすく、バグも減って、開発効率が上がる!
- 基本の形は `FUNCTION 関数名 (引数...)`
- 文字列操作には `LENGTH` や `SUBSTRING` が大活躍!
- 数値計算には `INTEGER`, `INTEGER-PART`, `NUMVAL`, `NUMVAL-C` を使い分けよう!
- 日付や時刻は `CURRENT-DATE` でゲット!
- 引数の型やエラー処理など、ちょっとした注意点も忘れずに!
最初は覚えるのが少し大変かもしれませんが、一度使い方をマスターしてしまえば、あなたのCOBOLコーディングは劇的に変わるはずです。「あの面倒な処理、関数で一発じゃん!」という快感を、ぜひ味わってください。
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。