MENU

IBM iつれづれ草|CL関連知識:文字変数を加工したい場合(高橋昌宏)

 

しばらく投稿が停滞しておりまして、申し訳ございません
また、少しずつですが投稿を再開していきたいと思いますので、よろしくお願いいたします。

今回はCL関連の知識をいくつかお伝えしたいと思います。
CLの中で、文字変数を加工したい場合のサンプルです

文字列の分割(サブストリング)の使用方法 

<変数WKの5バイト目から3バイトに”ABC”をセットする>
DCL VAR(&WK) TYPE(*CHAR) LEN(10)
CHGVAR VAR(%SST(&WK 05 3)) VALUE(‘ABC’)

<変数OBJの1バイト目から10バイト分を取り出し、変数FILEにセットする >
CHGVAR &FILE %SST(&OBJ 1 10)
CHGVAR &FILE %SUBSTRING(&OBJ 1 10))

文字列の結合(CAT)の使用方法 

文字列の結合には、次の3つのパターンが存在する。

*TCAT: 先行文字列の後ろスペースが削除され、後続文字列を連結する
*BCAT: 先行文字列の後ろスペースが削除され、スペースを1バイト挿入し、後続文字列を連結する
*CAT:  スペースを考慮せずに、単純結合を行う

変数A “ABCDEF△△”
変数B “XYZ”

<結合処理> <結果>
&A *TCAT &B “ABCDEFXYZ”
&A *BCAT &B “ABCDEF△XYZ”
&A *CAT &B “ABCDEF△△XYZ”

TCATの”T”はTrim(トリム)、BCATの”B”はBlank(ブランク)、と覚えるとよい。

変数の加算 

DCL VAR(&II) TYPE(*DEC) LEN(2) VALUE(0)
CHGVAR VAR(&II) VALUE(&II + 1)

CL内でコマンドを実行する場合、選択プロンプト(F4)を出した状態に

たとえばCPYFコマンドを実行する場合に、一度確認の意味も込めてワンクッション置きたい場合などに活用できる。

0001.00 PGM
0002.00 ? CPYF FROMFILE(FILE01) TOFILE(FILE02) + “?”をコマンドの先頭に付ける
0003.00 MBROPT(*REPLACE)

逆に、入力不可状態になっている部分を入力可能にするには、以下のように実行する。

0001.00 PGM
0002.00 ? CPYF ??FROMFILE(FILE01) ??TOFILE(FILE02) + “??”をパラメータに付ける
0003.00 ??MBROPT(*REPLACE)

 

??  パラメータが表示され、入力も可能。

?*  パラメータは表示されるが、入力可能ではない。ユーザー指定の値はすべて、コマンド処理プログラムに渡される。

?<  パラメータが表示され、入力も可能だが、表示されている値を変更しない場合、コマンド省略時の値がコマンド処理プログラムに渡される。

?/  IBM 使用のために予約されている。

?-  パラメータは表示されない。ユーザー指定の値(または省略時の値)がコマンド処理プログラムに渡される。プロンプト一時変更プログラムでは使用できない。

?  パラメータは、F9=All パラメータが押されるまで表示されない。表示されると、入力可能。パラメータ上に表示された値が変更されない限り、コマンド省略時値が CPP に送られる。

?%  パラメータは、F9=All パラメーターが押されるまで表示されない。いったん表示されると、これは入力不可となる。コマンド省略時値は CPP に送られる。

CL内でのサブルーチン

CL内でもサブルーチンが使用できる。CALLSUBRで内部サブルーチンを呼び出せる。

RTNVALは数値の4桁と決まっている。サブルーチン側の処理結果に従って、値を決める形になる。

サブルーチンはSUBRから開始して、ENDSUBRまでとなる。

PGM
DCL VAR(&RTNVAR) TYPE(*INT) LEN(4)
CALLSUBR SUBR(SUBR1) RTNVAL(&RTNVAR)

SUBR SUBR(SUBR1)
/* 何かしらの処理*/
RTNSUBR RTNVAL(-1)
ENDSUBR

ENDPGM

SELECT処理 

SELECTコマンドが出る前まではIF文で対応していたが、SELECTは便利に使える。

PGM
DCL VAR(&WK1) TYPE(*CHAR) LEN(1)
DCL VAR(&WK2) TYPE(*CHAR) LEN(1)

SELECT

WHEN COND(&WK1 *EQ ‘1’) THEN(CHGVAR VAR(&WK2) VALUE(‘A’))
WHEN COND(&WK1 *EQ ‘2’) THEN(CHGVAR VAR(&WK2) VALUE(‘B’))
WHEN COND(&WK1 *EQ ‘3’) THEN(CHGVAR VAR(&WK2) VALUE(‘C’))
OTHERWISE CHGVAR VAR(&WK2) VALUE(‘X’)

ENDSELECT
ENDPGM

 

今回は以上です。お役に立てれば幸いです。

 


IBM iつれづれ草

第1回 フリーフォームRPG!!

第2回 SQLをお勧めする4つの理由

第3回 SQLの索引アドバイザー

第4回 IBM iの小ネタシリーズ 第1回~画面(DSS)周りのカーソル制御

第5回 IBM iの小ネタシリーズ 第2回~知っていると便利な4つの小ワザ