数字フィールドから文字フィールドへ
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~ はフリー・フォーマットの途中に固定フォーマットを挿入することもできる。)