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は絶対に使わないこと。
