(1)データ構造とは?
- データ構造とは、記憶域をサブフィールドに分割して使用する手法。データ・ストラクチャー(Data Structure)とも呼びます。
記憶域の割り当て
① 変数の割り当て ・名前の異なる変数は、記憶域内の異なる場所に割り当てられる。 ② データ構造 ・記憶域内の同じ位置にある変数を異なる名前で使用できる。 データ構造内の個々のフィールドをサブフィールドと呼ぶ。
データ構造の使用目的
① 変数を分割する。 ② 連続していないデータを1つの変数として合成する。 ③ 同一構造のデータを複数回設定する。(2次元のデータ構造)
(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 :