CLP で数字をメッセージ出力するには、一旦、文字フィールドに変換してから
その文字フィールドを出力するようにしなければならない。
SNDPGMMSG コマンドでは 数字フィールドを直接、出力することはできないからだ。
しかし、かと言って CLP には数字フィールドの値を簡単に文字フィールドに
編集できる関数は用意されていない。
CHGVAR コマンドで数字を文字に変換しただけでは先行ゼロが残ってしまい、
00003 個のオブジェクトが見つかった。
のように、見づらいメッセージになってしまう。
そこでここでは簡単にゼロ・サプレス、つまり先行ゼロを CLP 内で消去する方法を
紹介しよう。
【 サンプル・ソース:TESTBIN 】
0001.00 PGM 0002.00 /*---------------------------------------------------------*/ 0003.00 /* TESTBIN : 先行ゼロ消去 */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&POS_BIN) TYPE(*CHAR) LEN(4) 0006.00 DCL VAR(&POS) TYPE(*DEC) LEN(5 0) VALUE(3) 0007.00 DCL VAR(&CHAR5) TYPE(*CHAR) LEN(5) 0008.00 0009.00 CHGVAR VAR(%BIN(&POS_BIN)) VALUE(&POS) 0010.00 CHGVAR VAR(&CHAR5) VALUE(%BIN(&POS_BIN)) 0011.00 /*---------------------------------------------*/ 0012.00 /* &CHAR5 には '00003' が入っている */ 0013.00 /*---------------------------------------------*/ 0014.00 ZERO_SUP: IF COND(%SST(&CHAR5 1 1) *EQ '0') THEN(DO) 0015.00 CHGVAR VAR(&CHAR5) VALUE(%SST(&CHAR5 2 4)) 0016.00 GOTO ZERO_SUP 0017.00 ENDDO 0018.00 SNDPGMMSG MSG(&CHAR5 *TCAT + 0019.00 ' 個のオブジェクトが見つかりました。 ') + 0020.00 MSGTYPE(*DIAG) 0021.00 RETURN 0022.00 0023.00 ENDPGM
【解説】
0014.00 ZERO_SUP: IF COND(%SST(&CHAR5 1 1) *EQ '0') THEN(DO) 0015.00 CHGVAR VAR(&CHAR5) VALUE(%SST(&CHAR5 2 4)) 0016.00 GOTO ZERO_SUP 0017.00 ENDDO
の部分が先行ゼロを消去している部分である。
この演算の結果、始めは ‘00005’ であった &CHAR5 の値は ‘5 ‘ と書き換えられる。
従って後続の文字列を結合するのであれば *CAT ではなく、 *TCAT を使って次のように
結合する。
0018.00 SNDPGMMSG MSG(&CHAR5 *TCAT + 0019.00 ' 個のオブジェクトが見つかりました。 ') + 0020.00 MSGTYPE(*DIAG)