次にサブファイル・レコード形式の複数行によるレコード出力のサンプルを紹介しよう。
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 の制限は一切ない。
シンプルでとても簡単。それでいて強力なパフォーマンスを誇っているのである。