適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

【AS400 IBMi CL】CLのサブルーチンについて

IBM i(AS400)のCLでサブルーチンを使う方法とその注意点について備忘録がてら書き残しておきます。

環境

IBM i 7.1

サブルーチン、お前、CLでも使えたんか!!

Control Languageという名前が示すようにCLはジョブコントロールに使われることが多いCLですが、サブルーチンも使えます。

RPG書くのかったりーなんて時はCLで代用しますが、私は、そんなときに使っております。

定義

 
/*サブルーチンの定義*/
SUBR SUBR([必須]サブルーチン名)
  処理                 
RTNSUBRRTNVAL([オプション]数字4桁まで)
ENDSUBR             

RTNSUBRが呼び出されるとそこでサブルーチンから呼び出し元に戻ることになります。

そのときに設定できるRTNVALはオプションで、TYPE(*INT)かつLEN(4)の任意の変数を指定することができます。

数字しか指定できないので使い勝手はビミョー・・・。

RTNVALが定義されていない場合や、そもそもRTNSUBRが実行されずにENDSBRで終了した場合は、戻り値に0が設定されます。

定義する場所

CLプログラムのどこにでも定義できるわけではなく、定義できる場所が決まっています。

CLのサブルーチンは「ENDPGMの前」にのみ定義することができます。

 
PGM
処理
・
・
SUBR SUBR(サブルーチン)
  処理
RTNSUBR
ENDSUBR
ENDPGM

ENDPGMの前以外に定義しようとするとコンパイルエラーになります。

複数定義する場合

サブルーチンを複数定義する場合は次のように連続して定義します。

 
SUBR SUBR(サブルーチン1)
  処理
RTNSUBR
ENDSUBR
SUBR SUBR(サブルーチン2)
  処理
RTNSUBR
ENDSUBR
ENDPGM

ENDSUBRとSUBR・ENDPGMの間に他の命令を挟むことはできません。

コメントは書くことができます。

呼び出し方

 
CALLSUBR SUBR([必須]サブルーチン名) RTNVAL([オプション]変数)

RTNVALが定義されていない場合は、戻り値は無視されます。

ナウい言語のように引数は取れないので、仕方ないのでプログラム内のグローバルな変数を定義して使うしかありません。

また、戻り値についても数字4桁しか返せないので同じくグローバル変数をごにょごにょします。

変数のスコープがそのプログラム全体になるので、バグが発生しないように慎重に使いましょう。

といってもRPGなどのAS400系のプログラミング言語を使う人にとっては釈迦に説法ですが。

メッセージを表示する簡単なサブルーチンの例

「HELLO WORLD」という文字列と、サブルーチンからの戻り値を表示するCLプログラムです。

 
PGM
DCL VAR(&RTN) TYPE(*INT) LEN(4)
CALLSUBR SUBR(TESTRTN) RTNVAL(&RTN)
SNDPGMMSG MSG(' 戻り値 ='||%CHAR(&RTN))
SUBR SUBR(TESTRTN)
SNDPGMMSG MSG('HELLO WORLD')
RTNSUBR RTNVAL(1)
ENDSUBR

終わりに

IBM i(AS400)のCLでサブルーチンを使う方法について紹介しました。

今日日こんなこと知りたいと思っている人もいないかも知れませんが、せっかくなので書き残しておきます・・・。

というわけで、ここまでお読みいただき、ありがとうございました。