次にサブファイル・レコード形式の複数行によるレコード出力のサンプルを紹介しよう。
RPG# では この複数行の表示を「レポート表示」と呼んでいる。
Google や Yahoo ! の検索結果に見られるように複数レコードの表示や入力は
最もポピュラーであり、頻繁に使用されるものである。
しかし驚くことに System i の Web化製品では複数レコードの入力が全くできないとか
複数レコードの表示が JavaScript 等を使って大変な労力を必要とするものもある。
読者が今、Web化製品を検討中であれば「複数レコードの表示や更新ができますか?」
と聞いてみて欲しい。
それはさておいて RPG# での複数レコードの表示もとても簡単であり、
これまでの ILE-RPG や RPG III のサブファイル・レコードの出力と何ら変わるところはない。
最初に HTMLソースを紹介しよう。
----------------------------------------------------------------------------------- <HTML> <HEAD></HEAD> <BODY> <REPORT NAME=SFREC01> これは <span name=GYO.0000 alt="4S0" EDTCDE(Z)>####</span> 行目のレコードです。<br> </REPORT> </BODY> </HTML> -----------------------------------------------------------------------------------
この HTML を IFS に /AS400-NET.USR/PROJECT/WEB002/SFCTL01.HTM
として保管しておく。
つまりこの HTML の名前は SFCTL01.HTM
である。
前に説明したように変数は span タグを使って
<span name=GYO.0000 alt="4S0" EDTCDE(Z)>####</span>
のように定義するのであるが、ここで明細行の変数は name=GYO.0000
として
SFL レコードのRRN を代入するために .0000 という 文字列を追加して定義しておく。
次に明細行であることを示すために
<REPORT NAME=SFREC01> ............ </REPORT>
という記述を行う。RPG# ではこのタグを「REPORT文」と呼んでいる。
REPORT 文が DSPF の SFLレコードに相当している。
上記の HTML をブラウザで表示すると次のようになる。
SDA によって DSPF を表示するときは同じように1行分の明細行だけが定義されて
表示されている。
CRTWEBMOD
によってこの HTML は REPORT 文が含まれているので
次のようにサブファイルとしての DSPF が生成される
--------------------------------------------------------------------------------- 001.00 A***************************************************************** 002.00 A* HTML RECORD-BUFFER : 2009 年 11 月 01 日 13:15:54 * 003.00 A***************************************************************** 004.00 A*%% THIS IS A TEMPORARY SOURCE FILE GENERATED FROM HTML 005.00 A*%% BY CRTWEBMOD , ENTERPRISE SERVER VER 5.1 006.00 A*%% DO NOT CHANGE THIS SOURCE FILE. 007.00 A* 008.00 A DSPSIZ(24 80 *DS3) 009.00 A MSGLOC(24) 010.00 A PRINT 011.00 A*/AS400-NET.USR/PROJECT/WEB002/SFCTL01.HTM 012.00 A R SFREC01 SFL 013.00 A GYO 4Y 0O 1 2 014.00 A R SFCTL01 SFLCTL(SFREC01 ) 015.00 A SFLSIZ(0002) 016.00 A SFLPAG(0001) 017.00 A 41 SFLDSP SFLDSPCTL 018.00 A 44 SFLCLR 019.00 A*/AS400-NET.USR/PROJECT/WEB002/SF02L01.HTM ---------------------------------------------------------------------------------
このサブファイルは SFLSIZ = SFLPAG + 1
として定義されているので自動拡張で何行でも
増大して SFLレコードを追加することができるようになっている。
次に RPG# : WEB002
の RPGソースは以下のとおりである。
----------------------------------------------------------------------------------- 0001.00 H NOMAIN BNDDIR('ASNET.COM/MAIN') DATEDIT(*YMD/) DFTNAME(WEB002) 0002.00 F********** RPG# 入門bQ ********************************************* 0003.00 FWEB002H CF E SPECIAL PGMNAME('ASNET.COM/HTMLDVR') 0004.00 F PLIST(HPARM) 0005.00 F INFDS(INFDSF) 0006.00 F********************************************************************** 0007.00 /COPY ASNET.USR/QRPGLESRC,PROTOTYP5# 0008.00 D HTM_FILE S 10A INZ('WEB002H ') 0009.00 D HTM_LIB S 10A INZ('*LIBL ') 0010.00 D HTM_DIR S 128A INZ('/AS400-NET.USR/PROJECT/- 0011.00 D WEB002') 0012.00 D*( ファイル情報データ構造 ) 0013.00 D INFDSF DS 0014.00 D 512A 0015.00 D HTM_RECORD *RECORD 0016.00 D SFLRRN 376 377B 0 0017.00 D*( プログラム状況データ構造 ) 0018.00 D INFDSP SDS 0019.00 D 512A 0020.00 /COPY ASNET.USR/QRPGLESRC,HPARM 0021.00 ********************************************************* 0022.00 P EVENT B EXPORT 0023.00 ********************************************************* 0024.00 D PI 0025.00 P E 0026.00 ********************************************************* 0027.00 P BEGIN B EXPORT 0028.00 ********************************************************* 0029.00 * 最初の画面を出力します。 0030.00 D PI 0031.00 C 1 DO 10 SFLRRN 0032.00 C Z-ADD SFLRRN GYO 0033.00 C WRITE SFREC01 0034.00 C END 0035.00 C WRITE SFCTL01 0036.00 P E 0037.00 ********************************************************* 0038.00 P END B EXPORT 0039.00 ********************************************************* 0040.00 * 最後の処理を記述します。 0041.00 D PI 0042.00 C CLOSE WEB002H 0043.00 P E -----------------------------------------------------------------------------------
この RPG#ソースも実にシンプルであって
0026.00 ********************************************************* 0027.00 P BEGIN B EXPORT 0028.00 ********************************************************* 0029.00 * 最初の画面を出力します。 0030.00 D PI 0031.00 C 1 DO 10 SFLRRN 0032.00 C Z-ADD SFLRRN GYO 0033.00 C WRITE SFREC01 0034.00 C END 0035.00 C WRITE SFCTL01 0036.00 P E
だけが HTML の出力を記述している部分である。
10回繰り返しによって
WRITE SFREC01 によってサブファイル・レコードを 10レコード出力しておいてから
WRITE SFCTL01 によってサブファイル・コントロールを出力しているだけである。
出力結果は次のとおりである。
出力結果の HTML は次のようであり、REPORT 文が次々と自動的に追加されているのが
わかる。
---------------------------------------------------------------------------------- <HTML> <HEAD></HEAD> <BODY> <REPORT NAME=SFREC01> これは <span name=GYO.0001 alt="4S0" EDTCDE(Z)>0001</span> 行目のレコードです。<br> </REPORT> <REPORT NAME=SFREC01> これは <span name=GYO.0002 alt="4S0" EDTCDE(Z)>0002</span> 行目のレコードです。<br> </REPORT><REPORT NAME=SFREC01> これは <span name=GYO.0003 alt="4S0" EDTCDE(Z)>0003</span> 行目のレコードです。<br> </REPORT><REPORT NAME=SFREC01> これは <span name=GYO.0004 alt="4S0" EDTCDE(Z)>0004</span> 行目のレコードです。<br> </REPORT><REPORT NAME=SFREC01> これは <span name=GYO.0005 alt="4S0" EDTCDE(Z)>0005</span> 行目のレコードです。<br> </REPORT><REPORT NAME=SFREC01> これは <span name=GYO.0006 alt="4S0" EDTCDE(Z)>0006</span> 行目のレコードです。<br> </REPORT><REPORT NAME=SFREC01> これは <span name=GYO.0007 alt="4S0" EDTCDE(Z)>0007</span> 行目のレコードです。<br> </REPORT><REPORT NAME=SFREC01> これは <span name=GYO.0008 alt="4S0" EDTCDE(Z)>0008</span> 行目のレコードです。<br> </REPORT><REPORT NAME=SFREC01> これは <span name=GYO.0009 alt="4S0" EDTCDE(Z)>0009</span> 行目のレコードです。<br> </REPORT><REPORT NAME=SFREC01> これは <span name=GYO.0010 alt="4S0" EDTCDE(Z)>0010</span> 行目のレコードです。<br> </REPORT></BODY> </HTML> ----------------------------------------------------------------------------------
RPG# であれば複数の明細行の出力もいかに簡単であるか、おわかり頂けたと思う。
変数は .0000 として span タグに定義しておいて
明細行は <REPORT NAME= ... > ...... </REPORT>
という形式であり
WRITE 命令だけで明細行を追加することができる。
しかも横方向にも縦方向にも 80 * 24 の制限は一切ない。
シンプルでとても簡単。それでいて強力なパフォーマンスを誇っているのである。