C400

146. C言語によるDSPF入出力

先に紹介したように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 #include                                                           
0002.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 DSPFn" );                               
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 DSPFn" );                               
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月に発表セミナーを予定している。