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

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

【AS400】RPGLE-データ構造

(1)データ構造とは?

  • データ構造とは、記憶域をサブフィールドに分割して使用する手法。データ・ストラクチャー(Data Structure)とも呼びます。

記憶域の割り当て

① 変数の割り当て
 ・名前の異なる変数は、記憶域内の異なる場所に割り当てられる。
② データ構造
 ・記憶域内の同じ位置にある変数を異なる名前で使用できる。
   データ構造内の個々のフィールドをサブフィールドと呼ぶ。

データ構造の使用目的

① 変数を分割する。
② 連続していないデータを1つの変数として合成する。
③ 同一構造のデータを複数回設定する。(2次元のデータ構造)

f:id:no14141:20131017151056j:plain

(2)データ構造の定義

RPGLEでは、定義仕様書にてデータ構造を定義する。

D* データ構造
D                 DS
D  W@YYMD                 1      8  0
D  W@YYYY                 1      4  0
D  W@MMMM                 5      6  0
D  W@DDDD                 7      8  0
D  W@MMDD                 5      8  0
D*
D* データ構造(二次元)
D  SHAIN          DS                  OCCURS(5)
D   ID                    1      4 
D   NAMAE                 5     24
D*

(3)データ構造に関する演算命令

初期化命令

・CLEAR データ構造名

データ構造のセグメント値(何番目かの値)の指定方法

・OCUR命令を使用。
・結果の標識(56-57)・・・セグメント値が繰り返し回数の範囲にない場合、ONがセットされる。

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

RPGLESRC/SAMPLE01

     H DATEDIT(*YMD/)
     H*
     D****************************************************************
     D*変数定義
     D****************************************************************
     D*データ構造
     D                 DS
     D  W@YYMD                 1      8  0
     D  W@YYYY                 1      4  0
     D  W@MMMM                 5      6  0
     D  W@DDDD                 7      8  0
     D  W@MMDD                 5      8  0
     D*
     D*ワーク変数
     D  I@YYMD         S              8
     D  W@NKBN         S              6
     D*
     C****************************************************************
     C*MAIN-ROUTINE
     C****************************************************************
      /FREE
          //日付入力の受付
              DSPLY '日付を入力してください(YYYYMMDD) :' '*EXT' I@YYMD ;
          //入力文字日付を数値化
              W@YYMD = %DEC(I@YYMD:8:0) ;
      /END-FREE
     C*
     C*日付区分判定
     C                   MOVEL     *BLANK        W@NKBN
B001 C                   SELECT
X001 C     W@DDDD        WHENGE    01
&001 C     W@DDDD        ANDLE     10
     C                   MOVEL     ' 上旬 '      W@NKBN
X001 C     W@DDDD        WHENGE    11
&001 C     W@DDDD        ANDLE     20
     C                   MOVEL     ' 中旬 '      W@NKBN
X001 C     W@DDDD        WHENGE    21
&001 C     W@DDDD        ANDLE     31
     C                   MOVEL     ' 下旬 '      W@NKBN
X001 C                   OTHER
E001 C                   ENDSL
     C*
     C*出力処理
      /FREE
           DSPLY ( %CHAR(W@YYYY) + '年' + %CHAR(W@MMMM) + '月'
                                          + W@NKBN + 'です。' ) ;
      /END-FREE
     C*
     C*終了処理
     C                   MOVEL     *ON           *INLR
     C                   RETURN

実行結果

> CALL SAMPLE01
  DSPLY   日付を入力してください (YYYYMMDD) :  
? 20110114
  DSPLY  2011 年 1 月  中旬  です。

※例外処理を考慮していないので、8桁の数値以外の文字列が
  入力されるとアプリケーショエラーになる。
> CALL SAMPLE01
  DSPLY   日付を入力してください (YYYYMMDD) :
? AAAA
数値の文字表現にエラーがあります。
  (C G D F) 数値の文字表現にエラーがあります。
? C
   アプリケーション・エラー。 RNX0105 は, SAMPLE01 によってステートメント
    0000000026 命令 X'0000' で監視されていません。 

RPGLESRC/SAMPLE02

D* データ構造(二次元)
D  SHAIN          DS                  OCCURS(5)
D   ID                    1      4
D   NAMAE                 5     24
C****************************************************************
C* MAIN-ROUTINE
C****************************************************************
C* データ構造へ値を格納  
C     1             OCCUR     SHAIN
C                   MOVEL     'A001'        ID
C                   MOVEL     '山田'        NAMAE
C*
C     2             OCCUR     SHAIN  
C                   MOVEL     'A002'        ID 
C                   MOVEL     '佐藤'        NAMAE  
C                   CLEAR                   SHAIN
C*
C     4             OCCUR     SHAIN
C                   MOVEL     'A004'        ID 
C                   MOVEL     ' 鈴木 '      NAMAE
C* データ構造を表示
C     1             DO        5             X                 2 0
C     X             OCCUR     SHAIN
 /FREE     
                    DSPLY ( ID  + ':' + NAMAE ) ;
 /END-FREE
C                   ENDDO 
C* 
C                   MOVEL     *ON           *INLR
C                   RETURN

実行結果

> CALL SAMPLE02          
  DSPLY  A001: 山田      
  DSPLY      :           
  DSPLY      :           
  DSPLY  A004: 鈴木      
  DSPLY      :