それでは、App となる「単一登録パネル」の開発について解説する。
「単一登録パネル」とは丁度、DFU と同じように1レコードを 1つの画面で登録/維持するためのAppである。
ここでは PANEL-WORKER によって生成されたPNLGRPをわかりやすくするために一部を省略したものをサンプルとして使用する。
データ・ベースとして「銀行マスター」を使用する。
0001.00 A********************************************** 0002.00 A* BANKM : 銀行マスター * 0003.00 A********************************************** 0004.00 A UNIQUE 0005.00 A R @BANKM 0006.00 A*( 固定情報 ) 0007.00 A BKBKCD 4A COLHDG(' 銀行コード ') 0008.00 A BKNMKJ 14O COLHDG(' 銀行名 ') 0009.00 A BKKBN 3A COLHDG(' 区分 ') 0010.00 A* 0011.00 A K BKBKCD
最終的に完成されたAppは次のようになる。
BNK001 銀行マスターの登録 モード : 変更 銀行コード . . . . . 0001 登録または変更するコードを打鍵して実行キーを押してください。
BNK001 銀行マスターの登録 モード : 変更 銀行コード . . . . : 0001 銀行名 . . . . . . . 東京 1 銀行 区分 . . . . . . . . UPD 終り F3= 終了 F4= プロンプト F7= 次頁 F8= 前頁 F10= 更新 F12= 取消し F23= 削除
初めての方には以下のPNLGRPソースは少々長く感じるかも知れないが、実は単純な記述の繰り返しであるので理解には心配する必要はない。
0001.00 .******************************************************************* 0002.00 .* 0003.00 .* PANEL GRP NAME: BNK001 0004.00 .* 0005.00 .* TEXT : 銀行マスターの登録 0006.00 .* 0007.00 .* TYPE : 単一表示パネル 0008.00 .* 0009.00 .* PRIMARY FILE : BANKM 0010.00 .* LIBRARY : TESTFIL 0011.00 .* MEMBER : *FIRST 0012.00 .* 0013.00 .* 作成日 : 03/01/11 10:01:39 0014.00 .* 0015.00 .* 作成ユーザー : QTR CONSOLEA 0016.00 .* 0017.00 .* 変更日 : 03/01/11 10:01:39 0018.00 .* 0019.00 .* 変更ユーザー : QTR CONSOLEA 0020.00 .* 0021.00 .******************************************************************* 0022.00 0023.00 :PNLGRP. 0024.00 :COPYR .(C) COPYRIGHT OFFICE QUATTRO 1994. 0025.00 :IMPORT NAME='*' 0026.00 PNLGRP='PANELWKR/CMDHLP'. 0027.00 .* ------------------------- 0028.00 .* クラスの定義 0029.00 .* ------------------------- 0030.00 .IM MAINTCL 0031.00 :CLASS NAME=PNLNAMCL 0032.00 BASETYPE='CHAR 10'. 0033.00 :TL. 0034.00 :TI VALUE='" "'.BNK001 0035.00 :ETL. 0036.00 :ECLASS. 0037.00 :CLASS NAME=DMYCL 0038.00 BASETYPE='CHAR 1'. 0039.00 :ECLASS. 0040.00 .*...( ユーザークラス定義 )... 0041.00 .* STRCLASSDFN : DO NOT REMOVE THIS LINE 0042.00 :CLASS NAME=CHA004 0043.00 BASETYPE='CHAR 4'. 0044.00 :ECLASS. 0045.00 :CLASS NAME=IGC014 0046.00 BASETYPE='IGC 14 OPEN'. 0047.00 :ECLASS. 0048.00 :CLASS NAME=CHA003 0049.00 BASETYPE='CHAR 3'. 0050.00 :ECLASS. 0051.00 .* ENDCLASSDFN : DO NOT REMOVE THIS LINE 0052.00 .* ------------------------- 0053.00 .* 変数の定義 0054.00 .* ------------------------- 0055.00 .IM MAINTVAR 0056.00 :VAR NAME=DMY 0057.00 CLASS=DMYCL. 0058.00 .*...( ユーザー変数定義 )... 0059.00 .* STRVARDFN : DO NOT REMOVE THIS LINE 0060.00 :VAR NAME=BKBKCD 0061.00 CLASS=CHA004. 0062.00 :VAR NAME=BKNMKJ 0063.00 CLASS=IGC014. 0064.00 :VAR NAME=BKKBN 0065.00 CLASS=CHA003. 0066.00 .* ENDVARDFN : DO NOT REMOVE THIS LINE 0067.00 .* ------------------------- 0068.00 .* レコードの定義 0069.00 .* ------------------------- 0070.00 .IM MAINTRCD 0071.00 :VARRCD NAME=MODRCD 0072.00 VARS='DSPMOD'. 0073.00 :VARRCD NAME=HEDRCD 0074.00 VARS='BKBKCD DMY'. 0075.00 :VARRCD NAME=DSPRCD 0076.00 .* STRDSPRCD : DO NOT REMOVE THIS LINE 0077.00 VARS='BKBKCD BKNMKJ BKKBN DMY'. 0078.00 .* ENDDSPRCD : DO NOT REMOVE THIS LINE 0079.00 :VARRCD NAME=KEYRCD 0080.00 VARS='BKBKCD DMY'. 0081.00 .*...( USRCHKPGM RETURN )... 0082.00 .* STRCHKRCD : DO NOT REMOVE THIS LINE 0083.00 :VARRCD NAME=BKBKCD9CHK VARS=BKBKCD. 0084.00 :VARRCD NAME=BKNMKJ9CHK VARS=BKNMKJ. 0085.00 :VARRCD NAME=BKKBN9CHK VARS=BKKBN. 0086.00 .* ENDCHKRCD : DO NOT REMOVE THIS LINE 0087.00 .* ------------------------- 0088.00 .* 条件の定義 0089.00 .* ------------------------- 0090.00 :COND NAME=UPDSTS 0091.00 EXPR='DSPMOD = " 表示 "'. 0092.00 :COND NAME=DSPSTS 0093.00 EXPR='DSPMOD = " 表示 "'. 0094.00 .* ------------------------- 0095.00 .* 機能キーの定義 0096.00 .* ------------------------- 0097.00 :KEYL NAME=HEDKEYL. 0098.00 :KEYI KEY=ENTER 0099.00 HELP=ENTER 0100.00 VARUPD=YES 0101.00 ACTION=ENTER. 0102.00 :KEYI KEY=HELP 0103.00 HELP=HELP 0104.00 ACTION=HELP. 0105.00 :KEYI KEY=F3 0106.00 HELP=F3 0107.00 ACTION='EXIT SET' 0108.00 VARUPD=YES. 0109.00 F3= 終了 0110.00 :KEYI KEY=F7 0111.00 HELP=F7 0112.00 ACTION='RETURN 7' 0113.00 VARUPD=YES. 0114.00 F7= 次頁 0115.00 :KEYI KEY=F8 0116.00 HELP=F8 0117.00 ACTION='RETURN 8' 0118.00 VARUPD=YES. 0119.00 F8= 前頁 0120.00 :EKEYL. 0121.00 :KEYL NAME=DSPKEYL. 0122.00 :KEYI KEY=ENTER 0123.00 HELP=ENTER 0124.00 VARUPD=YES 0125.00 ACTION=ENTER. 0126.00 :KEYI KEY=HELP 0127.00 HELP=HELP 0128.00 ACTION=HELP. 0129.00 :KEYI KEY=F3 0130.00 HELP=F3 0131.00 ACTION='EXIT SET' 0132.00 VARUPD=NO. 0133.00 F3= 終了 0134.00 :KEYI KEY=F4 0135.00 HELP=F4 0136.00 ACTION='CALL WNDPMT' 0137.00 VARUPD=YES. 0138.00 F4= プロンプト 0139.00 :KEYI KEY=F7 0140.00 HELP=F7 0141.00 ACTION='RETURN 7' 0142.00 VARUPD=NO. 0143.00 F7= 次頁 0144.00 :KEYI KEY=F8 0145.00 HELP=F8 0146.00 ACTION='RETURN 8' 0147.00 VARUPD=NO. 0148.00 F8= 前頁 0149.00 :KEYI KEY=F10 0150.00 HELP=F10 0151.00 COND=UPDSTS 0152.00 ACTION='RETURN 10' 0153.00 VARUPD=YES. 0154.00 F10= 更新 0155.00 :KEYI KEY=F12 0156.00 HELP=F12 0157.00 ACTION='CANCEL SET' 0158.00 VARUPD=NO. 0159.00 F12= 取消し 0160.00 :KEYI KEY=F23 0161.00 HELP=F23 0162.00 COND=UPDSTS 0163.00 ACTION='RETURN 23' 0164.00 VARUPD=YES. 0165.00 F23= 削除 0166.00 :KEYI KEY=PAGEUP 0167.00 HELP=PAGEUP 0168.00 ACTION=PAGEUP. 0169.00 :KEYI KEY=PAGEDOWN 0170.00 HELP=PAGEDOWN 0171.00 ACTION=PAGEDOWN. 0172.00 :EKEYL. 0173.00 :KEYL NAME=ENDKEYL. 0174.00 :KEYI KEY=ENTER 0175.00 HELP=ENTER 0176.00 ACTION=ENTER. 0177.00 :KEYI KEY=HELP 0178.00 HELP=HELP 0179.00 ACTION=HELP. 0180.00 :KEYI KEY=F3 0181.00 HELP=F3 0182.00 ACTION='EXIT SET' 0183.00 VARUPD=NO. 0184.00 F3= 終了 0185.00 :KEYI KEY=F12 0186.00 HELP=F12 0187.00 ACTION='CANCEL SET' 0188.00 VARUPD=NO. 0189.00 F12= 取消し 0190.00 :EKEYL. 0191.00 .* ------------------------- 0192.00 .* ヘルプの定義 0193.00 .* ------------------------- 0194.00 :HELP NAME=DSPHEADH. 銀行マスターの登録 0195.00 :PC. 0196.00 初期画面 0197.00 :EHELP. 0198.00 :HELP NAME=DSPDTAH. 銀行マスターの登録 0199.00 :PC. 0200.00 明細画面 0201.00 :EHELP. 0202.00 :HELP NAME=DSPENDH. 銀行マスターの登録 0203.00 :PC. 0204.00 終了画面 0205.00 :EHELP. 0206.00 .* STRHLPDFN : DO NOT REMOVE THIS LINE 0207.00 :HELP NAME=BKBKCDH. 銀行コード 0208.00 :PC. 0209.00 銀行コード 0210.00 :EHELP. 0211.00 :HELP NAME=BKNMKJH. 銀行名 0212.00 :PC. 0213.00 銀行名 0214.00 :EHELP. 0215.00 :HELP NAME=BKKBNH. 区分 0216.00 :PC. 0217.00 区分 0218.00 :EHELP. 0219.00 .* ENDHLPDFN : DO NOT REMOVE THIS LINE 0220.00 .* ------------------------- 0221.00 .* 表 示 パ ネ ル 0222.00 .* ------------------------- 0223.00 .* ------------------------ 0224.00 .* DSPHEAD : 初期画面 0225.00 .* ------------------------ 0226.00 :PANEL NAME=DSPHEAD 0227.00 HELP='DSPHEADH' 0228.00 KEYL=HEDKEYL 0229.00 PANELID=PNLNAM 0230.00 ENTER='RETURN 27' 0231.00 CSRVAR=CSRVAR 0232.00 CSRPOS=CSRPOS 0233.00 CSRLST=CSRLST 0234.00 CSREID=CSREID 0235.00 CSRNAME=CSRNAME 0236.00 TOPSEP=NONE. 0237.00 銀行マスターの登録 0238.00 :DATA DEPTH=2 0239.00 HELP='DSPHEADH' 0240.00 BOTSEP=NONE. 0241.00 :DATACOL WIDTH=58. 0242.00 :DATACOL WIDTH='*'. 0243.00 :DATAI VAR=MODE 0244.00 USAGE=OUT. 0245.00 :DATAIX VAR=DSPMOD 0246.00 ALIGN=RIGHT 0247.00 NEWLINE=NO 0248.00 USAGE=OUT. 0249.00 :EDATA. 0250.00 :DATA DEPTH=10 0251.00 SCROLL=NO 0252.00 LAYOUT=1 0253.00 BOTSEP=SPACE. 0254.00 :DATACOL WIDTH=20. 0255.00 :DATACOL WIDTH='*'. 0256.00 .* 0257.00 :DATAGRP GRPSEP=NONE 0258.00 COMPACT. 0259.00 .* DO 0260.00 .* STRHEDDATAI : DO NOT REMOVE THIS LINE 0261.00 :DATAI VAR=BKBKCD 0262.00 HELP=BKBKCDH 0263.00 USAGE=INOUT. 0264.00 銀行コード 0265.00 .* ENDHEDDATAI : DO NOT REMOVE THIS LINE 0266.00 .* END 0267.00 :EDATAGRP. 0268.00 :BOTINST. 登録または変更するコードを打鍵して実行キーを押してください。 0269.00 :EDATA. 0270.00 :EPANEL. 0271.00 .* ------------------------ 0272.00 .* DSPDTA01 : 明細画面 0273.00 .* ------------------------ 0274.00 :PANEL NAME=DSPDTA 0275.00 HELP='DSPDTAH' 0276.00 KEYL=DSPKEYL 0277.00 PANELID=PNLNAM 0278.00 ENTER='RETURN 27' 0279.00 CSRVAR=CSRVAR 0280.00 CSRPOS=CSRPOS 0281.00 CSRLST=CSRLST 0282.00 CSREID=CSREID 0283.00 CSRNAME=CSRNAME 0284.00 TOPSEP=NONE. 0285.00 銀行マスターの登録 0286.00 :DATA DEPTH=2 0287.00 HELP='DSPDTAH' 0288.00 BOTSEP=NONE. 0289.00 :DATACOL WIDTH=58. 0290.00 :DATACOL WIDTH='*'. 0291.00 :DATAI VAR=MODE 0292.00 USAGE=OUT. 0293.00 :DATAIX VAR=DSPMOD 0294.00 ALIGN=RIGHT 0295.00 NEWLINE=NO 0296.00 USAGE=OUT. 0297.00 :EDATA. 0298.00 .* キー項目の表示 0299.00 :DATA DEPTH=01 0300.00 SCROLL=NO 0301.00 LAYOUT=1 0302.00 BOTSEP=NONE 0303.00 COMPACT. 0304.00 :DATACOL WIDTH=20. 0305.00 :DATACOL WIDTH='*'. 0306.00 .* 0307.00 :DATAGRP GRPSEP=NONE 0308.00 COMPACT. 0309.00 .* STRKEYDATAI : DO NOT REMOVE THIS LINE 0310.00 :DATAI VAR=BKBKCD 0311.00 HELP=BKBKCDH 0312.00 USAGE=OUT. 0313.00 銀行コード 0314.00 .* ENDKEYDATAI : DO NOT REMOVE THIS LINE 0315.00 :EDATAGRP. 0316.00 :EDATA. 0317.00 .* データ項目の表示 0318.00 :DATA DEPTH='*' 0319.00 SCROLL=YES 0320.00 LAYOUT=1 0321.00 BOTSEP=NONE 0322.00 COMPACT. 0323.00 :DATACOL WIDTH=20. 0324.00 :DATACOL WIDTH='*'. 0325.00 .* STRDTADATAI : DO NOT REMOVE THIS LINE 0326.00 :DATAI VAR=BKNMKJ 0327.00 HELP=BKNMKJH 0328.00 USAGE=INOUT. 0329.00 銀行名 0330.00 :DATAI VAR=BKKBN 0331.00 HELP=BKKBNH 0332.00 USAGE=INOUT. 0333.00 区分 0334.00 .* ENDDTADATAI : DO NOT REMOVE THIS LINE 0335.00 :EDATA. 0336.00 :EPANEL. 0337.00 .* ENDPNL OF DSPTOP 0338.00 .* ------------------------ 0339.00 .* ENDOPT : 終了画面 0340.00 .* ------------------------ 0341.00 :PANEL NAME=ENDOPT 0342.00 HELP='DSPENDH' 0343.00 KEYL=ENDKEYL 0344.00 ENTER='RETURN 27' 0345.00 TOPSEP=SPACE. 0346.00 データ入力の終了 0347.00 :DATA DEPTH=9 0348.00 HELP='DSPENDH' 0349.00 LAYOUT=1 0350.00 BOTSEP=SPACE. 0351.00 :TOPINST . 処理されたレコード数 0352.00 :DATACOL WIDTH=18. 0353.00 :DATACOL WIDTH='*'. 0354.00 :DATAGRP COMPACT. 0355.00 :DATAI VAR=ADDRCD 0356.00 JUSTIFY=RIGHT 0357.00 USAGE=OUT. 追加 0358.00 :DATAI VAR=CHGRCD 0359.00 JUSTIFY=RIGHT 0360.00 USAGE=OUT. 変更 0361.00 :DATAI VAR=DLTRCD 0362.00 JUSTIFY=RIGHT 0363.00 USAGE=OUT. 削除 0364.00 :EDATAGRP. 0365.00 :EDATA. 0366.00 :DATA DEPTH='*' 0367.00 HELP='DSPENDH' 0368.00 LAYOUT=1 0369.00 BOTSEP=SPACE. 0370.00 :TOPINST . 選択項目を入力して,実行キーを押してください。 0371.00 :DATACOL WIDTH=28. 0372.00 :DATACOL WIDTH=10. 0373.00 :DATACOL WIDTH='*'. 0374.00 :DATAGRP GRPSEP=NONE 0375.00 COMPACT. 0376.00 :DATAI VAR=ANS 0377.00 USAGE=INOUT. 0378.00 データ入力の終了 0379.00 :DATAC.Y=YES, N=NO 0380.00 :EDATAGRP. 0381.00 :EDATA. 0382.00 :EPANEL. 0383.00 0384.00 :EPNLGRP. 0385.00 .* * * * END OF PANEL GROUP * * *
上記のソースは次のような構造になっている。
クラスの定義
クラスとは変数の基底となる定義である。長さなどの属性を定義するわけであるが、変数自身は変数を直接、定義するのではなくクラスをベースとして定義する。
例えば後での変数の定義で長さ10桁の文字を定義したいのであれば、最初にその属性でのクラスを定義しておいてから変数は、そのクラスをベースとして定義する。
例えば
:CLASS NAME=CHA004 BASETYPE='CHAR 4'. :ECLASS.
によって長さ4桁の文字のクラス CHA004 を定義している。
変数の定義
変数の定義ではPNLGRPの中で使用する変数をクラスをベースとして定義する。
例えば
:VAR NAME=BKBKCD CLASS=CHA004.
によって4桁の文字変数である BKBKCD を定義している。
これでわかるように同じ属性の変数は同じクラスを何度でも使って定義することができる。
また、同じ記述は
.IM MAINTVAR
のようにして登録しておいた変数記述のソースをコンパイル時にインポートすることもできる。
これによって汎用的な変数の定義などは個別のPNLGRPソースとして登録しておくと新規のPNLGRPソースを小さなものにできる。
レコードの定義
レコードとは、この PNLGRP を起動するAppとのインター・フェースである。
PNLGRP を起動するAppはレコードを介してPNLGRPの変数を読み取ったり、更新したりする。
よって読み取りや更新を行いたい変数の組み合わせを1つのレコードとして定義しておく必要がある。
例えば、
:VARRCD NAME=DSPRCD VARS='BKBKCD BKNMKJ BKKBN DMY'.
は、変数: BKBKCD + BMNMKJ + BKKBN + DMY
をセットするレコード DSPRCD である。
条件の定義
条件を与えたい場合は条件を定義することができる。
例えば、
:COND NAME=DSPSTS EXPR='DSPMOD = " 表示 "'.
とは 変数 DSPMOD の値が "表示"であったときに DSPSTS という条件が「真」になることを意味している。
機能キーの定義
機能キーの定義では機能キーのセットを名前をつけて定義する。
機能キーのセットは
:KEYL NAME=DSPKEYL.
から
:EKEYL.
のあいだに定義する。この場合は DSPKEYL という名前の機能キーのセットを定義することになる。
それぞれの機能キーは :KEYI によって、例えば、
:KEYI KEY=F10 HELP=F10 COND=UPDSTS ACTION='RETURN 10' VARUPD=YES. F10= 更新
のように定義する。これは KEY=F10 によって F10キーを定義している。
COND=UPDSTS
によって条件 UPDSTS が真のときに限り表示されることになる。
また ACTION='RETURN 10'
は機能キーF10が押されたときには 値=10を戻すことを意味している。
VARUPD=YES
は機能キーが押されたときに変数の値を入手することを意味している。
つまり RPGでの CF10キーに相当する。これに対して VARUPD=NO
であればRPGでの CA10キーに相当することになる。
ヘルプの定義
ヘルプの定義は各表示項目への説明を記述する。
ここでは
:HELP NAME=BKBKCDH. 銀行コード :PC. 銀行コード :EHELP.
のようにして項目だけを定義している。
表示パネル
表示パネルの定義がPNLGRPの主体であり、これまで上記で定義してきた変数などを使ってパネル・グループの本体を定義する。
この例では表示パネルは
初期画面 : DSPHEAD
明細画面 : DSPDTA
終了画面 : ENDOPT
の3つの表示パネルを定義している。
:PANEL NAME=DSPDTA HELP='DSPDTAH' KEYL=DSPKEYL PANELID=PNLNAM ENTER='RETURN 27' CSRVAR=CSRVAR CSRPOS=CSRPOS CSRLST=CSRLST CSREID=CSREID CSRNAME=CSRNAME TOPSEP=NONE. 銀行マスターの登録
から :EPANEL.
のあいだに項目を定義する。
各行は DATA タグによって
:DATA DEPTH=01 SCROLL=NO LAYOUT=1 BOTSEP=NONE COMPACT.
から :EDATA.
のあいだに定義される。
DATA タグがデータ表示項目の1つの塊であるが、その中を複数の列に分解したい場合はさらに、
:DATACOL WIDTH=20. :DATACOL WIDTH='*'.
のようにして分割することができる。
これは最初の列は横幅の長さ20桁の列であり、2列目はその残りの桁数を割り当てることを意味している。DATAタグの場合も同様で、 DEPTH='*' の定義は残りの行数を割り当てることを意味している。
各項目は
:DATAI VAR=BKNMKJ HELP=BKNMKJH USAGE=INOUT. 銀行名
のようにして DATAI タグによって定義される。USAGE=INOUT は入出力可を意味しており、出力専用の場合は USAGE=OUT として定義する。
このようにタグの組み合わせによって画面を適切に分解して項目をそこに配置していくというのが PNLGRP
による表示の方法である。
これによく似たやり方を行っているのが実は Java である。
Java の AWT は PNLGRP のように自動配置を基本としているが、いろいろと問題もあり、PNLGRP ほど配置は容易ではない。
PNLGRP はJava に比べて数十年もの歴史を持っているし何よりOS/400の大部分のインターフェースを PNLGRPで形成されていることを見ても信頼性と柔軟性に優れていることは実証済みである。
また表示のパフォーマンスもDSPFよりも優れている。
特に遠隔地オンラインなどの条件の悪いところではPNLGRPのパフォーマンスは効果を発揮する。