先に紹介したようにC言語でもrecio.hに
R関数という一連のRPG演算命令に相当する関数が
用意されている。
これらを使うとC言語でもDSPFやPRTFの外部記述ファイルへの
入出力が可能になる。
IBMマニュアルにもR関数の使用方法を示すC言語の
サンプル・ソースが公開されているが
これらのサンプルは複数の表示端末で操作するというような
通常ではありえないようなサンプルばかりが示されていて
どのR関数をどのように組み合わせて使えばよいのか
ユーザーにはさっぱりわからないというのが
現状である。
_
商品マスター登録 モード . . : 表示 様式 . . . . : DSPHEAD ファイル . : SHOHIN 商品コード : NV-CF1 必要な項目を入力して,実行キーを押してください。 F3= 終了 F5= 最新表示 F9= 挿入 F10= 入力 F11= 変更
そこでシンブルな入出力を始めとして実際に
動作するC言語のサンプル・ソースを紹介する。
これは試行錯誤でようやくたどり着いた貴重なサンプルなので
よく参考にして頂きたい。
[ @SHOHIN: 商品マスター登録 ]
ソースはこちらから
0001.00 #include0002.00 #include 0003.00 #include 0004.00 #include 0005.00 0006.00 #define PF03 2 0007.00 #define IND_OFF '0' 0008.00 #define IND_ON '1' 0009.00 0010.00 _SYSindara ind_area; /* 標識エリア */ 0011.00 0012.00 int main(void) 0013.00 { 0014.00 _RFILE *fp; /* ファイル・ポインタ */ 0015.00 _RIOFB_T *rfb; /*Pointer to the file's feedback structure */ 0016.00 _XXIOFB_T *iofb; /* Pointer to the file's feedback area */ 0017.00 char buf[10], in_buf[10], out_buf[44]; 0018.00 0019.00 if (( fp = _Ropen ( "QTROBJ/@SHOHIN", "ar+,indicators=Y" )) == NULL ){ 0020.00 printf ( "> Could not open DSPFn" ); 0021.00 exit ( 1 ); 0022.00 } 0023.00 _Rindara ( fp, ind_area ); 0024.00 _Rformat ( fp,"DSPHEAD" ); /* 初期画面フォーマットを設定 */ 0025.00 0026.00 _Rwrite ( fp, "", 0 ); /* DSPF のセットアッブ */ 0027.00 /*( 出力レコードの初期化 )*/ 0028.00 memset(out_buf, ' ', sizeof(out_buf)); 0029.00 memcpy(out_buf, " 表示 ", 14); 0030.00 memcpy(&out_buf[14], "DSPHEAD ", 10); 0031.00 memcpy(&out_buf[24], "SHOHIN ", 10); 0032.00 memcpy(&out_buf[34], " ", 10); 0033.00 while(ind_area[PF03] != IND_ON){/*while*/ 0034.00 rfb = _Rwrread ( fp, &in_buf, sizeof(in_buf), &out_buf, sizeof(out_buf)); /* EXFMT */ 0035.00 if (ind_area[PF03] == IND_ON){/* 機能キーの検査 */ 0036.00 _Rclose ( fp ); 0037.00 exit(0); 0038.00 }/* 機能キーの検査 */ 0039.00 memcpy(&out_buf[34], in_buf, 10);/* 入力フィールド値を出力レコードに更新する */ 0040.00 }/*while*/ 0041.00 _Rclose ( fp ); 0042.00 exit(0); 0043.00 }
[解説]
最初に
0002.00 #include
によってR関数の型をインクルードしている。
0019.00 if (( fp = _Ropen ( "QTROBJ/@SHOHIN", "ar+,indicators=Y" )) == NULL ){ 0020.00 printf ( "> Could not open DSPFn" ); 0021.00 exit ( 1 ); 0022.00 }
が DSPFのオープンであるがオープンするモードは “ar+,indicators=Y” と指定すること。
DSPFは標識は次のように画面バッファーと分離しておかなければならない。
0009.00 A INDARA 0010.00 A R DSPHEAD TEXT(' 初期画面レコード ') 0011.00 A CHANGE(01) 0012.00 A CF03(03 ' 終了 ') :
DSPFのソースは後で紹介する。
_
次に
0023.00 _Rindara ( fp, ind_area );
で標識エリアの宣言をする。DSPFで INDARAを宣言しておかないと
_Ropenでオープン・エラーになるがIBMマニュアルでは何も説明がない。
続いて
0024.00 _Rformat ( fp,"DSPHEAD" ); /* 初期画面フォーマットを設定 */
で次に処理する画面様式名の宣言が必要である。
物理ファイルの読取りではこの宣言は必要ない。
0026.00 _Rwrite ( fp, "", 0 ); /* DSPF のセットアッブ */
は DSPFを使う前の初期化である。
0027.00 /*( 出力レコードの初期化 )*/ 0028.00 memset(out_buf, ' ', sizeof(out_buf)); 0029.00 memcpy(out_buf, " 表示 ", 14); 0030.00 memcpy(&out_buf[14], "DSPHEAD ", 10); 0031.00 memcpy(&out_buf[24], "SHOHIN ", 10); 0032.00 memcpy(&out_buf[34], " ", 10);
では出力バッファーの値を設定している。
IBMマニュアルでは値の設定方法に着いても解説は全くない。
0033.00 while(ind_area[PF03] != IND_ON){/*while*/
のwhile文で CF03が押されるまでLOOPすることを意味する。
while(ind_area[PF03] == IND_OFF){/*while*/
では正しく動作しない。
いよいよ
0034.00 rfb = _Rwrread ( fp, &in_buf, sizeof(in_buf), &out_buf, sizeof(out_buf)); /* EXFMT */
が EXFMT であるが
_Rwrread の代わりに _Rwriterd を使ってもよいが _Rwriterdは入力バッファーと出力バッファーが
分離されていないので演算の前後で入出力バッファーの組立てがかなり面倒になる。
_Rwrreadであれば入力バッファーと出力バッファーが分離されているので演算は少なくて済むようになる。
ただし
0039.00 memcpy(&out_buf[34], in_buf, 10);/* 入力フィールド値を出力レコードに更新する */
というようにRPGの入出力共有は使えないのでこのように自分で次の出力バッファーを更新しなければ
ならない。
しかし入出力バッファーも自動的に取り出せないか調べてみることにする。
最後に機能キーを取得して終了する。
0035.00 if (ind_area[PF03] == IND_ON){/* 機能キーの検査 */ 0036.00 _Rclose ( fp ); 0037.00 exit(0); 0038.00 }/* 機能キーの検査 */
[ @SHOHIN: 商品マスター登録DSPF ]
ソースはこちらから
0001.00 A DSPSIZ(27 132 *DS4) 0002.00 A *DS4 MSGLOC(27) 0003.00 A PRINT 0004.00 A HELP 0005.00 A HLPSCHIDX(*LIBL/QHPW1) 0006.00 A ALTHELP(CA01) 0007.00 A HLPTITLE(' データ入力画面 ') 0008.00 A HLPPNLGRP('DFU/DESL/GEN' QHDZDF1) 0009.00 A INDARA 0010.00 A R DSPHEAD TEXT(' 初期画面レコード ') 0011.00 A CHANGE(01) 0012.00 A CF03(03 ' 終了 ') 0013.00 A CF05(05 ' 再表示 ') 0014.00 A CF06(06 ' 様式の選択 ') 0015.00 A CF09(09 ' 挿入 ') 0016.00 A CF10(10 ' 入力 ') 0017.00 A CF11(11 ' 変更 ') 0018.00 A ROLLUP(07 ' ROLLUP') 0019.00 A ROLLDOWN(08 'ROLLDWN') 0020.00 A 1 2' 商品マスター登録 ' 0021.00 A*( 表示モード記述 ) 0022.00 A 1 49' モード . . :' 0023.00 A DSPMOD 14A O 1 66 0024.00 A 2 2' 様式 . . . . :' 0025.00 A RECORD 10A O 2 21 0026.00 A 2 49' ファイル . :' 0027.00 A FILE 10A O 2 66 0028.00 A*( フィールド記述 ) 0029.00 A 4 2' 商品コード :' 0030.00 A SHCODE 10A B 4 16 0031.00 A 43 DSPATR(RI) 0032.00 A CHECK(FE) 0033.00 A 12 14' 必要な項目を入力して,実行キーを + 0034.00 A 押してください。 ' 0035.00 A COLOR(BLU) 0036.00 A*( 機能キーの記述 ) 0037.00 A 22 2'F3= 終了 ' 0038.00 A COLOR(BLU) 0039.00 A 22 26'F5= 最新表示 ' 0040.00 A COLOR(BLU) 0041.00 A 22 51'F9= 挿入 ' 0042.00 A COLOR(BLU) 0043.00 A 22 72'F10= 入力 ' 0044.00 A COLOR(BLU) 0045.00 A 23 2'F11= 変更 ' 0046.00 A COLOR(BLU) 0047.00 A R DSPDTA01 TEXT(' 明細画面レコード 01') 0048.00 A CHANGE(01) 0049.00 A CF03(03 ' 終了 ') 0050.00 A CF05(05 ' 再表示 ') 0051.00 A CF09(09 ' 挿入 ') 0052.00 A CF10(10 ' 入力 ') 0053.00 A CF11(11 ' 変更 ') 0054.00 A CF12(12 ' 前画面 ') 0055.00 A CF23(23 ' 削除 ') 0056.00 A ROLLUP(07 ' ROLLUP') 0057.00 A ROLLDOWN(08 'ROLLDWN') 0058.00 A SETOF(99) 0059.00 A ERRMSG 144A P 0060.00 A 1 2' 商品マスター登録 ' 0061.00 A*( 表示モード記述 ) 0062.00 A 1 49' モード . . :' 0063.00 A DSPMOD 14A O 1 66 0064.00 A 2 2' 様式 . . . . :' 0065.00 A RECORD 10A O 2 21 0066.00 A 2 49' ファイル . :' 0067.00 A FILE 10A O 2 66 0068.00 A*( フィールド記述 ) 0069.00 A 4 2' 商品コード :' 0070.00 A SHCODE 10A B 4 16 0071.00 A 43 DSPATR(RI) 0072.00 A DSPATR(PR) 0073.00 A 32 DSPATR(UL) 0074.00 A CHECK(FE) 0075.00 A 5 2' 商品名 :' 0076.00 A SHNAME 24O B 5 16 0077.00 A 43 DSPATR(RI) 0078.00 A 30 DSPATR(PR) 0079.00 A N30 DSPATR(UL) 0080.00 A CHECK(FE) 0081.00 A 6 2' 単価 :' 0082.00 A SHTANK 7Y 0B 6 16 0083.00 A 43 DSPATR(RI) 0084.00 A 30 DSPATR(PR) 0085.00 A N30 DSPATR(UL) 0086.00 A EDTCDE(1) 0087.00 A CHECK(RB) 0088.00 A 7 2' 品種コード :' 0089.00 A SHSCOD 4A B 7 16 0090.00 A 43 DSPATR(RI) 0091.00 A 30 DSPATR(PR) 0092.00 A N30 DSPATR(UL) 0093.00 A CHECK(FE) 0094.00 A 71 ERRMSGID(CPF9897 QSYS/QCPFMSG - 0095.00 A 71 &ERRMSG) 0096.00 A HNSNAM R O 7 21REFFLD(HINSHUR/HNSNAM QTRFIL/HINSHU) 0097.00 A*( 機能キーの記述 ) 0098.00 A 22 2'F3= 終了 ' 0099.00 A COLOR(BLU) 0100.00 A 22 26'F5= 最新表示 ' 0101.00 A COLOR(BLU) 0102.00 A 22 51'F9= 挿入 ' 0103.00 A COLOR(BLU) 0104.00 A 22 72'F10= 入力 ' 0105.00 A COLOR(BLU) 0106.00 A 23 2'F11= 変更 ' 0107.00 A COLOR(BLU) 0108.00 A 23 26'F23= 削除 ' 0109.00 A COLOR(BLU) 0110.00 A 23 51'F12= 前画面 ' 0111.00 A COLOR(BLU) 0112.00 A R ENDOPT 0113.00 A TEXT(' 終了画面 ') 0114.00 A CSRLOC(LIN POS) 0115.00 A 1 33' データ入力の終了 ' 0116.00 A DSPATR(HI) 0117.00 A 3 4' 処理されたレコード数 ' 0118.00 A 30 DSPATR(ND) 0119.00 A 5 6' 追加 . . . . . :' 0120.00 A 30 DSPATR(ND) 0121.00 A ADDRCD 5Y 0O 5 35EDTCDE(1) 0122.00 A 30 DSPATR(ND) 0123.00 A 6 6' 変更 . . . . . :' 0124.00 A 30 DSPATR(ND) 0125.00 A CHGRCD 5Y 0O 6 35EDTCDE(1) 0126.00 A 30 DSPATR(ND) 0127.00 A 7 6' 削除 . . . . . :' 0128.00 A 30 DSPATR(ND) 0129.00 A DLTRCD 5Y 0O 7 35EDTCDE(1) 0130.00 A 30 DSPATR(ND) 0131.00 A 12 2' 選択項目を打鍵して,実行キーを押 + 0132.00 A してください。 ' 0133.00 A COLOR(BLU) 0134.00 A 14 5' データ入力の終了 . . . . . .' 0135.00 A ANS 1A B 14 39VALUES('Y' 'N') 0136.00 A 14 53'Y=YES, N=NO' 0137.00 A 23 2'F3= 終了 ' 0138.00 A COLOR(BLU) 0139.00 A 23 15'F12= 前画面 ' 0140.00 A COLOR(BLU) 0141.00 A LIN 3S 0H 0142.00 A POS 3S 0H
[解説]
これは拡張DFUによって自動的に生成されたDFUと同じ画面ソースである。
_
拡張DFUというのは㈱オフィスクアトロの新製品であってIBM DFUの機能を拡張した製品であり9月に発表セミナーを予定している。