【COBOL入門】SET文を完全マスター!INDEX操作もこれで安心

2025年4月10日木曜日

COBOL

SET文は、COBOLの中でも特にINDEX項目への値の設定や操作を担当する、いわば「INDEX操作のスペシャリスト」。

こいつを使いこなせれば、テーブル操作がグッと楽になること間違いなし!

この記事を読むと、こんなことができるようになりますよ。

  • SET文が何をするヤツなのか、基本がわかる
  • SET文の正しい書き方を覚えられる
  • 具体的なプログラムでの使い方をマスターできる
  • SET文を使うときの注意点がわかる
  • MOVE文との違いがスッキリ理解できる

COBOLの「SET文」とは?基本的な役割を理解しよう

まず、SET文っていったい何者なんでしょう?

一言でいうと、「特定の種類のデータ項目に値を設定したり、操作したりするための命令文」です。

特に得意なのが、INDEXデータ項目の操作。INDEXデータ項目は、配列(テーブル)の何番目の要素かを指し示すための特別な変数みたいなもの。

普通の数字を入れる変数(数字項目)には基本的に使いません。(そういうのはMOVE文の担当!)

ほかにも、条件名(88レベル項目)の状態をTRUE(真)にする、なんていう仕事もこなします。

テーブル操作や条件分岐で、まさに「縁の下の力持ち」的な働きをするのがSET文なんですね。

「SET文」の基本的な書き方(構文)

じゃあ、実際にどうやって書くのか見ていきましょう。
SET文には、大きく分けて2つの書き方があります。シンプルなので安心してくださいね。

書き方1:項目に値を設定する (TO)

まず基本形。特定の項目に、別の項目の値や具体的な数値を「セット」する方法です。

SET 識別子-1 TO 識別子-2
SET 識別子-1 TO 整数-1

解説:

  • 識別子-1 には、値を設定したいINDEXデータ項目などを書きます。
  • 識別子-2 には、設定したい値を持っている別のINDEXデータ項目を書きます。
  • 整数-1 には、設定したい具体的な数字(例えば 1 とか 10 とか)を書きます。

INDEX項目に初期値を入れたり、別のINDEX項目の値をコピーしたりするときによく使いますよ。

書き方2:項目を増減させる (UP BY / DOWN BY)

次に、INDEXデータ項目の値を増やしたり減らしたりする方法です。ループ処理とかで大活躍します。

SET 識別子-1 UP BY 識別子-2
SET 識別子-1 UP BY 整数-1

SET 識別子-1 DOWN BY 識別子-2
SET 識別子-1 DOWN BY 整数-1

解説:

  • 識別子-1 には、値を増やしたり減らしたりしたいINDEXデータ項目を書きます。
  • UP BY は「増やす」という意味。
  • DOWN BY は「減らす」という意味。
  • 識別子-2整数-1 には、どれだけ増減させたいかの値(を持つ項目や具体的な数字)を書きます。

テーブルの要素を順番に見ていくときにINDEX項目を1ずつ増やしたり (UP BY 1)、逆順で見るときに減らしたり (DOWN BY 1) するのが典型的な使い方です。

【実践】COBOLの「SET文」の使い方

ここからは、具体的なプログラム例を見ながら、SET文の使い方をマスターしていきましょう!

百聞は一見にしかず、コードを見るのが一番わかりやすいですからね!

使い方1:INDEX項目に初期値を設定する

テーブル(配列)を使うとき、まず「何番目から処理するか」を指定する必要があります。多くの場合、最初の要素である「1番目」から始めますよね。

そんな時、INDEX項目に初期値「1」を設定するのにSET文を使います。

 IDENTIFICATION DIVISION.
 PROGRAM-ID. SET-SAMPLE1.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01 WS-TABLE.
    05 WS-T OCCURS 5 TIMES INDEXED BY WS-IDX.
       10 WS-T-DATA PIC X(10).
 PROCEDURE DIVISION.

     SET WS-IDX TO 1.
     DISPLAY "INDEXの初期値: " WS-IDX.
     STOP RUN.

【解説】

  • `INDEXED BY WS-IDX` で、`WS-IDX` という名前のINDEXデータ項目を定義しています。
  • 手続き部(PROCEDURE DIVISION)で `SET WS-IDX TO 1.` と書くことで、`WS-IDX` に `1` という値が設定されます。テーブル処理を始める前の準備として必須の操作ですね。
  • DISPLAY文の結果は環境によりますが、INDEX項目そのものを直接表示できない処理系も多いです。ここでは概念として「1が設定された」と理解してください。

使い方2:INDEX項目を1ずつ増やす(UP BY 1)

テーブルの要素を1番目から順番に処理していく、なんていうのはよくあるパターン。
INDEX項目を「+1」していく操作も、SET文の得意技です!

 IDENTIFICATION DIVISION.
 PROGRAM-ID. SET-SAMPLE2.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01 WS-TABLE.
    05 WS-T OCCURS 3 TIMES INDEXED BY WS-IDX.
       10 WS-T-DATA PIC X(10).
 PROCEDURE DIVISION.
*>--- INDEX項目 WS-IDX に初期値 1 を設定 ---
     SET WS-IDX TO 1.
     DISPLAY "処理前のINDEX: " WS-IDX.

*>--- INDEX項目 WS-IDX を 1 増やす ---
     SET WS-IDX UP BY 1.
     DISPLAY "処理後のINDEX: " WS-IDX.

*>--- もう1回増やしてみる ---
     SET WS-IDX UP BY 1.
     DISPLAY "さらに増やしたINDEX: " WS-IDX.

     STOP RUN.

【解説】

  • 最初に `SET WS-IDX TO 1.` で初期値を設定。
  • `SET WS-IDX UP BY 1.` を実行するたびに、`WS-IDX` の値が1ずつ増えていきます。
  • PERFORM文を使ったループの中で、次の要素に移るためにこの `UP BY 1` を書くのが定番です。
  • これもDISPLAYの結果は概念として捉えてください。1 → 2 → 3 と増えていくイメージです。

使い方3:INDEX項目を特定の値だけ減らす(DOWN BY n)

増やすだけじゃありません。減らすことだってできます。
例えば、テーブルを最後の要素から逆順に見ていきたい時などに使えますね。

 IDENTIFICATION DIVISION.
 PROGRAM-ID. SET-SAMPLE3.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01 WS-TABLE.
    05 WS-T OCCURS 5 TIMES INDEXED BY WS-IDX.
       10 WS-T-DATA PIC X(10).
 PROCEDURE DIVISION.
*>--- INDEX項目 WS-IDX に 5 を設定 ---
     SET WS-IDX TO 5.
     DISPLAY "処理前のINDEX: " WS-IDX.

*>--- INDEX項目 WS-IDX を 2 減らす ---
     SET WS-IDX DOWN BY 2.
     DISPLAY "処理後のINDEX: " WS-IDX.

     STOP RUN.

【解説】

  • `SET WS-IDX TO 5.` で初期値(ここでは5)を設定。
  • `SET WS-IDX DOWN BY 2.` で、`WS-IDX` の値が `2` 減らされます(5 → 3 になるイメージ)。
  • `DOWN BY` の後ろには、減らしたい数を直接書いたり、減らす数が格納された別の(整数)項目を書いたりできます。柔軟に減らす数を変えられるのが便利です。

使い方4:他のINDEX項目の値を設定する

あるINDEX項目の値を、別のINDEX項目にそのままコピーしたい場面もあります。
例えば、ループの途中でINDEXの値を一時的に別の場所に覚えておきたい時などですね。

 IDENTIFICATION DIVISION.
 PROGRAM-ID. SET-SAMPLE4.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01 WS-TABLE-A.
    05 WS-TA OCCURS 5 TIMES INDEXED BY WS-IDX-A.
       10 WS-TA-DATA PIC X(10).
 01 WS-TABLE-B.
    05 WS-TB OCCURS 5 TIMES INDEXED BY WS-IDX-B.
       10 WS-TB-DATA PIC X(10).
 PROCEDURE DIVISION.
*>--- INDEX項目 WS-IDX-A に 3 を設定 ---
     SET WS-IDX-A TO 3.
     DISPLAY "コピー前のIDX-A: " WS-IDX-A.
     DISPLAY "コピー前のIDX-B: (不定)".

*>--- WS-IDX-A の値を WS-IDX-B に設定 ---
     SET WS-IDX-B TO WS-IDX-A.
     DISPLAY "コピー後のIDX-A: " WS-IDX-A.
     DISPLAY "コピー後のIDX-B: " WS-IDX-B.

     STOP RUN.

【解説】

  • `WS-IDX-A` と `WS-IDX-B` という2つのINDEX項目を用意しました。
  • `SET WS-IDX-A TO 3.` で `WS-IDX-A` に 3 を設定。
  • `SET WS-IDX-B TO WS-IDX-A.` これがポイント! `WS-IDX-A` が持っている値(ここでは3)が、`WS-IDX-B` に設定されます。
  • これで、2つのINDEX項目が同じ場所を指すようにできます

COBOLの「SET文」を使う上での注意点

便利なSET文ですが、いくつか気をつけておきたい「落とし穴」もあります。
ここを知っておけば、エラーに悩む時間が減るはず!

注意点1:設定できる項目の種類

SET文は万能選手ではありません。

主に操作できるのは、これまで見てきたINDEXデータ項目と、条件名(88レベル項目)です。
例えば、`SET 条件名 TO TRUE` のように使って、条件を意図的に満たす(成立させる)ことができます。

逆に、普通の計算に使うような数字項目(`PIC 9(5)` みたいなの)や、文字を入れる文字項目(`PIC X(10)` みたいなの)に値を設定することは、基本的にできません。

これらの項目に値を設定したいときは、MOVE文の出番です。役割分担ができているんですね。

注意点2:MOVE文との違い

「値を設定するならMOVE文でいいじゃん?」って思うかもしれません。
たしかにMOVE文も値を設定する命令ですが、SET文とは役割が違います。

* SET文: INDEXデータ項目や条件名など、特定の項目への値設定や操作が得意なスペシャリスト。 * MOVE文: 数字項目、文字項目、集団項目など、一般的なデータ項目の間で値をコピーするのが得意な万能選手。

なぜINDEX項目にMOVE文を使わないのかというと、INDEX項目はコンピュータ内部での表現方法が普通の数字項目とちょっと違う、という理由があるのですが…まあ、難しい話は置いておきましょう!

「INDEX項目にはSET文!」
「それ以外の普通の項目にはMOVE文!」

まずは、この使い分けをしっかり覚えておくことが肝心です!

【まとめ】COBOLの「SET文」をマスターしてプログラムを効率化しよう

お疲れさまでした!SET文について、基本的なところから実践的な使い方、注意点まで見てきました。

SET文は、特にテーブル(配列)を扱う上で欠かせない命令文です。

  • INDEX項目に初期値を設定する (TO 整数)
  • INDEX項目を増やしたり減らしたりする (UP BY / DOWN BY)
  • INDEX項目の値を別のINDEX項目にコピーする (TO 識別子)

これらの使い方をマスターすれば、ループ処理やテーブル検索など、COBOLプログラミングの幅がグッと広がります。

最初はちょっと戸惑うかもしれませんが、この記事で解説したポイントを押さえて、実際にコードを書いて動かしてみれば、すぐに慣れるはずです。

【関連記事】

>> 今さら聞けない「COBOLとは?」

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ