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

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

【AS400】RPGLE-データ域

(1)データ域とは?

  • プログラム間、JOB間の制御情報として使用されるディスク上の記憶域。1つのオブジェクト。データ・エリア(DataArea)とも呼ぶ。
  • データ域は、次の2種類あります。
ユーザー定義のデータ域
ユーザーが作成するデータ域で、任意のライブラリーに作成でき、複数のジョブで利用可能。
ローカル・データ域(*LDA)
ジョブの開始時にシステムが自動的に作成し、ジョブの終了時にシステムが自動的に削除するデータ域。同一ジョブ内のプログラム間の受け渡しに使用できる。(サインオンユーザーのみが利用可能。)

(2)データ域管理コマンド

① ユーザー定義のデータ域

作成
CRTDTAARA DTAARA(TIGEROBJ/TSDT) TYPE(*CHAR)
          LEN(26) TEXT(‘ テスト用 DTAARA’)
表示
DSPDTAARA DTAARA(TSDT) 
変更
CHGDTAARA DTAARA(TSDT (11 5)) VALUE(’12345′) 
※11桁目より、5桁分の値を変更せよ。
削除
DLTDTAARA DTAARA(TSDT) 
登録済みデータ域の確認方法
STRPDMコマンド → 2. オブジェクトの処理
※タイプ=*DTAARA で検索(データ域はオブジェクト)

② ローカル・データ域

表示
DSPDTAARA DTAARA(*LDA)

(3)データ域とローカル・データ域の比較

V5R04での調査結果
項目データ域ローカルデータ域
作成 ユーザー 自動的
削除 ユーザー 自動的
ライブラリー 任意 なし
タイプ *CHAR(文字) 2000桁
*DEC(数字) 24桁
*LGL(論理値)‘0’or‘1’
文字 1024桁
他のJOBからの使用 可能 不可能
名前 任意 *LDA

(4)RPGによるデータ域の処理

① データ域をデータ構造にて定義(UDS)

  • 外部データ域の定義の場合、データ構造名は、データ域名と同一とすること。

② データ域とデータ構造の関連付け(DEFINE)

C* B を A の型で定義する
C     *LIKE         DEFINE    A             B
C     *DTAARA       DEFINE                  TSDT

③ データ域の演算命令による操作

IN命令
データ域の読み込み(項目1=*LOCKでロック、項目1 =ブランクでアン・ロック)
OUT命令
データ域の書き出し
UNLOCK命令
データ域のロックを任意に解除(※プログラム終了時でロックは解除される)

(5)サンプルプログラム

データ域とローカルデータ域の2つに下記の情報を格納するサンプル。
 ①JOB名 ②ユーザーID ③JOB番号 ④SYSTEM日付 ⑤SYSTEM時間

H DATEDIT(*YMD/)
H*                                                                                        
D****************************************************************
D* 変数定義         
D****************************************************************
D* PGMデータ定義
D I@SDSD         SDS
D  I@PGID                 1     10                                         // PGM-ID
D  I@MGID                40     42                                         // MSG-ID
D  I@MGNO                43     46                                         // MSG-NO
D  I@JBNM               244    253                                         // JOB-NAME
D  I@URID               254    263                                         // USER-ID
D  I@JBNO               264   0269  0                                      // JOB-NO
D*
D* データ構造定義(データ域格納用)
D TSDT           UDS
D  W1NJOB                 1     10                                         // ジョブ名
D  W1NUSE                11     20                                         // ユーザー ID
D  W1BJOB                21     26  0                                      // ジョブ番号
D  W1DATE                27     34  0                                      // 日付
D  W1TIME                35     40  0                                      // 時間
D*
D LDA            UDS
D  W2NJOB                 1     10                                         // ジョブ名
D  W2NUSE                11     20                                         // ユーザー ID
D  W2BJOB                21     26  0                                      // ジョブ番号
D  W2DATE                27     34  0                                      // 日付
D  W2TIME                35     40  0                                      // 時間
D*
D* ワーク変数
D*                     
C****************************************************************
C* DEFINE FILED
C**************************************************************** 
C* データ域とデータ構造の関連付け
C     *DTAARA       DEFINE                  TSDT
C     *DTAARA       DEFINE    *LDA          LDA
C*
C****************************************************************
C* MAIN-ROUTINE
C****************************************************************
C*  
C* データ域更新
C                   IN        TSDT
C                   EVAL      W1NJOB = I@JBNM
C                   EVAL      W1NUSE = I@URID
C                   EVAL      W1BJOB = I@JBNO
C                   EVAL      W1DATE = %DEC(%DATE())
C                   EVAL      W1TIME = %DEC(%TIME())
C                   OUT       TSDT
C*
C* ローカルデータ域更新
C                   IN        LDA
C                   EVAL      W2NJOB = I@JBNM
C                   EVAL      W2NUSE = I@URID
C                   EVAL      W2BJOB = I@JBNO
C                   EVAL      W2DATE = %DEC(%DATE())
C                   EVAL      W2TIME = %DEC(%TIME())
C                   OUT       LDA
C*
C* 終了処理
C                   MOVEL     *ON           *INLR
C                   RETURN