RPG

360. SFLレコード出力RPG標準プロト・タイプ

SFLレコードの入出力業務もパターン化されるので
プロト・タイプのテンプレートを用意することができる。

[ AA_SFL :SFLレコード処理テンプレート]

ソースはこちらから

0001.00 H DFTNAME(AA_SFL) DATEDIT(*YMD/) BNDDIR('QC2LE')                      
0002.00 F********** AA_SFL *************************************************  
0003.00 FANS004FM  CF   E             WORKSTN                                 
0004.00 F                                     SFILE(SFREC01:RRN1)             
0005.00 F                                     INFDS(INFDS)                    
0006.00 FSQLFUNCOL IF A E           K DISK                                    
0007.00 F                                     EXTFILE(SQLFUN_LIB)             
0008.00 F*********************************************************************
0009.00                                                                       
0010.00  * CRTRPGMOD  OBJ(QTEMP/AA_SFL)   SRCFILE(R610SRC/QRPGLESRC)          
0011.00  * DBGVIEW(*SOURCE) AUT(*ALL)                                         
0012.00  * CRTPGM PGM(ASNET.COM/AA_SFL) MODULE(QTEMP/AA_SFL ACTGRP(*NEW)      
0013.00  *        AUT(*ALL)                                                   
0014.00                                                                       
0015.00  *-------------------------------------------------------------------*
0016.00  *  2017/05/01 : 作成                                                 
0017.00  *-------------------------------------------------------------------*
0018.00 D INFDS           DS                                                  
0019.00 D*( カーソル の行と桁の取り込み )                                         
0020.00 D  LINE                 370    371B 0                                 
0021.00 D*  TOPRRN: 今表示している サブ・ファイル の先頭の RRN                      
0022.00 D  TOPRRN               378    379B 0                                 
0023.00 D* BRRN : サブファイル の レコードNO ( 2 進数 )                               
0024.00 D  BRRN                 376    377B 0                            
0025.00                                                                  
0026.00  *( 作業変数 )                                                   
0027.00 D SQLFUN_LIB      S             21    INZ('QUSRTEMP/SQLFUNCOL')  
0028.00 D AR              S              1A   DIM(256)                   
0029.00 D N               S              4S 0                            
0030.00 D TRUE            S              1A   DIM(256)                   
0031.00 D TRUE#           S              4B 0 INZ(0)                     
0032.00 D FALSE#          S              4B 0 INZ(-1)                    
0033.00 D QUOT            C                   CONST(X'7D')               
0034.00 D OE              C                   CONST(X'0E')               
0035.00 D OF              C                   CONST(X'0F')               
0036.00 D NULL            C                   CONST(X'00')               
0037.00                                                                  
0038.00 D*( プログラム状況データ構造 )                                   
0039.00 D INFDS_THIS     SDS                                             
0040.00 D  PROC_NAM         *PROC                                        
0041.00 D  ROUTINE          *ROUTINE                                     
0042.00 D                              512A                              
0043.00 D  PGMINFO                1    512                               
0044.00 D  LINE_NUM              21     28                               
0045.00 D  CPFID                 40     46                               
0046.00 D  CPFDTA                91    170                               
0047.00 D  ERRMSGID              46     51                               
0048.00 D  CURUSR               358    367                                            
0049.00                                                                               
0050.00 D*( WORK 日付 YYMMDD データ 構造  )                                             
0051.00 D DATEDS          DS                                                          
0052.00 D  CENTURY                1      2  0 INZ(20)                                 
0053.00 D  YYMMDD                 3      8  0                                         
0054.00 D  YY                     3      4                                            
0055.00 D  MM                     5      6                                            
0056.00 D  DD                     7      8                                            
0057.00 D  CYY                    1      4                                            
0058.00                                                                               
0059.00 D* LIB名付きPGM名                                              *        
0060.00 D ANS005          C                   CONST('QTROBJ/ANS005')                  
0061.00                                                                               
0062.00 C*   : KEYをファイルにセット                                               
0063.00 C*--------------------------------------------------------------------------  
0064.00 C     USRKEY        KLIST                                                  |  
0065.00 C                   KFLD                    USER                           |  
0066.00 C*--------------------------------------------------------------------------  
0067.00 C                   EXSR      SFLCLR                                          
0068.00 C     SETKEY        SETLL     JUCHU                                           
0069.00 C*   : ファイルの読み取り                                                     
0070.00 C                   Z-ADD     1             TOPRRN                            
0071.00 C                   EXSR      READ                                            
0072.00 C                   Z-ADD     1             DSPREC                                     
0073.00 C*( サブ・ファイルの表示 )                                                             
0074.00 C*----------------------------------------------------+                                
0075.00 C     DSPLY         TAG                                                    |           
0076.00 C                   WRITE     DSPEND01                                     |           
0077.00 C                   SETON                                        4142      |SFL-DSPLY  
0078.00 C                   EXFMT     SFCTL01                                      |           
0079.00 C                   SETOFF                                       4142      |           
0080.00 C*----------------------------------------------------+                                
0081.00 C                   SETOFF                                       99                    
0082.00 C*( CF03 )- 終了                                                                       
0083.00 C     *IN03         IFEQ      *ON                                          CF03        
0084.00 C                   SETON                                        LR                    
0085.00 C   LR              RETURN                                                             
0086.00 C                   ENDIF                                                  CF03        
0087.00 C*( 実行キー )                                                                         
0088.00 C                   GOTO      DSPLY                                                    
0089.00 C                   RETURN                                                             
0090.00 C******************************************************                                
0091.00 C     *INZSR        BEGSR                                                              
0092.00 C******************************************************                                
0093.00 C*  初期 CYCLE のみの実行                                                              
0094.00 C                   ENDSR                                                              
0095.00 C******************************************************                                
0096.00 C     READ          BEGSR                                                      
0097.00 C******************************************************                        
0098.00 C*( データ・ベースの検索 )                                                     
0099.00 C*----------------------------------------------------+                        
0100.00 C     EQLKEY        KLIST                                                  |   
0101.00 C                   KFLD                    JUCNO                          |   
0102.00 C*----------------------------------------------------+                        
0103.00 C     RTNRED        TAG                                                        
0104.00 C*                                                                             
0105.00 C     TOPRRN        ADD       GYOSU         ENDRRN            4 0              
0106.00 C                   SUB       1             ENDRRN                             
0107.00 C*                                                                             
0108.00 C                   Z-ADD     TOPRRN        DSPREC                             
0109.00 C     TOPRRN        DO        ENDRRN        RRN1              4 0          READ
0110.00 C                   SETOFF                                       50            
0111.00 C     EQLKEY        READE     JUCHU                                  50        
0112.00 C   50              LEAVE                                                      
0113.00 C*( 行 NO に入れる )                                                           
0114.00 C                   MOVE      RRN1          GYO                                
0115.00 C*( サブファイル へ更新 )                                                           
0116.00 C*----------------------------------------------------+                        
0117.00 C                   WRITE     SFREC01                                      |   
0118.00 C*----------------------------------------------------+                        
0119.00 C     RRN1          IFEQ      TOPRRN                                           
0120.00 C                   MOVE      RRN1          DSPREC                                
0121.00 C                   ENDIF                                                         
0122.00 C                   END                                                    READ   
0123.00 C     REDEND        ENDSR                                                         
0124.00 C******************************************************                           
0125.00 C     SFLCLR        BEGSR                                                         
0126.00 C******************************************************                           
0127.00 C*( サブファイル の クリヤー )                                                             
0128.00 C*----------------------------------------------------+                           
0129.00 C                   SETON                                        44               
0130.00 C                   WRITE     SFCTL01                                             
0131.00 C                   SETOFF                                       44               
0132.00 C*----------------------------------------------------+                           
0133.00 C                   ENDSR                                                         
0134.00 C******************************************************                           
0135.00 C     SFLINZ        BEGSR                                                         
0136.00 C******************************************************                           
0137.00 C*( サブファイル の初期化 )                                                            
0138.00 C                   CLEAR                   SFREC01                               
0139.00 C                   EXSR      INZVAR                                        初期値
0140.00 C                   MOVE      HED001        JUCNO                                 
0141.00 C                   ENDSR                                                         


 

[解説]

たまにSFLクリヤーを行わないでいきなりSFLレコードを出力するプログラムを
見かけるがやはり最初にキチンとクリヤーしておきたい。
RPGプログラムはどう書こうが内部でシステムが相当な初期化をやってくれているので
動いてしまうが作法は守ったほうがトラブルは少なくなる。

SFLクリヤーと SFL初期化と混同しているすごいプログラムも見かけたことがある。
SFLクリヤーとは文字通りSFLファイルの内容を空、つまりカラッポの状態にすることである。

これに対してSFLINZつまり SFLの初期化というのはブランクのSFLレコードで
SFLファイルの内容を目一杯に埋めてしまうことを言う。
つまりSFLがブランク・レコードで満杯の状態にすることである。
するとSFLレコードの追加はできない。できるのはSFL更新か削除だけである。

あるユーザーのプログラムでSFLCLRは全く使わずSFLINZだけで押し通している
のがあった。
そうすると当然あちこちで不具合やつじつまの合わない現象で出てくる。
その度毎に逃げるための処置を行っていた。
恐らくはSFLINZの機能を理解していないからである。

RPGでは特殊な裏ワザを駆使しなければならないことはほとんどない。
いつも裏ワザを使っているとしたらそれは基本が間違っていると思って間違いない。
おかしいな? と思ったら自分のやり方を検討しなおして欲しい。

SFLINZ は機能としては用意されているが使わなければならない場面は
無い! と思ってほぼ間違いない。
機能としては提供されているが SFLINZを必要とする場面に出くわしたことは一度もない。

SFLCLRを使っていれば素直でパフォーマンスに優れたプログラムを開発することができる。

SFLINZは絶対に使わないこと。