CL

85. CLP で先行ゼロを消去するには

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)
【実行結果】

CLプログラム作成(CRTCLPGM)