HTTPサーバーとWeb開発

73. RPG# 入門bQ

次にサブファイル・レコード形式の複数行によるレコード出力のサンプルを紹介しよう。
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 の制限は一切ない。

シンプルでとても簡単。それでいて強力なパフォーマンスを誇っているのである。