【AS400】RPGLE-有効文字列の長さを調べる方法
自分が知らなかったことで、はまってしまったので、アップしておきます。
入力されている文字列の長さを調べる方法は、BIF関数「%LEN」で簡単に取得できるものだと思っていました。
しかし、DB2 for iでは、DDSで定義したテーブルの文字列は、CHARになるので、毎回、%LENで取得できる値は、そのフィールド長になってしまうことを最近知りました。
TRIMをかましてからLENで取得しても、値は変わりません。
そこで、「%CHECKR」という関数があるではないですか!!
右端の文字から左に向って、指定した文字列でない最後の文字の位置を返してくれるようです。
サンプルと実行結果は、下記の通りです。
サンプル
D****************************************************************
D* VARIABLE DEFINITION
D****************************************************************
D W@CHAR1 S 20A INZ('ABCDE XYZ')
D W@CHAR2 S 40A
D*
C****************************************************************
C* MAIN
C****************************************************************
/FREE
// %SIZE, %LEN では空白行があってもフィールド長の取得となる
DSPLY %SIZE(W@CHAR1);
DSPLY %LEN(W@CHAR1);
// %CHECKKR では最終空白行までの文字列の長さを取得できる
DSPLY %CHAR(%CHECKR(' ':W@CHAR1));
W@CHAR2 = '*' + %CHAR(%CHECKR(' ':W@CHAR1)) + '*';
DSPLY W@CHAR2;
*INLR = *ON;
RETURN;
/END-FREE
実行結果
CALL PGM(TIGEROBJ/SAMPLE30) DSPLY 20 DSPLY 20 DSPLY 9 DSPLY *9*