OS/400 コマンド作成講座 (1: 概要)

システムのほとんどのコマンドは OS/400 の機能で同じように作成することができます。
つまり特別な開発ツールやコンパイラなどは必要ない、ということです。(SEU はやはりあった方が便利ですが ...)

けっこう簡単に作れますし、コマンドにしておくとなんとなくそれっぽいのと、使い方がわかってもらいやすいこともあるので、ぜひ作成してみてはいかがでしょうか?

ということで、OS/400 コマンドの作り方を見ていきたいと思います。


どんなことができるのでしょうか?

コマンドそのものの作成は、ソースタイプ CMD でコマンドのソースメンバを作成し、CRTCMD コマンドでコンパイルする、という手順になります。
コマンド作成時にコマンド処理プログラムを指定します。
コマンドからパラメータがわたって来ますので、これを処理するプログラムを作成します。パラメータの数とタイプを正しく受けられればどんな言語で作成しても OK です。

コマンド処理プログラムについてはまた後で述べることとして、まずは何回かの記事を使ってコマンドの作成の仕方を見ていきたいと思います。

とりあえず最初に、例として CRTLIB コマンドの形をまねてほとんど同じように作成できることを見ていきましょう。

こちらが OS/400 本家本元の CRTLIB コマンドのプロンプト画面です。

どんなふうに作るのでしょうか?

ソースの入力

CRTSRCPF コマンドで何かソースファイルを作成して、タイプを CMD でソースメンバを作成します。
今回は面倒なのでシステムにそのままある QGPL/QCMDSRC を使用しています。(タイプがそのまま CMD になるようになっています)
メンバの名前はなんでもいいのですが、今回は CRTLIB2 としてみました。

以下のように入力します。

コンパイル

これを以下のように CRTCMD コマンドで作成します。
「コマンドを処理するプログラム」はここでは存在チェックなどされないので、コマンドの見栄えだけを見る場合は、このように適当な名前を指定しても OK です。

結果

作成した CRTLIB2 コマンドを見てみましょう。
コマンド入力画面で CRTLIB2 と打ち込んで F4 キーを押してみると以下のような画面になります。ほとんど同じなのが確認できますね。

「テキスト記述」のところに "&" と入力して実行キーを押すと

「テキスト記述」の入力域が伸びるようになっています。


コマンドのソース

あらためてコマンドの全文です。

CMD PROMPT(' ライブラリーの作成 ') 
PARM KWD(LIB) TYPE(*NAME) LEN(10) MIN(1) PROMPT(' ライブラリー ') 
PARM KWD(TYPE) TYPE(*CHAR) LEN(5) RSTD(*YES) DFT(*PROD) VALUES(*PROD *TEST) MIN(0) + 
     PROMPT(' ライブラリー・タイプ ') 
PARM KWD(TEXT) TYPE(*CHAR) LEN(50) DFT(*BLANK) VARY(*YES) INLPMTLEN(17) + 
     PROMPT(' テキスト記述 ') 

それぞれ内容を見ていきましょう。

CMD PROMPT(' ライブラリーの作成 ')

コマンドは必ず最初に CMD で始まります。
CL の PGM と同じようなものですが、CL の PGM は省略してもコンパイルできますが、コマンドの CMD は省略できません。

一番上の行の、コマンド自体のプロンプト、タイトルのようになっているものの指定は CMD の PROMPT パラメータで指定します。

PARM KWD(LIB) TYPE(*NAME) LEN(10) MIN(1) PROMPT(' ライブラリー ')

それぞれの入力用のパラメータは PARM で指定していきます。

OS/400 のコマンドでも入力域の右の方に "名前" など、入力できるタイプが表示されるようになっています。
"名前" と表示されているものは TYPE(*NAME) で指定でき、いわゆる OS/400 でオブジェクトの名前として許されている文字列を指すようになっています。
LEN(10) で 10桁の"名前"という指定になっています。

また、最初の LIB パラメータは入力必須で、入力しない場合は反転表示されるようになっています。
MIN(1) で入力必須であることを指定しています。

PARM KWD(TYPE) TYPE(*CHAR) LEN(5) RSTD(*YES) DFT(*PROD) VALUES(*PROD *TEST) MIN(0) PROMPT(' ライブラリー・タイプ ')

次のパラメータは *PROD と *TEST のどちらかから選択する、というようになっています。
RSTD(*YES) VALUES(*PROD *TEST) で、入力値がある特定の値に制約されること、その値が *PROD と *TEST であること、が指定されています。
DFT(*PROD) で、デフォルトであらかじめ入力されている値が *PROD になっていることが指定されています。

PARM KWD(TEXT) TYPE(*CHAR) LEN(50) DFT(*BLANK) VARY(*YES) INLPMTLEN(17) PROMPT(' テキスト記述 ')

最後のパラメータは長い文字列を入力できるようになっているのですが、あまり長々しい入力域が表示されているとかえって邪魔なので & を入れると伸びるようになっています。
VARY(*YES) INLPMTLEN(17) で最初に 17桁で表示され、& を入れると伸びる、という指定になっています。
伸びる限界は LEN(50) で指定された長さで、コマンド処理プログラムには定義された長さいっぱいが渡されるようになっています。

ちなみに、これを CL で受け取る場合は、そのフィールドを 2桁足した 52桁の *CHAR フィールドと定義します。
最初の 2桁に実際の文字数が入ってきますので、それを %BIN 関数で数字に変換し、その長さを指定した %SST 関数を使用して文字列を取り出すようにします。

DCL VAR(&PARM) TYPE(*CHAR) LEN(514)
DCL VAR(&NSTRING) TYPE(*DEC) LEN(2 0)
DCL VAR(&MSG) TYPE(*CHAR) LEN(512)
CHGVAR VAR(&NSTRING) VALUE(%BIN(&PARM 1 2))
CHGVAR VAR(&MSG) VALUE(%SST(&PARM 3 &NSTRING))

コマンド処理プログラム

今回のコマンドに対応したコマンド処理プログラムのサンプルはこんなかんじになります。(エラー処理はまったくしていませんので、ご理解よろしく)
処理は単なる CRTLIB ですから、パラメータの受け取りのしかたを見てみてください。

「コマンド」というもの自体、プロンプトの出し方などを決めているいわばインターフェイス部分を扱うオブジェクトという位置づけで、コマンドでチェックされたりナビゲートされた値をコマンド処理プログラムに受け渡す、というものになります。
きちんと値を受け取ることができれば、コマンド処理プログラムはどんな言語で書いてもかまいません。通常はやはり CL で書くことが多いと思いますが。

PGM        PARM(&LIB &TYPE &PARM)                    
DCL        VAR(&LIB) TYPE(*CHAR) LEN(10)             
DCL        VAR(&TYPE) TYPE(*CHAR) LEN(5)             
DCL        VAR(&PARM) TYPE(*CHAR) LEN(52)            
DCL        VAR(&NSTRING) TYPE(*DEC) LEN(2 0)         
DCL        VAR(&TEXT) TYPE(*CHAR) LEN(50)            
CHGVAR     VAR(&NSTRING) VALUE(%BIN(&PARM 1 2))      
CHGVAR     VAR(&TEXT) VALUE(%SST(&PARM 3 &NSTRING))  
IF         COND(&TEXT = '*BLANK') THEN(CHGVAR +      
              VAR(&TEXT) VALUE(' '))                  
CRTLIB     LIB(&LIB) TYPE(&TYPE) TEXT(&TEXT)

コマンドを作成する時、CRTCMD の「コマンドを処理するプログラム」のところ(PGM パラメータ)に、上記の CL をコンパイルしたプログラムを指定してください。
CHGCMD でも OK です。

[Top Pageに戻る]

Ads by TOK2