プログラム学習室 http://studyhallweb.com/

AS/400 RPG に関するメモ

RPGとは

常識ある人の答えは、Role Playing Game ですが、残念ながらここでの答えは IBM AS400の Report Program Generator です。

比較演算子

GT : 演算項目1は演算項目2より大きい。
LT : 演算項目1は演算項目2より小さい。
EQ : 演算項目1は演算項目2と等しい。
NE : 演算項目1は演算項目2と等しくない。
GE : 演算項目1は演算項目2より大きいか等しい。
LE : 演算項目1は演算項目2より小さいか等しい。

標識

結果の標識は71-76桁目
以下に例を示す
コマンド 処理 71-72桁 73-74桁 75-76桁
CHAIN ファイルからのランダム検索 レコード無し エラー -
READ レコード読み取り - エラー EOF
READE 等しいキーのレコード読み取り - エラー EOF
READP 前のレコード読み取り - エラー BOF
BOF‥ファイルのはじめ

日付型の定義

DATFMTで表示形式を指定できる
     D @DATE           S               D   DATFMT(*ISO)
				

コマンドラインパラメータの指定

PLIST/PARMの組合せで指定する
PLISTの項目1は*ENTRYとする
数値の時は小数点以下の桁数に0を入れること
     C     *ENTRY        PLIST
     C                   PARM                    P@MOJI            6             文字
     C                   PARM                    P@KAZU            9 0           数値
 				

算術演算子の使用例

変数の配置に注意
     C     A             SUB       B             X
     C*           これは X = A - B を意味する				

DEFINE (変数定義)

     C     *LIKE         DEFINE    A             B
     C*           これは B を A の型で定義する
     		

DSPLY

変数の値をQshellに表示(動作確認時などに使える)
     C     X             DSPLY
     C*           X の値を Qshell に表示する
 			

COMP (比較)

     C     HENSUU        COMP      10                                 313233
     C*           HENSUUが10よりも大きければ31がオン(71-72桁)
     C*                   10より小さければ32がオン(73-74桁)
     C*                   等しければ33がオン(75-76桁)
 				

CAS (if / else と同様の処理を行う)

     C     A             CASNE     0             SUB1
     C                   CAS                     SUB2
     C                   ENDCS
     C*    Aが0でなければSUB1を実行し、0であればSUB2を実行する
				

DOループ

ネスト出来ないので非常に見にくいが、以下のサンプルはDO~ENDDOの間を4回繰り返す。ただし、FLAG(変数名)が10より大きくなったらループを抜け出す。
     C     1             DO        4             I
     C*    (ここに処理を書く、通常このDOループは4回繰り返される)
     C     FLAG          IFGE      10
     C                   SETON                                        30
     C                   END
     C  N30              ENDDO
     C*    FLAG が 10以上であれば 標識30 がオンになり、ENDDOが処理されず、
     C*    次の行に処理が移る(DOループを抜ける)
 				

LOOKUP

配列の中を検索する
     C                   Z-ADD     1             I                 3 0
     C     SRCHWD        LOOKUP    ARY(I)                                 26
     C*    SRCHWDがARY配列に含まれる場合、
     C*    IにはSRCHWDと一致するARY配列の要素番号が入る
     C*    また、そのとき標識26がONになり%EQUAL=1となる
 				

ソースコード内に配列のデータを書き込む方法

CTDATAとして定義し、ソースの文末に配列の値を直接書き込む
このとき、1桁目から書き込むこと
配列の添え字は1から始まる
     D  #CMD           S             40    DIM(4) CTDATA PERRCD(1)
     D  #MAIL          S             40    DIM(2) CTDATA PERRCD(1)
     D  I              S              1  0
     D*
     C                   EVAL         I = 1
     C     #MAIL(1)      DSPLY
     C                   DOW          I < 5
     C     #CMD(I)       DSPLY
     C                   EVAL         I = I + 1
     C                   ENDDO
     C     #MAIL(2)      DSPLY
     C** 終了処理
     C                   SETON                                        LR
     C                   RETURN
** #CMD
FIRST COMMAND
 日本語
123456
END
** #MAIL
ADDRESS 1
ADDRESS 2				

/FREE ~ /END-FREE

列番号にとらわれずにソースを書く
     C     *ENTRY        PLIST
     C                   PARM                    @P01             10
     C                   PARM                    @P02              8
     C                   PARM                    @RTN              2
     C*
     C/EXEC SQL
     C+    INSERT INTO TEST01P VALUES (:@P1, :@P2)
     C/END-EXEC
     C*
      /FREE
           // SQLのエラーコードを調べる
           IF SQLCOD = 0 AND SQLWN0 = '';
               @RTN = 'OK';    // エラーなし
           ELSE;
               @RTN = 'NG';    // エラーまたは警告あり
           ENDIF;
      /END-FREE
     C                   SETON                                        LR
     C                   RETURN
     		

コマンドラインから数値のパラメータの渡し方

数値のパラメータをコマンドラインから直接指定する際は、X'xxxxF'とする。
xxxは数字、桁数を合わせること
Xはゾーンを意味する、Fは符号(+)

例 パラメータに9桁数字の21を指定
 CALL PGM(TEST) PARM(X'000000021F')