RPG#とは?

RPG# は System i の Web開発のために EnterpriseServer で提供される新しい [イベント駆動型] の RPG開発言語です。

Web開発環境と Web2.0 がもたらす効果

Web開発の手法としては、CGIJSPPHP、...などの多くの開発言語がありますが、Web2.0 powerd by Ajax による
ブラウザ・インターフェースのリッチ・クライアント化は目覚しい勢いで普及を遂げています。
これは HTML画面上に多くの、しかも動的に制御できるGUIコントロールを配置してユーザビリティに貢献するというものです。

Web2.0 であれば、その場で動的に GUIコントロールや HTMLインターフェースを動的に変化させることができます。
しかし、Ajax の普及とともに、従来からの 手続き型(ウォーターフォール型) の開発言語では、ひとつの画面に対して、
各GUIコントロールの動作をサポートする CGI が、数多く必要となってしまいます。

ウォーターフォール型のは各GUIコントロールにCGIが必要です。

これでは、ひとつの画面を保守する CGI が複数個となってしまい、開発や保守もかなり複雑なものとなってしまいます。
また、閉ざされた 5250エミュレータの世界では、イベントと言えば、せいぜい実行キーや機能キーだけでしかありませんでしたが、
多くのGUIコントロールを抱えるHTMLインターフェースではユーザーが、別のサイトに自由に移動してしまうことも珍しくはありません。

つまり、これまでメイン・ルーチンによってプログラムが処理の主導が行っていたのに対して処理の主導権は
ユーザーの操作そのものに移っているのである、と考えねばなりません。
従来の手続き型(ウォーターフォール型) の開発言語は、Web2.0の普及とともにもはや限界であると言えるのです。

ところがWebの開発言語の、ほとんどが未だに、レガシーな手続き型(ウォーターフォール型)です。

RPG# の登場

そこで Web開発の豊富な実績と長い経験を持つ、EnterpriseServer では
イベント駆動型の開発言語である「RPG#」を生み出しました。
イベント駆動型の言語にすることによって前述のような多くの GUIコントロールの
処理をすべて、ひとつの CGI の中にまとめることができるようになります。

C++ や BASIC が、イベント駆動型として VC++ や VisualBASIC として進化した
ように RPG も、やはりイベント駆動型としての RPG# への進化が必要で
あったのはごく自然な流れでした。

しかし RPG をイベント駆動型の RPG# へ進化させるには、長い経験と技術の積み重ねが必要であったのです。
RPG# は、メイン・ルーチンを持たない、それゆえ軽く動作するという Web開発には、おあつらえ向きの開発言語です。
もとより ILE-RPG は VC++ や VisualBASIC のような統合型開発言語(ILE) としての構造は、備えており、
その機能性においては、VC++ や VisualBASIC をも凌ぐものを持っています。

ILE-RPG から進化した RPG# も 特殊なものではなく 文法は RPG であり、これまでのように、RPGコンパイラーによって
コンパイルすることができます。

イベント駆動とは ?

イベント駆動とは、ユーザーがマウスをクリックしたとか、ボタンを押したなどのイベント(事象) をとらえて、
そのイベントを処理するプロシージャーを記述するだけというごく「直感的」で「わかりやすい」ものです。

例えば、次の RPG# によるイベント記述をご覧ください。

/FREE                                                    
  ON_CLICK('DSPHEAD': 'GO': %PADDR(DSPHEAD_GO));        
  ON_CLICK('DSPDTA01': 'UPDATE': %PADDR(DSPDTA01_UPD)); 
  ON_CLICK('DSPDTA01': 'DELETE': %PADDR(DSPDTA01_DLT)); 
/END-FREE
イベント駆動型

3つのイベントに対する記述が行われていますが、最初の

ON_CLICK('DSPHEAD': 'GO': %PADDR(DSPHEAD_GO));

とは、DSPHEAD.HTM という名前の HTML画面上における GO という名前の
識別(ID) のボタンが押された(ON_CLICK) ときには、DSPHEAD_GO という名前の
プロシージャーを呼び出して実行しなさい、というものです。

これらのイベント処理の記述は eStudioWizard生成によって
自動生成されますがユーザーが手動によっても自由に追加することも
できます。

HTML の外部記述化

Web開発が初めての人であれば HTMLに対する入出力の方法については多少の不安があるかも知れません。
表示装置ファイル(DSPF) に対する入出力は、ご存知のとおり、READ/WRITE命令 によるごく簡単なものでした。
実は RPG# でも表示装置ファイル(DSPF) のときと同じように READ/WRITE命令 だけによって簡単に入出力を行うことができます。

次の DSPHEAD.HTM 上で [GOボタン] が押されたときに処理する プロシージャー: DSPHEAD_GO をご覧ください。

*********************************************************             
P DSPHEAD_GO      B                   EXPORT                          
*********************************************************             
 * GO ボタンが押されたときの記述を行います。                          
D                 PI                                                  
C                   READ      DSPHEAD                              99 
C     *NOKEY        CLEAR                   SHOHINR                   
C                   SETOFF                                       90   
C     TRNKEY        CHAIN     SHOHIN                             90   
C                   WRITE     DSPDTA01                                
P                 E                                                   

最初に READ DSPHEAD によって DSPHEAD.HTM に定義されている変数値をすべて読み取ってから、
商品マスター(SHOHIN) を CHAIN 命令によって検索して、その結果を WRITE DSPDTA01 によって
DSPDTA01.HTM として出力しているだけです。

EXFMT は使うことはできませんが、その他においては表示装置ファイル(DSPF) のものと何ら変わるところはありません。
このプロシージャーを見て、これが HTML への入出力であると気づく人はいないでしょう。

HTML は外部ファイルとしてファイル仕様書では次のように定義されています。

FPGM001H   CF   E             SPECIAL PGMNAME('ASNET.COM/HTMLDVR')

DSPF: PGM001H は、ユーザーが作成する必要はありません。

この CGI をコンパイルするときには CRTRPGMOD コマンドではなく、RPG# で提供される、
CRTWEBMOD (WEB モジュールの作成) というコマンドを使って一時的なモジュール(*MODULE) を作成しますが、
このとき CRTWEBMOD はHTMLファイルから自動的にコンパイルに必要な DSPF: PGM001H を生成してから
CRTRPGMOD を実行します。

開発者は PGM001H の内容を気にする必要もありません。

HTML は PGM001H という名前の SPECIALファイル(DSPF) として定義されており、
PGM001H というファイルに対して READ/WRITE の入出力が実行されると OS400 は
ASNET.COM/HTMLDVR という名前のRPG# が提供する「HTMLドライバー」を呼び出します。

この HTMLドライバーが実際に HTML とのインターフェースの役割を果たす、ゲートウェイです。

イベント駆動型

それでは変数は、HTMLにどのように記述されているのでしょう? 次の HTML 記述をご覧ください。
入力フィールドの商品単価(7S0)は次のように定義されています。

<input type="text" name=SHTANK id="SHTANK" value="##########" maxlength="10" size="12" alt="7S0" EDTCDE(J)>

id="SHTANK" によって、この記述の項目名が SHTANK(商品単価) であることがわかります。
注目すべきは、

alt="7S0" EDTCDE(J)

という記述です。

これは 7桁のゾーン十進数(小数以下0) であり、編集コード JEDTCDE(J) によって定義されています。
これは DSPF の DDS記述と基本的に同じです。

出力は EDTCDE(J) によって編集されて value="##########" に出力結果が埋め込まれますし
入力は alt="7S0" の記述によって数字としての入力時における妥当性検査も RPG# が用意する
JavaScript によって行われますのでユーザーは DSPF のときと同じようにユーザー自身による
妥当性検査に配慮する必要は全くありません。

イベント駆動型 RPG# のまとめ

  • メイン・ルーチンはない。
  • HTML GUIコントロールのイベントを処理するプロシージャーを定義するだけである。
  • HTML ファイルへの入出力は RPG の READ/WRITE命令だけで行うことができる。
  • フィールドの属性や編集も、すべて HTML に記述しておくだけでよい。
  • 入力妥当性検査は組み込まれているので心配は無用。

GUI コントロール

RPG# のリッチな HTMLインターフェースには次のような様々な GUIコントロール を備えています。

GUI コントロール一覧
各GUIコントロール_01
SFLCTL コントロール
お馴染みのリスト・ビュー、5250画面での
サブ・ファイルです。
COMBOBOX コントロール
プル・ダウン・メニュー方式で入力候補を選択できる
コンボボックスです。
RADIOBTN コントロール
ラジオ・ボタンのコントロールです。
CHECKBOX コントロール
チェック・ボックスのコントロールです。
EDTCTL コントロール
入力コントロール、つまり通常の
テキスト入力エリアです。
TEXTARA コントロール
複数行の入力を可能にするテキスト・エリアです。
BUTTON コントロール
押しボタン
XML コントロール
Ajax のリクエストに応えて XML の構造を
戻すためのコントロールです。
HTML コントロール
動的な HTML タグを追加するための
コントロールです。
SCRIPT コントロール
動的に JavaScript や VBScript を制御する
コントロールです。

各 GUIコントロールにはメソッドとプロパティが用意されています。
メソッドとは GUIコントロールの振る舞いを行うための公開関数(EXPORTプロシージャー) です。
プロパティとは GUIコントロールの属性(EXPORT変数) です。

GUIコントロールのメソッドとプロパティを処理することによって、従来ではできなかったような GUIコントロールの細かな
制御を動的に行うことができるようになります。
これは VC++ 等の GUI対応開発言語と同じ GUIコントロール機能の搭載を意図しています。

各コントロールは使用を宣言して初めて RPG# にモジュールが組み込まれるよう設計されています。
これは不要なオブジェクト・サイズの増大を最小限に抑えて RPG# が軽く動作するために配慮されています。

MVC 3階層モデルを実現

MVC3階層モデル

いわゆる MVC 3階層モデル とは

処理の中核を行うビジネス・ロジック
表示・出力のインターフェース
入力を受け取ってモデルとビューを制御

に分離するというソフトウェアの理想的な設計モデルのことです。

MVC 3階層モデルとしてソフトウェアを構築することの重要性は、

  • 保守・管理に優れたアプリケーション構造である。
  • 処理が目的によって分離された品質に優れたソフトウェア。
  • 将来のインーフェースの変更などの大幅な改造にも耐えることができる。

などを挙げることができます。

それでは、なぜ MVC 3階層モデルが重要なのでしょうか?
HTML の内部にスクリプトを埋め込んでいる PHPJSP & Servlet、または ASP を考えてみてください。
これらの Web開発手法では HTML というビューの中にビジネス・ロジックとなるモデルとしての処理構造を埋め込んでしまっています。

System i ではありえないことですが、RPGソース の中に DSPF記述混在 して記述されていることを想像してみてください。
開発だけでなく、保守がどれほど複雑で困難なものになるか容易に想像がつくはずです。
しかし現実の Web用のスクリプト言語の大半はビジネス・ロジックと HTML などの記述が混在して記述されています。
しかも新しい言語を学習する必要があります。

RPG# であれば、RPG の知識と経験だけで理想的な MVC 3階層モデルとして Webアプリケーションを無理なく自然な形で
構築することができます。

RPG# のユーザー記述のイベント・プロシージャー群
HTML インターフェース
イベント・トリガー記述

RPG# であればメイン・ルーチンがないのですからプログラマーの個性による記述は極力、抑えられて後から誰が見ても
容易にソースを判別することができます。

MVC 3階層モデル のまとめ

  • ビジネス・ロジックと HTMLビュー、コントロールの完全な分離
  • メイン・ルーチンがないので誰が開発しても同じロジックに統一
  • 見やすくわかりやすく将来の保守や拡張性に富んでいる。
RPG#の実際