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

IBM i 基礎理解からRPG開発までの学習ステップ
- 第5回:ILE RPG開発について②( 四則演算、ファイルを読む C仕様書・D仕様書・F仕様書 ) -

はじめに

松田:「前回は簡単なプログラムを作成しましたが、今回は応用編として四則演算やファイルの読み込みを行っていきます。」

渡邊:「ファイルを読み込むのですね!いよいよお客様が普段使われているILE RPGの使い方に近づいてきましたね!」

松田:「そうです!より現場のユーザー様目線で実習してみましょう。」

数字の足し算

<以降では、ファイル読み込みプログラム以外、プログラム全体のソースを見ながら解説させていただきます。>

松田:「数字変数を使って計算を行うプログラムを解説します。」

渡邊:「これまでは文字変数を使っていましたが、数字変数となるとパラメーターの設定にも違いがありそうですね。」

松田:「そうなんです。作成したプログラムがこちらです。」

松田:「さらに結果は以下のようになります。」

渡邊:「今回はD仕様書で数字変数『WK』、『WK1』、『WK2』を宣言し、WK1とWK2を足してWKに代入していますね。最終的にはWKをメッセージ表示させています。」

松田:「そうですね。【WK1+WK2=WK】については慣れないかもしれませんが、まずはこんな式の形になるんだくらいの理解で問題ないです。また、他言語でよく使われる【A = A + B】という形式の代入はもちろんRPGLEでも使用可能です。今回新たに出てきた命令に『EVAL』、『ADD』があります。EVALは、値を代入する際に使用し、ADDは変数を足し合わせる際に登場します。ADD命令は「被加数+加数=結果」の順に並べる形式で使用し、この並び順は基本的にその他の演算でも同様です。」

渡邊:「そうすると、このプログラムではWK1に1を代入し、WK2に2を代入し、1+2の結果をWKに入れて最後にメッセージとして表示しているということですね!」

松田:「その通りです!このプログラムの構成をみてわかるように仕様書の順番としてはD仕様書が上にきてC仕様書はそのあとにくる流れとなります。」

四則演算すべてのプログラム

松田:「このプログラムでは四則演算を行っています。各演算命令について、引き算は『SUB』、掛け算は『MULT』、割り算は『DIV』で割り算の余りは『MVR』で表現しています。なお、今回は内容が伝わりやすいよう整数演算のみご紹介します。」

渡邊:「よく見ると、割り算のところではWKに一度割り算の結果を入れつつも、最後には余りをさらに上書きで代入しているのですね。」

松田:「その通りです!結果としては以下のようになります。」

ファイルを読む

松田:「いよいよファイルを読むプログラムに入ります。第3回で作った物理ファイル、BDCMPFを読込み、従業員一人当たりの売上高を計算して表示しようと思います。物理ファイルの中身は以下画像の通りです。」

<第3回で作成した物理ファイル>

本シリーズ第3回記事:https://www.e-bellnet.com/category/knowledges/doc/2603-01.php

渡邊:「そうでしたね。物理ファイルをILE RPG上に読み込む場合は、F仕様書で定義するのですか?」

松田:「その通りです。F仕様書については、以下のフォーマットになっています。」

渡邊:「なるほど、C仕様書とはずいぶん異なっていますね。」

松田:「はい。でも、C仕様書と同様にプロンプトを使えば簡単に定義できますよ。今回は、F仕様書、D仕様書、C仕様書を使います。記載の順序は分かりますか?」

渡邊:「F仕様書、D仕様書、C仕様書の順ですね。」

松田:「その通りです。プログラム作成でまず初めに行うこととして、ソースメンバー名を決めてSEUで新規作成します。復習ですがソースファイルはオープン系でいうところのフォルダで、ソースメンバーはファイルになります。そして、変更することがなければソースメンバー名はそのままプログラム名にもなります。今回のソースメンバー名は『PGM5』です。ここからは仕様書のまとまりごとに解説していきます。まずは、F仕様書ですので『IPF』と入力する必要があります。第3回で作成した物理ファイル BDCMPFを使う場合は、以下のように入力しました。ファイル名には任意のファイル名を入れますが、今回は『BDCMPF』、ファイルタイプには今回は読み込むだけなので入力の『I』、ファイルの指定は『F』、ファイル形式は『E』、レコードアドレスタイプは『K』、装置は『DISK』を指定する必要があるます。それぞれに意味はありますが、最初はプログラムに慣れることが大事なのでこの通りに入力してみましょう。」

渡邊:「装置は『DISK』とありますが、現代は SSD や NVMe を搭載したシステムもありますが、そういった環境ではどのように設定するのでしょうか。」

松田:「いい質問ですね。ここでの『DISK』は物理的な"ディスク装置"そのものを指すのではなく、順次およびランダム処理の読み取り/書き込み機能をサポートするディスク・ファイルをまとめて指す慣用表現です。実際の保存媒体(HDD/SSD/NVMe)はシステム側で管理され、パラメーター指定の意味は変わりません。ただし、性能や配置方針(例えば大量IOを要する処理をNVMe上に置く等)は媒体の種類によって影響するため、その点は別途運用設計で検討する必要があります。」

渡邊:「なるほど、理解しました。このパラメーターでは、『DISK』以外の設定もあり得るのでしょうか。」

松田:「はい、このパラメーターでは『DISK』以外にもエミュレータ画面に情報を表示する際のレイアウト情報をまとめたものを使用する場合は『WORKSTN』、印刷出力の際のレイアウト情報をまとめたものを指定する場合は『PRINTER』を指定しますよ。」

渡邊:「なるほど、理解しました。画面ファイルや帳票ファイルとなると、業務用プログラムを作ることを想定している感じがしてわくわくしますね。パラメーターの入力が終わったので、実行キーを押すと以下の画面になります。」

松田:「次は変数の宣言で登場するD仕様書です。(画像内、赤枠の箇所です。)」

渡邊:「D仕様書は前回も登場したので、書き方はわかります。変数名に加えて、変数の長さや文字データなのか数字データなのかを設定しておく必要があるんですよね。数字フィールドの場合は、【内部データ・タイプ】に10進数(正確にはパック10進数)の『S』が入りますね。今回は数字フィールドのみですが、文字フィールドのケースでは『A』を入力するんですよね。」

松田:「はい、その調子です!さらに、初めて登場するファイルの読み込みをC仕様書で行っていきます。命令文としては、『READ』を使います。さらに、今回は物理ファイルから企業全体の売上高【URIAGE】と従業員数【EMPCNT】がわかっているので1レコード分のみになりますが、従業員1人あたりの売上高[【RESULT】を算出しています。ちなみに、今回EVAL命令が登場する理由としては変数をコピーする例をお見せするためです。そのため、物理ファイルのフィールド名をそのまま使ってプログラム上で計算してもOKです。その場合はD仕様書も不要となります。」

渡邊:「まずはREAD命令でファイルを読んでいくのですね。ファイル名【BDCMPF】をそのまま指定するわけではないのですね。」

松田:「実は、違います。READ命令には使用するファイルのレコード様式名(物理ファイルや論理ファイルにおける入力/出力単位(画面や1レコード分)を表すラベル)を指定します。物理ファイルのソースの3行目で宣言している【BDCMR】ですね。このレコード様式名は物理ファイル側で宣言しているものを使ってプログラムと物理ファイルを結びつけるのに使用します。」

■物理ファイル BDCMPFのソース

渡邊:「直後にDSPLY命令を入れているのはなぜですか?」

松田:「今回は、【売上高÷従業員人数=従業員1人当たりの売上高】の計算をおこなっているので割られる数と割る数の要素を予め表示したうえで計算結果があったほうがユーザーにとっても結果が見やすく、正しい計算が行われているかどうか確認できるためです。シンプルに書こうとする場合、もちろん結果のみ表示する内容でも正解ですが、ユーザーがどのように見るかを意識するならばより丁寧なプログラムを書く必要があるかと思います。」

渡邊:「なるほど。コーディングルールなどがない環境の場合はどうしても人によって書き方は変わるものだと思いますが、そういった時こそユーザー目線が必要なのですね。」

松田:「その通りです!そして、最後に除算ですね。DIV命令が新たに登場していますが、命令文の書き方はシンプルで以下のようなイメージです。」

渡邊:「除算を行った後、結果変数の【RESULT】をDSPLY命令で表示しているのですね。ちなみに、前回記事のプログラム例でも登場していましたが、RETURN命令にはどのような役割があるんですか?」

松田:「RETURN命令には、プログラムの処理(またはサブルーチン)を終了し、呼び出し元へ戻るという役割があります。その後に続くSETON LR とセットでRPG言語においてはプログラム終了処理の標準的なルールとなっています。」

渡邊:「決まった書き方なのですね。覚えておきます!!」

<完成後のソース>
<プログラム実行後の結果>

標識とは

松田:「RPGのC仕様書では、「標識」という言葉が頻繁に出てきます。標識がオン(ON)かオフ(OFF)かで、プログラムの動きを制御するための特殊なスイッチのようなものです。一般的なものとして、以下の種類のものがあります。ONの時は標識に格納された値は「1」となっていて、OFFの時は「0」になっています。」

渡邊:「この表の【LR】はILE RPGのプログラムの最後に記載するSETON LRですか?」

松田:「良いところに気が付きましたね。LR(Last Record)の標識をONにして、C仕様書の最後のレコードであることを宣言しています。」

渡邊:「なるほど、Last Recordだったのですね。納得です。他の標識は、どのように使うのですか?」

松田:「実際に具体的な例で解説していきますね。今回は、【COMP】命令を使って【WK】の数字を比較し、比較対象が10より大きいときには画面に結果をDSPLYで表示するというプログラムを作成するとします。COMP命令とは数字を比較するための命令です。」

渡邊:「具体的にはどのように比較していくのでしょうか。」

松田:「プログラムの中で標識というものを使って、条件によって判断させて結果をDSPLYで出すか出さないか制御していきます。具体的にC仕様書では以下の画像のようなイメージになります。【WK1】が【10】より大きい時は【HI】にセットした標識【50】がONになります。この標識【50】を使ってDSPLYする命令を別途記載します。詳細はこの後説明するので、標識のイメージだけつかんでください。」

渡邊:「なるほど。標識のイメージが湧きました。命令の結果を示してくれるフィールドですね。」

松田:「その通りです。ただ、標識はC仕様書の記述する場所により、意味が変わります。画像内の①は「制御レベル標識」、②は「条件標識」、③「結果の標識」となります。よく使用する、②条件標識と③結果の標識について、例を使って説明しましょう。まず先ほど少し説明した、③「結果の標識」です。」

松田:「例えば、先の例で③の【HI】に【50】を入れると、結果がWK1>10だったら標識【50】がONになると話しましたね。【LO】に【60】を入れれば、WK1<10で標識【60】がONになります。【EQ】に【70】を入れれば、WK1=10で標識【70】がONになります。」

渡邊:「なるほど、色々な制御ができそうですね。他の演算命令でも【HI】、【LO】、【EQ】の意味は同じなのですか?」

松田:「良い質問です!演算命令により意味は変わります。まず、IBM社の演算命令の説明で利用される以下の表の説明をしますね。表の下のC仕様書のプロンプトと見比べながら確認してください。【コード】にはプロンプトの【演算命令】(命令コードとも言います)に設定する演算命令、【演算項目1】は【項目1】、【演算項目2】は【項目2】、【結果フィールド】は【結果】に設定する内容が記載されています。【標識】には、C仕様書プロンプトの【HI】、【LO】、【EQ】の順番にどのような結果になった時に標識がONになるかを示しています。」

渡邊:「あれ、【COMP】命令はプロンプトの【HI】、【LO】、【EQ】と表に書かれた意味が同じですね。」

松田:「そうなんです。COMP命令では、たまたまプロンプトの項目名【HI】、【LO】、【EQ】と標識の意味が同じなのですが、「READ」命令では【HI】は使用できず、【LO】はエラー(Errorの省略語ER)が発生した場合に使う標識、【EQ】はファイルの最後に到達した(End Of Fileの省略語EOF)時に使う標識となります。READの標識は次回詳しくお話しするので、命令により標識の意味が変わることだけ理解してください。」

渡邊:「なるほど、これは便利ですね。他の演算命令はどうなのですか?」

松田:「他の演算命令については、以下のサイトにIBM i バージョン7.6の「演算命令」別の解説がありますよ。この表も記載されているのでチェックしてみてください。」

■IBM i バージョン7.6 ILE RPG解説書 命令コード
https://www.ibm.com/docs/ja/i/7.6.0?topic=functions-operation-codes

渡邊:「たくさんの「演算命令」の説明がありますね!活用できそうです。ところで、②の条件標識はどの様に使うのですか?」

松田:「条件標識は以下のプログラムを使って説明しましょう。まず、1~4行目の内容を説明してもらえますか?」

渡邊:「はい。1-2行目でD仕様書を使い、変数【WK1】と【WK2】が1桁の数字であることを宣言しています。3行目で【WK1】に8を代入、【WK2】に3を代入しています。」

松田:「その通りです。5行目のCOMP命令についてプロンプトで確認すると以下のようになっています。」

渡邊:「なるほど、【WK1】と【WK2】を比較した結果によって、【10】、【20】、【30】の標識がONになるのですね。」

松田:「そうです。6-8行目は条件標識です。6行目の先頭の【10】は標識【10】がONであればという意味になります。よってこの行は、標識【10】がONであれば【WK1>WK2】を表示します。7,8行目も同様です。ちなみに、標識の前に【N】を入れることもできます。【N10】であれば、【10】の標識がOFFだったらという意味になります。」

■6行目のプロンプト

渡邊:「条件標識、理解できました。結果の標識と条件標識を組み合わせて使って制御ができますね。」

松田:「はい。このプログラムを実行すると以下のようになります。」

渡邊:「【WK1】は【8】、【WK2】は【3】だったので、【WK1】と【WK2】を比較して、【WK1】の方が大きいことから、【10】の標識がONになり、6行目の条件標識に該当して【WK1>WK2】が表示されたということですね。色々な場面で使えそうです。」

松田:「これは標識の使い方の一例です。標識は、C仕様書の演算項目1、演算項目2、結果のフィールドでも使うことができて、その場合は標識の前に『*IN』を付けます。先ほどの【10】の標識であれば、【*IN10】となりますね。」

渡邊:「標識はフィールドにも使えるのですね!便利な機能ですね。」

松田:「そうですね。頻繁に利用するので慣れてゆきましょう。ちなみに次回のプログラムでも登場しますよ。」

次回予告

松田:「今回の内容はいかがでしたか?」

渡邊:「ファイルを読んで計算することを取組めたので、業務用プログラムの作り方が分かってきました。」

松田:「良かったです。次回の内容としては、READやCHAINを繰り返し行うプログラムを作って、より実務的に使えるプログラムを書けるようになりましょう!」

渡邊:「今回は1レコードだけの読みとりでしたが、繰り返し処理も学べるのですね。次回もよろしくお願いいたします。」

次号へつづく


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


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








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

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

あわせて読みたい記事

PAGE TOP