RPG/400覚書

もうこの言語は何年もやっていないのですが…。
今もAS/400の少ない情報に苦しめられている人たちのために、私の当時の覚書を記載していきます。

# ディスプレイファイル（DSPF）

## DSPATR(DiSPlay ATtRibute)

様式を指定する

* 書式
    * DSPATR(様式)
* 様式
    * BL(BLink)　明滅
    * CS(Column Separator)　桁区切り線を表示
    * HI(High Intensity)　高輝度で表示
    * ND(None Display)　表示しない
    * PC(Position Cursole)　カーソルを位置づける
    * PR(PRotect)　入力から保護する
    * RI(Reverse Image)　反転表示
    * UL(Under Line)　下線を表示

※RI+HI+ULの組み合わせは禁止。NDになってしまう。

## EDTCDE(EDiT CoDE)

数値の表示方法を指定する(データ型Sを指定するとエラーになる）

| カンマ表示・印字 | 値がゼロの時の表示・印字 | 符号無し | CR | 後－ | 前－ |
| --- | --- | --- | --- | --- | --- |
| する | する | 1 | A | J | N |
| する | しない | 2 | B | K | O |
| しない | する | 3 | C | L | P |
| しない | しない | 4 | D | M | Q |

※CR(Credit) 2Byte占有する

```
A                                  1 63DATE  EDTCDE(Y)
A                                  1 63DATE  EDTCDE(W)
A            D#NUM          2  0B  8  3EDTCDE(Z)
```

## EDTWRD(EDiT WoRD)

数値の表示方法を指定する(データ型Sを指定するとエラーになる）

```
A            D@DATE         8  0O 10 10EDTWRD('    /  /  ')
A            D@TIEM         6  0O  9 10EDTWRD('  :  :  ')
A            D@TIEM         6  0O  9 10EDTWRD('0 :  :  ')
```

## EDTMSK(EDiT MaSK)

編集マスク(&)で指定した桁を保護する

```
A            TELNUM         9  0B  8 12EDTWRD('0( )   -    ')
A                                      EDTMSK(' & &   &    ')
```

上記の例では(, ), -が入力不可領域となる

## COLOR(color)

色を指定する

```
A                                      COLOR(GRN)
A                                      COLOR(RED)
A                                      COLOR(WHT)
A                                      COLOR(TRQ)
A                                      COLOR(YLW)
A                                      COLOR(PNK)
A                                      COLOR(BLU)
```

## CA(Command Attention)

指定した機能キーを使う。
入力は保存されない。標識省略可。説明文は標識を指定すれば書ける。

* 書式
    * CAキー(標識'説明文')

```
A                                      CA03(03 ' 終了 ')
```

## CF(Command Function)

指定した機能キーを使う。
入力は保存される。標識省略可。説明文は標識を指定すれば書ける。

* 書式
    * CFキー(標識'説明文')

```
A                                      CF06(06 ' 更新 ')
```

# サブファイル（SUBFILE）

## RRN(Relative Record Number：相対レコード番号)

このフィールドの値を操作することで、サブファイルの任意のレコードにアクセスできる。

```
FDSPFILE CF  E                    WORKSTN	
F                                        W#RRN1KSFILE SFL01	

C                     ADD  1         W#RRN1
C                     WRITESFL01
```

## SFLRCDNBR(サブファイルレコードナンバー）

このフィールドにRRNの値を入れると、その番号のレコードを先頭にページを表示する
(複数ページにわたるエラーの場合、一番先頭のエラーレコードのRRNをこのフィールドに入れることで先頭のエラーレコードを表示する）

```
A            H#RRN1         4S 0H      SFLRCDNBR
```

## INFORMATION DS

サブファイルの読み込みの後で、TOPRRNが0ならば、Z-ADD 1 を、TOPRRNが0でなければTOPRRNをSFLRCDNBRの定義フィールドに転送する。

```
FDSPFILE CF  E                    WORKSTN
F                                        W#RRN1KSFILE SFL01
F                                              KINFDS INFDS1

IINFDS1      DS
I                                    B 378 3790TOPRRN
```

## 隠しフィールド

画面には表示しないが、プログラム内部で使われるフィールドに設定(Hidden)

```
A            H#RRN1         4S 0H      SFLRCDNBR
```

## CSRLOC(CurSoR LOCation)

画面に設定した、このフィールドに数値をセットしてEXFMTするとその位置にカーソルが移動する。

```
A                                      CSRLOC(H#ROW H#CLM)
A            H#ROW          3S 0H      TEXT(' カーソル行位置 ')
A            H#CLM          3S 0H      TEXT(' カーソル桁位置 ')
```

実行キー押下時のカーソル位置が入る。

```
IINFDS1      DS                                     
I                                    B 370 3710S#CSR

C           S#CSR     DIV  256       H#ROW
C                     MVR            H#CLM
```

上記のようなロジックで行と列位置を取りだしセットしてやる。

※カーソルに固定値を入れた後はゼロクリアしてやらないとポジションカーソル（DSPATR(PC)）が効かなくなる

## RTNCSRLOC(ReTurN CurSoR LOCation)

```
A                                      RTNCSRLOC(&H#RCD &H#FLD &H#CSRP)
A*                                                               
A            H#RCD         10A  H      
A            H#FLD         10A  H
A            H#CSRP         4S 0H
```

## SFL

レコードの定義を始める

```
A          R SFL01                     TEXT(' サブファイル ') 
A                                      SFL                   
```

## SFLCTL

制御レコードの定義を始める(SFLよりも後に書かなければならない)

```
A          R CTL01                     TEXT(' サブファイル制御 ') 
A                                      SFLCTL(SFL01)
```

## SFLSIZ(n)

サブファイルに格納するレコード数ｎを設定する
※最大値は9999件。それ以上書き込むと落ちる。

```
A                                      SFLSIZ(9999) SFLPAG(13)
```

## SFLPAG(n)

１画面に表示するレコード数ｎを設定する

```
A                                      SFLSIZ(9999) SFLPAG(13)
```

## SFLDSP

レコードのリストを表示する

```
A  30                                  SFLDSP   
```

## SFLDSPCTL

制御レコードを表示する

```
A  31                                  SFLDSPCTL
```

## SFLCLR

サブファイルのデータを消去する

```
A  32                                  SFLCLR
```

## SFLEND(*MORE)

継続・終了のガイダンスを表示する
*PLUS(デフォルト） だと「＋」、*MOREだと「続く…」「終り」と表示される

```
A  33                                  SFLEND(*MORE)
```

# ポップアップウィンドウ

## ウィンドウの定義

```
A          R DFWIN                     WINDOW(5 4 18 70)       
A                                      WDWBORDER((*COLOR BLU) +
A                                      (*DSPATR HI RI) +       
A                                      (*CHAR '        '))     
```

### WINDOW

* 書式
    * WINDOW(左上端の開始行 左上端の開始桁 ウィンドウの行数 ウィンドウの桁数)  
※パラメータに変数を設定する場合は&変数名とする

WINDOWキーワードを指定している場合は、事前にウィンドウ・レコードを出力しておく必要がある。

定義を利用するレコード様式には次のように記述する

```
A          R HEAD                      WINDOW(DFWIN)              

A          R CTL01                     SFLCTL(SFL01)
A                                      WINDOW(DFWIN)
```

### WDWBORDER(WinDoWBORDER)

* 書式
    * WDWBORDER((*COLOR 色) (*DSPATR 表示属性) (*CHAR '枠文字'))
※最低一つのパラメータが指定されなければならない

枠文字には8Byteの値を設定し、左から順に、

* top-left-corner
* top-border
* top-right-corner
* left-border
* right-border
* bottom-left-corner
* bottom-border
* bottom-right-corner

と割り当てられる

```
WDWBORDER((*CHAR '+-+||+-+'))

+--------------+						
|              |
|              |
|              |
|              |
+--------------+						
```

別のレコード様式のパラメータとすることで、ウィンドウ定義を切り離せる

```
A          R FMT01                     WINDOW(DFWIN)
```

## ダミー・レコード・フォーマット

ウィンドウをそのまま呼び出して、表示すると背景のウィンドウが消去されてしまう。
これを防ぐために、ASSUMEキーワードを指定し、行1、列2にブランクを入れたダミー・レコード・フォーマットを作成する。
呼び出しもとのRPG内ではこのフォーマットは書き込まない。

```
A          R DUMMY                     ASSUME    
A*                                               
A                                  1  2' '       
A                                      DSPATR(ND)
```

---
今見るともうほとんど思い出せないので質問はお手柔らかに…。