読者です 読者をやめる 読者になる 読者になる

タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【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*