RPG

506. 数字から文字へのMOVE は?

数字フィールドから文字フィールドへ
MOVE でフィールドの値をコピーする場合
_

0006.00 D NO#             S              2S 0 INZ(2)
0007.00 D FLD2            S              2A         

として 2桁の数字フィールド: NO# には 2という値が
入っていたときにこれを

           MOVE NO#      FLD2

と演算すると文字フィールド: FLD2 には ’02’ という値が入る。
これと同じ演算をフリー・フォーマットで再現するには
どのようにすればよいだろうか?

0001.00 H DFTNAME(TESTCHR) DATEDIT(*YMD/) BNDDIR('QC2LE')                       
0002.00 F********** %CHAR のテスト ******************************************** 
0003.00 F*                                                                      
0004.00 F********************************************************************** 
0005.00                                                                         
0006.00 D NO#             S              2S 0 INZ(2)                            
0007.00 D FLD2            S              2A                                     
0008.00                                                                         
0009.00   /FREE                                                                 
0010.00     IF NO# >= 10;                                                       
0011.00       FLD2 = %CHAR(NO#);                                                
0012.00     ELSE;                                                               
0013.00       FLD2 = '0' + %CHAR(NO#);                                          
0014.00     ENDIF;                                                              
0015.00   /END-FREE                                                             
0016.00   /FREE                                                                 
0017.00     EVAL FLD2 = NO#;                                                    
0018.00   /END-FREE                                                             
0019.00 C                   MOVE      NO#           FLD2                        
0020.00 C                   SETON                                        LR     
0021.00 C                   RETURN                                              

[解説]

まず

     FLD2 = %CHAR(NO#);

とすると簡単に数から文字へ変換することができるが
この演算では FLD2 には ‘2 ‘ とい値が入ってしまい
’02’ とすることはできない。先行ゼロは削除されてしまう。
それならば

    FLD2 = %CHAR(NO#: 2 );

というように %CHAR の後続に示すことは許されない。
また MOVE の代わりに

0016.00   /FREE                                                                 
0017.00     EVAL FLD2 = NO#;                                                    
0018.00   /END-FREE

とするとコンパイル・エラーになって許されない。
結局

0009.00   /FREE                                                                 
0010.00     IF NO# >= 10;                                                       
0011.00       FLD2 = %CHAR(NO#);                                                
0012.00     ELSE;                                                               
0013.00       FLD2 = '0' + %CHAR(NO#);                                          
0014.00     ENDIF;                                                              
0015.00   /END-FREE 

という非常に不細工な方法になってしまう。
このように条件分岐が必要な演算はできるだけ書かないほうがよい。
条件分岐など多ければそれだけデータによるバグが発生する可能性が
高くなるからである。
_

フリー・フォーマットで先行ゼロを伴うように変換するよい方法が
あれば読者に教えてもらいたい。

フリー・フォーマットの途中でいきなり

           MOVE NO#      FLD2

というのもアリでしょうが。
( Ver7.1~ はフリー・フォーマットの途中に固定フォーマットを挿入することもできる。)