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