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

IBM i 基礎理解からRPG開発までの学習ステップ
- 第7回:ILE RPG開発について( パラメーター受け渡しPGM、デバッグ ) -

はじめに

松田:「前回はDO~ENDDOによるREADの繰り返しとCHAIN命令について学びましたね。今回はもう一歩進んで、パラメーターの受け渡しとデバッグについて学びたいと思います。」

渡邊:「今まではプログラム内にパラメーターを記載していたので、受け渡しとなるとより実用的な内容になりそうですね。デバッグはプログラム作成には必須な作業なので、どちらも楽しみです!」

パラメーター受け渡しPGM

松田:「パラメーターの受け渡しは、プログラム内で別のプログラムを起動する時とプログラム開始時(CALL時)に必要になる場合があります。今回はプログラムの開始時のパラメーター受け渡しについて説明したいと思います。」

渡邊:「プログラムの開始時にパラメーターの受け渡しを行うとは、具体的にどのようなことですか?」

松田:「良い質問ですね。プログラムの作成に入る前に、CALL時のパラメーター受け渡し方法について説明します。例えば、ライブラリーSAMPLE1のプログラムPGM10を実行する時のプロンプトは以下になります。パラメーターの部分に受け渡したい値を入力して実行します。複数受け渡すことも可能ですよ。」

渡邊:「なるほど。つまり、パラメーターとはプログラムとプログラムの間を行き来する文字や数値などの情報の入れ物ですね。文字列と数値があると思うのですが、どのように入力するのですか?」

松田:「文字列の場合は【'】(シングルコーテーション)で受け渡したい文字列を囲みます。例えば【00003】であれば、【'00003'】ですね。数値については、この後詳細を説明しますが、符号付き整数を16進数で表記・表現する必要があります。その際、プラスとマイナスの符号を末尾にアルファベットで付加して渡す必要があります。CALLする際、数値を受け渡すときはパック10進数として渡されます。これは決まったルールです。」

渡邊:「数値は16進数で入力なのですね。確かにややこしそうです。では具体的なプログラムを教えてください。」

<使用する物理ファイルBDCMPF>

<前回のプログラム>
<サンプルプログラム>
パラメーターを受け渡してCALLするプログラム「PGM10」
<実行結果1>※社員マスタファイルに存在する番号を入れたとき
<実行結果2>※社員マスタファイルに存在しない番号を入れたとき

松田:「今回のプログラムは、前回記事で紹介したプログラムの改修版です。前回のプログラムと比較すると、上記画像における赤枠内の内容が異なっています。前回のプログラムでは、ファイルの読み出しのためのレコードが固定値で設定されています。これでは、毎度知りたい会社番号のデータを調査するたびにプログラム修正が必要になってしまいます。今回は、この課題を解決するためにパラメーターの受け渡しパターンに書き換えました。ユーザーがプログラムの呼び出し時にパラメーターに任意の番号を入力するので入力内容によって表示される結果が変わります。また、もし社員マスタファイル【BDCMPF】に登録されていない会社番号がパラメーターで受け渡された場合は「失敗した」と表示される仕様にしています。
そのうえで改めて、プログラム全体を説明すると、変数【BANGO】をパラメーターで受け渡し、BANGOにてDBファイルをCHAINしてその【BANGO】に該当する会社番号(CMBANG)の仕入れ額と売上額を表示のうえ、粗利を算出するという内容です。」

渡邊:「プログラムにより汎用性を持たせることができるのですね!パラメーターの受け渡し、非常に便利です!!」

松田:「そうです!せっかくなのでこれまで学んだRPGLEの知識を少し復習していきましょう!早速ですが、CHAIN命令の役割はなんですか?」

渡邊:「CHAIN命令では、特定のレコードをピンポイントに読みにいくことが可能なため、数千といったレコードが存在していても簡単にレコードの読みとりができるといった特徴があります。」

松田:「はい、その通りです!さすがですね!!さらに復習ですが、IFEQ命令が登場するときはELSE、ENDIFもセットで使用します。ちなみに、IFEQ命令は「If Equal」(等しいならば)という英語をコマンド化したものになります。この命令ではA=Bかどうかを確認していますので、A=Bの場合は直後の行からELSEの前まで実行し、その後ENDIFより下を実行します。A≠Bの場合は、ELSEの下からENDIFまでを実行し、その後ENDIFより下を実行します。」

渡邊:「上記の【実行結果2】のように今回の場合は標識がONになったとき、つまり社員マスタファイルに存在しない会社番号がパラメーターで受け渡された場合には【MESSAGE】を表示するという挙動になるんですよね。」

松田:「その通りです!反対に、【実行結果1】のように社員マスタファイルに存在する会社番号がパラメーターで受け渡された場合は売上額、仕入れ額をそれぞれ表示し、最後に粗利を算出しています。」

渡邊:「ここまで復習することでRPGLEの知識が着実に身についていると自信に繋がりました。今回、【*ENTRY】【PLIST】といった新たな命令文も出てきていますが、これはどんな意味になるのですか?」

松田:「【*ENTRY】【PLIST】と【PARM】の表現はセットで使います。*ENTRY PLISTと書くことで、プログラム起動時にパラメータを受け取ることを意味していて、後続のPARMで受け取ったパラメータを変数に代入しています。」

渡邊:「なるほど。ちなみに、命令文の書き方について順番はきまっているのですか?」

松田:「良い質問ですね。PARM命令はPLIST 命令の直後に指定しなければなりません。また、プログラム実行に数字変数で受け渡す時は、プログラム実行時のパラメーター設定でパック10進数を入れる必要があります。今回はBANGOに【00003】(BDCMPFにおいては会社番号に相当)を受け渡すために、CALL時のパラメータとしてパック10進数表記で【X'00003F'】と記載する必要があります。ちなみに、【3】ではなく【00003】である理由としては事前に物理ファイルの桁を5桁と設定しているのでその桁数に合わせる必要があるためです。パック10進数で受け取り、その後の処理はゾーン10進数で実施する必要があることから、D仕様書では【BANGO】と【BANGO2】というデータ型の異なる2つの変数を宣言して、パラメーター受け渡し後に変換しています。」

松田:「【X'00003F'】は16進数値と呼ばれるもので、頭に【X】をつけ、シングルコーテーション【'】でくくった中に数値を入れることが決まっています。末尾は符号を表していて、プラスは【F】マイナスは【D】となります。符号を含めた桁数を偶数にする必要があり、奇数の場合は先頭に【0】を追加します。今回は【00003】と【F】なので6桁となり、【0】は追加しません。」

■数値「00003」をパック10進数で表現する

松田:「システムは一般的に二進数(16 進数)で数値を取扱いますが、RPG においては演算誤差が発生しない10進数演算の正確さと、ディスク容量やメモリを節約する高いデータ圧縮効率を両立できるためパック10進数を採用しています。」

渡邊:「特殊な書き方ですね。慣れる必要がありそうです。」

松田:「そうですね。ちなみに文字列であれば、シングルコーテーションで括るのみで良いので、【'00003'】となりますよ。」

デバッグ

松田:「ファイルを読むプログラム作成を理解できましたね。最後にデバッグのお話をしたいと思います。デバッグとはどのような作業でしょうか?」

渡邊:「プログラムが意図しない動作やエラーが出てしまった時に、原因を突き止めて修正する作業です。具体的には、プログラムをソースの一行ずつもしくは、一時停止する場所まで動作させて、変数に入った値や動きを確認して、想定していない値や動きを見つけて、ソースを見直し修正し、再度実行して検証します。場合によっては何度か繰り返すんですよね。」

松田:「その通りです。完璧な回答ですね。早速始めましょう。」

渡邊:「はい、よろしくお願いいたします!」

松田:「まず、ILE RPGでは対話式でソースデバッグを行うことができます。ソースを表示しながらステップ・バイ・ステップでデバッグを行います。」

渡邊:「なるほど、VisualBASICやVisualC++等のオープン系の言語と同じですね。具体的にはどのような流れですか?」

松田:「良い質問ですね。まず全体の流れをお話しします。流れは以下の通りです。詳細は後ほどお話ししますが、デバッグ用にプログラムを再度コンパイルして、デバックを開始、プログラムを一時停止する場所(停止点やブレークポイントと呼びます。以降停止点で記載。)を決めて、プログラムを実行し、停止点で止まった時の変数の値等を確認し、ステップ・バイ・ステップで1行ずつプログラムを進め、確認が終わったらプログラムを最後まで実行して、デバックを終了する流れです。その後、デバック結果からソースを見直し修正します。場合によりますが、再度デバッグを行い動作を確認します。」

渡邊:「デバッグの流れもVisualBASICやVisualC++と似ていますね。」

松田:「そうなのですね。今回は、先ほど学習した以下のパラメーター受け渡しのプログラムを対象にしたいと思います。まず、①の事前準備です。デバッグしたいプログラムをコンパイルする時に、『デバッグ用ビュー』の項目を『*SOURCE』に変更してコンパイルする必要があります。ソースメンバーのオプションに【14】を入れて、【F4】を押して、コンパイルのプロンプトを出しましょう。」

渡邊:「この作業は、コンパイルしたプログラムに、ソースの情報を追加する作業ですか?」

松田:「その通りです。プログラムはコンパイルしてしまうと、プログラムを動作させるマシン語に変換されてしまい、ソースの情報は持ちません。このオプションを変更することで、ソースの内容を追加することができます。」

渡邊:「やはりそうでしたか、作業を進めます。」

渡邊:「はい。表示しましたが、この項目はありませんね。」

松田:「そうなんです。追加のパラメーターになるので、【F10】の追加のパラメーターを押して、【PgDn】(Pagedown、以降PgDnで記載)で次のページに進みましょう。」

渡邊:「表示しました。『*STMT』を【*SOURCE】に変更して実行し、コンパイル完了します。」

松田:「コンパイルできましたね。一度、【*SOURCE】に変更した状態でコンパイルしておくと、ソースを編集しない限りは今後も対話式のデバッグができます。もし、ソースを編集した場合には再度上記の変更を行ってからコンパイルし直しましょう。②STRDBGでデバック開始です。今のジョブがデバッグモードに切り替わります。それではコマンドラインで【STRDBG】を入力し、F4を押しましょう。」

渡邊:「はい、表示されました。項目がたくさんありますね。」

松田:「今回は細かい説明は省略しますが、プログラムにプログラム名、ライブラリー名、『実動ファイルの更新』を【*YES】にして、実行を押しましょう。」

渡邊:「『実動ファイルの更新』とは何を示しているのでしょうか。」

松田:「良い質問ですね。IBM iでは、ライブラリーはプロダクション・ライブラリーと、テストライブラリーの2種類があります。プロダクション・ライブラリーは本番運用のライブラリーを意味しています。以前学習したように【CRTLIB】コマンドでライブラリーを作成しますが、『ライブラリー・タイプ』で設定します。以下の様に初期値はプロダクション・ライブラリー(*PROD)です。プロダクション・ライブラリーの場合は、デバッグの際に不用意にそのプログラムが使用するデータベースを更新しないようロックがかかる仕組みになっています。『実動ファイルの更新』を【*YES】にすることで、データベースを更新できるようになります。このプログラムではデータベースの更新は含まれていませんが、デバッグの手順を学ぶために入れておきましょう。」

渡邊:「なるほど、運用を考えた良い機能ですね。以下の様に入力しましたので、実行します。」

渡邊:「見慣れない画面が表示されました。ソースが表示されているようですね。」

松田:「そうです。先ほど再コンパイルする際に【*SOURCE】に変更したことにより、ソースが見えています。この画面では、デバッグを行った際に一時停止する停止点を設定します。停止点は最低でも1行設定する必要があります。設定しないと、プログラムが実行されて終了してしまいます。ここでは、プログラム実行時に受け渡したパラメーターを使って、CHAINが終わった16行目に停止点を付けましょう。16行目は次のページになりますので、【PgDn】を1回押して、カーソルを16行目に移動して、【F6】を押してください。」

渡邊:「はい、押しました。行番号16が白字になりました。」

松田:「ありがとうございます。停止点が設定できましたね。もう一度16行目で【F6】を押すと、停止点を削除できますよ。ちなみに、デバッグ作業では、変数の値がプログラムの中でどのように変わってゆくか見るケースが多いです。プログラムが長いと該当する変数を見つけて停止点を設定するのが大変です。この画面で検索することができます。実際に作業は行いませんが、手順だけ説明しますね。」

渡邊:「はい、実際の業務プログラムだと100行以上も普通と聞きますので、大事ですね。」

松田:「その通りです。今回のプログラムで変数『ARARI』について確認したいとします。画面下部のデバッグに【F ARARI】と入力します。【F】はFINDを意味していて、【FIND ARARI】と入力することもできます。以下の画面のように入力したら、実行キーを押します。」

松田:「すると、最初の『ARARI』が使われている7行目に移動します。7行目はD仕様書で『ARARI』を定義している行なので、数値を代入する前なので停止点を設定することはありません。」

松田:「次の『ARARI』を検索したいときは【F16】を押します。【F16】は【SHIFT】+【F4】です。すると25行目に移動します。必要に応じて【F6】で停止点を設定します。【F16】は画面下部に説明が出ていませんが、【F24】を押すと、ファンクションキーの説明の続きが出ます。以下のように『F16=検索の繰り返し』です。【F16】を繰り返し押すことで、その次を検索してくれます。」

渡邊:「なるほど、プログラムが長い時は助かりますね。」

松田:「話を戻しましょう。16行目に停止点の設定が終わりましたので、【F3】で終了しましょう。なお、停止点はデバッグ中に追加することもできます。次に③CALLでプログラム実行です。まず、このプログラムでは、以下の物理ファイルBCDMPFをCHAINしますので、存在する会社番号【00003】の16進数【X'00003F'】をパラメーターとして以下のCALL命令で実行してください。」

<CALL命令>
■物理ファイルBCDMPFのレコード内容

渡邊:「はい。終了して、CALLしました。STRDBGと同じ画面が出ていますね。16行目が白字になっています。」

松田:「はい、最下部に『行 16 が停止点』と出ていますね。現在16行目で一時停止しています。確認したい変数にカーソルを合わせて、【F11】を押すことで変数に格納した値を見ることができます。ここで質問です。CHAINで使用している標識90はどんな値が格納されていると思いますか?」

渡邊:「ここでは、CHAINでレコードを見つけることができるので、『0』になると思います。ちなみに、標識とは論理変数という名の変数の一種の認識であっていますか?」

松田:「はい、合っています。では、16行目の『*IN90』にカーソルを移動して【F11】で確認してみましょう。」

渡邊:「最下部に『*IN90 = '0'』が表示されました。なるほど、このようにデバッグするのですね。」

松田:「そうです。【F10】で1行ずつステップ実行、【F12】でしたら実行を再開します。この後【F10】を押すと、16行目のIF文の結果として、次にどこに移動するでしょうか。」

渡邊:「ここは『*IN90 = '0'』であったことから、90の標識はOFFなので、19行目のELSEに移動すると思います。【F10】を押してみますね。確かに19行目に移動しました。」

松田:「正解でしたね。つまり、レコード読み取りが成功すると標識は '0'、失敗すると標識は '1' にセットされるのです。CHAINで会社番号【00003】のレコードは読めているので、仕入額(変数名『SHRGKU』)は読み込んでいます。20行目で使用しますので、『SHRGKU』で【F10】を押すと、仕入額【99000000】が表示されるはずです。やってみましょう。」

渡邊:「実際やってみます。『SHRGKU = 0099000000.』と表示されました。」

松田:「このように実際のデバッグでは、変数や標識の値を確認するだけではなく、想定した動きをしているかを確認します。では、【F3】で終了して、存在しない会社番号【00006】の16進数【X'00006F'】でCALLしてみてください。先ほど設定した停止点は16行目で残っていますので、16行目で止まります。」

渡邊:「実際やってみます。終了して、CALLしました。16行目で止まっています。同じようにやってみますね。」

渡邊:「標識90は、『*IN90 = '1'』になっています。次に【F10】でステップ実行すると、16行目のIF文で標識90はONなので、値は【1】です。その後、17行目に行くはずです。」

渡邊:「【F10】で実行すると、想定通り17行目に移動しました。仕入額は読取れていないので『0』で表示されるはずです。」

渡邊:「『SHRGKU』で【F11】すると、『SHRGKU = 0000000000.』と表示されました。」

松田:「はい、想定通りでしたね。ちなみに、この画面で【F6】で停止点を追加することができます。この後は、18行目でDSPLYしたら、39行目のENDIFに移動しますので、【PgDn】で次の画面に移動して39行目に停止点を加えてみましょう。」

渡邊:「39行目に停止点を加えることができました。」

松田:「それでは、【PgUp】して、現在の停止点に戻り、【F12】で再開してみましょう。」

渡邊:「【PgUp】しました。現在17行目で一時停止しています。この後、【F12】を押すと、39行目で停止するはずですね。【F12】押します。」

渡邊:「想定通り、39行目で停止しました。」

松田:「ありがとうございます。それでは【F12】を押して、最後まで実行して終了させましょう。」

渡邊:「はい。プログラムが終了しました。」

松田:「それではデバッグを終了しましょう。④ENDDBGで終了です。」

渡邊:「【ENDDBG】と入力して実行しました。特にメッセージはでないのですね。」

松田:「はい。これで、このジョブのデバッグモードが解除されました。【ENDDBG】を忘れてしまうと、このジョブでプログラムを実行するとデバック動作してしまいますので、忘れずに実行してください。今回は想定通りの動作をするプログラムでデバッグを行いましたが、通常は想定通りの動作しない時にデバッグを行いますので、デバックの結果を元に⑤ソース編集でソースを見直し修正します。修正後に再度デバッグを行い、動作確認を行うこともあります。」

渡邊:「はい、【ENDDBG】覚えておきます。デバッグの一連の流れ、今後のプログラム作成時に活用してゆきたいと思います。」

最後に

松田:「今回は7回にわたってRPGLEの開発という観点で情報を発信してきましたが、いかがでしたか?」

渡邊:「これまでのシリーズとは角度が異なり、プログラムにおける詳細なルールや手法を学んだのでかなり実務的に使える知識が身についたと感じます。」

松田:「まさに狙いはそこでした!ただ、これまでお話した内容はすべてOSなど標準機能が揃った状態から使える機能ばかりです。つまり、本来であれば事前のセットアップが必要になるわけです。」

渡邊:「言われてみればそうですよね。」

松田:「業務システムの運用では、インフラ部分の知識を少しでも知っておくだけで対応できる幅が広がります。」

渡邊:「では、次のシリーズでOSの基礎知識も学んでいくというのはどうでしょうか?」

松田:「グッドアイデアですね!ぜひ、インフラの知識も増やしていきましょう!!」

次回シリーズの予告

松田:「次回シリーズではPOWERサーバーのインフラ部分に注目し、OSの基礎知識やライセンス、PTF(WindowsでいうとWindowsアップデート)などの情報をメインに扱っていきます。」

渡邊:「とても楽しみですね!例えば、今回作成したオブジェクトのバックアップなんかも紹介してもらえると開発~運用まで一気にマスターできそうですよね。」

松田:「渡邊さん、素晴らしいご提案ですね!ぜひシリーズ内で紹介していきたいと思います。」

<<第7回にわたり、本シリーズを読んでくださりありがとうございました。次回シリーズもどうぞよろしくお願いいたします!>>


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


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








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

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

あわせて読みたい記事

PAGE TOP