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

AS400, Java, JavaEE, JSF等の開発、習慣など。日々の気づきをまとめたブログ(備忘録)

【AS400】物理ファイル(PF)のDFT(デフォルト)キーワード

今更ではありますが、AS400の物理ファイルのフィールドの定義で設定できる「デフォルト値」について検証してみました。

まずはテスト用として、下記のようなテーブルを準備。

SECTIONS.pf

A                                      UNIQUE                
A          R RECSEC                    TEXT(' 部門マスタ ')  
A* (FIELDS)                                                  
A            ACTIVE_FLG     1A         COLHDG(' 有効フラグ ')
A                                      DFT('1')              
A            SEC_CD         2A         COLHDG(' 部門 CD')    
A            SEC_NAME      20O         COLHDG(' 部門名 ')    
A            CREATE_TS       Z         COLHDG(' 作成日時 ')  
A* (KEY)                                                     
A          K SEC_CD                                          

「ACTIVE_FLG」という項目に、DFTキーワード(フィールドに省略時の値を提供する)を追加し、その初期値が '1' になるように設定しています。

次に、RPGSQLそれぞれで、追加する命令を使って動きを試してみます。

SAMPLE43.rpgle

F*******************************************************
F* FILE 定義
F*******************************************************
F* 部門マスタ
FSECTIONS  UF A E           K DISK
F*
D*******************************************************
D* PROTOTYPE/INTERFACE
D*******************************************************
D MAIN            PR                  EXTPGM('SAMPLE43')
D MAIN            PI
D*
C*******************************************************
C* MAIN
C*******************************************************
C                   EXSR      #MAIN
C                   EXSR      #FINAL
 /FREE
  //****************************************************
  //*  MAIN
  //***************************************************
  BEGSR #MAIN;
     SEC_CD = '03';
     SEC_NAME = '企画部';
     WRITE RECSEC;

     CLEAR RECSEC;
     SEC_CD = '04';
     SEC_NAME = '品質部';
     CREATE_TS = %TIMESTAMP();
     WRITE RECSEC;
  ENDSR;
  //***************************************************
  //* FINALIZE
  //***************************************************
  BEGSR #FINAL;
      *INLR = *ON;
      RETURN;
  ENDSR;
 /END-FREE

CALL TIGEROBJ/SAMPLE43

SQL

INSERT INTO TIGERDB.SECTIONS( 
    SEC_CD,                   
    SEC_NAME                  
)                             
VALUES(                       
    '10',                     
    ' 検査部 '                
);                             

書き込み結果

下記の通りの結果になりました。

ACTIVE_FLG SEC_CD SEC_NAME CREATE_TS 書き込み方法
03 企画部 0001-01-01-00.00.00.000000 RPGLEで書き込み
04 品質部 2023-04-12-17.50.25.502615 RPGLEで書き込み(CLEAR命令後)
1 10 検査部 2023-04-12-17.52.54.905833 SQLで書き込み

RPGLEからのWRITE命令では、DFTオプションが機能しませんでした。

SQLでは、対象フィールドを省略したことで、DFTの値が自動的にセットされています。 ついにで、省略したTimeStampの項目には、実行時のシステム日時がセット。

RPGLEでWRITE文で行う場合、DFTキーワードが機能しないことがわかりました。 RPGLEで実装する場合、SQLでやることでDFTの恩恵を受けることができそうです。

以上今回は、簡単な検証結果のシェアでした。