メニューボタン
IBM i お役立ち情報2026.06.24

IBM i 基礎理解からRPG開発までの学習ステップ
- 第6回:ILE RPG開発について( 繰り返し処理、特定レコードの読み取り ) -

はじめに

松田:「前回は、四則演算やファイルの1レコードを読むというプログラムを学びました。今回は、さらにステップアップしまして、ファイルを繰り返し読むプログラムを学んでいきたいと思います。」

渡邊:「今回の内容を学べば、ファイルを順に読んでさらにプログラムでできることが増えそうですね。楽しみです!」

READ命令を使用した繰り返し処理を行うプログラム

松田:「前回は、1件目のレコードのみ読んで計算していくという内容でした。その際に使った命令はREADでしたね。」

渡邊:「READ命令でポイントになるのはファイルのレコード様式を指定するということでしたね。今回はファイルを繰り返し読んでいくとのことですが、命令文は何になりますか?」

松田:「ファイルのレコードを繰り返し読む場合、READ命令を読みたいレコード分だけ繰り返して使用するという方法があります。これはソース上からも何件読んでいるかわかりやすいのですが、例えば読みたいレコードが上から数えて30件目だった場合、READ命令を30回書くというのは現実的ではありません。そういった場合に登場するのが【DO命令】です。何かの処理を繰り返し行うという場面で、DO命令を使用します。今回は、ファイルを繰り返し読むのでDO-ENDDOという1つの括りの中にREAD命令を入れる形で記述します。」

渡邊:「新たな命令文が出ましたね。まずはDO命令の使いかたについて具体的に知りたいです。」

松田:「では、早速サンプルプログラムを使って解説していきますね。」

渡邊:「今回は、どのようなプログラムを扱うんでしょうか。」

松田:「以前から登場しているファイル【BDCMPF】について、READ命令を繰り返し実行して最後のレコードまで読んでいき、すべての結果をDSPLYしていきます。最終形態は以下のようなプログラムになります。」

<プログラム>
<物理ファイルBDCMPF>

渡邊:「まずはF仕様書で使用するファイルの宣言を行うのですね。」

松田:「その通りです。少し復習となりますが、F仕様書で注目するポイントは以下画像の赤枠部分です。実際のファイル名を指定します。さらに、今回ファイルのキー値を使用したいので、レコード・アドレス・タイプに【K】を入力します。」

<F仕様書のパラメーター>

松田:「次にC仕様書の命令に注目です。少し復習になりますが、ファイルを読む際のREAD命令では裏側で実行中にファイル上のカウンターを保持していて、今どこまで読んでいるのか管理しているイメージとなります。なので、READ 命令実行前にはこれから読むべきレコード位置を示し、READ 命令が実行されると次に読むべきレコード位置を示すように自動的に更新されます。」

渡邊:「復習できて安心です。確かにこのポインタ機能がなければ繰り返し処理を入れても毎回同じレコードを読みに行ってしまいますね。READ命令はDO-ENDDO命令を使うことにより、1レコードずつ、次へ次へと読んでいくのですね。」

松田:「その通りです!続いて、繰り返し動作について解説します。3行目のDO命令と11行目のENDDO命令の間が繰り返されます。」

松田:「3行目のDO命令は以下の様に設定していて、項目2の【*HIVAL】は、そのデータ型で取りうる最大値を示します。DO 文の演算項目 2 の限界値として使われる場合、繰り返し回数は実質的に無限になるため、今回の場合は繰り返しの最大値になるまで繰り返し処理を続けることを意味しています。」

渡邊:「なるほど、物理ファイルのレコード数は5個なので、繰り返しは5回で良いと思いますが、どのようにこの繰り返し命令を抜けるのでしょうか?」

松田:「良い質問です。そもそも処理の流れをイメージすると、ループを抜けずに処理を継続するかループを抜けるかを判断するプロセスがあり(このプログラムでは IFEQ に該当)、その判断の際に参照される情報が標識です。前回COMP命令とREAD命令の標識のお話をしましたね。」

渡邊:「はい。命令によって、標識の意味が変わると聞きました。」

松田:「そうです。4行目では物理ファイルを読んでいますが、プロンプトで確認すると標識の【EQ】に標識【90】が入力されています。前回の表に照らし合わせると、標識【90】はEOF(End of File)すなわち最後のレコードを既に読み終えていたら(次に読むべきレコードが存在しない場合には)【ON】になります。」

松田:「そして、5行目のIFEQ命令です。まずIFEQ(IF Equal)命令の動作説明をしますね。IFEQ命令は、ELSE、ENDIFをセットで使用します。IFEQ命令の行ではA=Bかを確認しています。A=Bの場合は直後の行からELSEの前まで実行し、その後ENDIFより下を実行します。A≠Bの場合は、ELSEの下からENDIFまでを実行し、その後ENDIFより下を実行します。」

渡邊:「なるほど、IFEQ命令の動作は理解できました。」

松田:「5行目に話を戻しますね。前回少しお話ししましたが、標識【90】を演算項目1、演算項目2、結果のフィールド使う時は頭に『*IN』を付けます。よって項目1は標識【90】を示しています。また、項目2の【*ON】は標識がONになっていることを意味しています。よって、このIFEQ命令では、標識【90】がONだったらとなります。標識【90】がONになったら、6~7行目を実行し、標識【90】がONでない場合は、9行目を実行します。」

渡邊:「なるほど。標識はこのように使うのですね。物理ファイルを最後まで読んだら(標識【90】がON)、6行目で『END』を表示するのですね。7行目の【LEAVE】命令は何を意味しているのですか?」

松田:「【LEAVE】命令は、DO-ENDDOの繰り返しを抜けるという意味になります。よって、12行目に移動してプログラムは終了します。一方標識【90】がONでなかった場合は、ELSE命令以下、ENDIFまでを実行しますので、9行目で物理ファイルのカラム、CMNAKN(会社名-カナ)を表示します。その後、11行目のENDDOに至ることで、再び3行目にもどります。」

渡邊:「DO-ENDDO命令、IF文理解できました。このプログラムを実行してみますね。物理ファイルBDCMPFの会社名カナの値が全て表示され、最後にENDが出ています。」

松田:「はい、正しい結果が表示されましたね。READ命令はDO-ENDDO命令を使うことにより、1レコードずつ、次へ次へと読んでいきます。このようなREAD命令の繰り返しの具体例として、業務システムにおける集計が挙げられます。今度は、物理ファイル【BDCMPF】の【売上高】5件の合計を集計して表示するプログラムに変更してみてください。」

<物理ファイルBDCMPF>
<物理ファイルBDCMPFのDDS定義>

渡邊:「集計プログラムができました!プログラムと実行結果は以下になります。」

<プログラム>
<実行結果>

松田:「すばらしいです!四則演算の学習も反映されていますね。10~11行目で物理ファイルから読取った【会社名】と【売上高】を表示し、12行目で売上合計用の変数【URIAGEKEI】に売り上げを加算していますね。また、物理ファイルの最後まで読み込んだら、7行目で売上合計用の変数【URIAGEKEI】を表示していますね。」

渡邊:「ありがとうございます。業務プログラム作成に近づいた気がします。」

松田:「そうですね。企業で使われる業務プログラムは、このプログラムの発展形となりますね。学習を続けましょう。」

CHAIN命令を使って計算を行うプログラム

渡邊:「READ命令とDO-ENDDO命令の使い方はわかりました。これらの命令文は、あくまでもファイルを上から下まで読みに行くケースで使える命令文かと思いますが、たとえば膨大なレコードがある中から特定のレコードを読みにいきたいときはどうすればいいのでしょうか。」

松田:「そんなときは【CHAIN命令】を使います!CHAIN命令では、特定のレコードをピンポイントに読みにいくことが可能なため、数千といったレコードが存在していても簡単にレコードの読みとりができます。」

渡邊:「CHAIN命令は聞いたことがあります。早速、サンプルプログラムを通じて詳細を知りたいです。」

松田:「具体的なプログラムで見ていきましょう!まずは簡単なプログラムから説明しますね。今回も物理ファイル【BDCMPF】を使います。プログラムのソースと結果は以下の通りです。CHAIN命令で3番のデータを見に行くよう命令し、会社番号:3番のCMNAKJ【会社名ー漢字】のレコードを結果として表示します。」

渡邊:「シンプルでわかりやすいですね!CHAIN命令の使い方もばっちりわかりました。」

<物理ファイルBDCMPF>
<簡単なプログラム>
<実行結果>

松田:「よかったです!つぎに、少し難易度の高いプログラムの解説を行います。ソースと結果は以下の通りです。このプログラムでは、前述した物理ファイル【BDCMPF】(社員マスタファイル)の会社番号:3番における【仕入額】と【売上高】のデータをファイルから取り出し、最終的に取り出した2つの値を使って粗利を計算しています。このプログラムでポイントとなるのは、MOVE命令でCMBANGという変数に値を指定し、そのままその番号に応じた値をCHAIN命令で取り出すところです。」

<プログラム>
<実行結果>
<Z-ADD命令>
<MOVEL命令>

渡邊:「以前学んだ減算の命令文【SUB】に加え、【Z-ADD】や【MOVEL】が登場していますね。」

松田:「いいところに気がつきましたね!Z-ADD命令はゼロにして加算するという意味です。この命令は結果が数字になるケースでしか使えません。MOVEL命令は左に詰めて代入するという意味です。文字型データの代入場面でよく使います。固定長のRPGLEでは、スペースが空白の値として有効になります。」

渡邊:「なるほど、空白まで有効な値として扱われるため、空白を取り除く場合に左詰めでデータが格納されるMOVEL命令を使うということですね。」

松田:「はい、その通りです。ちなみに、MOVE命令自体は右詰めで代入することを意味するので、MOVELのような命令も用意されているというわけです。」

次回の予告

松田:「今回は、業務システムを意識して、読み込んだファイルのデータを集計するプログラムやCHAIN命令を使って特定のレコードを取り出すプログラムを学びました。どうでしたか?」

渡邊:「これまでは、なんとなくプログラムの経験がなくてもロジックを想像しながら進めることができましたが、今回は繰り返し処理や特定レコードを読み取った後の処理など考える要素が増えたので難しかったです。」

松田:「そうですよね。プログラムの基本は変わりませんので、混乱したらまずは上から順に処理を確認していきましょう。次回はもう少し難易度を上げて実行時にパラメーター値を受け渡して結果を得るようなプログラムを解説します。また、次回は意図しない動作やエラー発生時に役立つデバッグについても学んでいきましょう。」

渡邊:「いよいよデバッグの登場ですね。楽しみです。」

次号へつづく


渡邊 隆
ベル・データ株式会社 アプリケーションマネージメントサービス本部 AMSデジタルイノベーション部


ネットワーク、オープン、セキュリティ、DX関連のプリセールス、構築、サポートを経て、現在はAMSデジタルイノベーション部に所属。工場DXソリューションを担当しながら、初挑戦のIBM i に格闘中。休日は、クラッシックピアノの練習や仲間との弾き合い会を楽しんでいます。








松田 三奈
ベル・データ株式会社 アプリケーションマネージメントサービス本部 AMSデジタルイノベーション部

新卒よりインフラエンジニアとしてPowerサーバーのリプレイスに従事し、現在はAMSデジタルイノベーション部に所属。休日は、カフェ巡りや旅行など天候に関わらず外に出てアクティブに活動することが好きです。

あわせて読みたい記事

PAGE TOP