データファイルのファイル削除やレコード削除を行う場合、 その都度 KILL命令 や CLFILE命令 を実行するよりも ラッパ関数を作って、それをコールする方がソース的にすっきりすると思います。
CLFILE命令の定義は以下の様です。
この関数は、"TEST.DAT"ファイルのレコード削除しかできない関数をラップしたものです。
FIELD命令はフィールド変数を固定でしか宣言できないのでこの様な感じになりました。 この部分を汎用性を持たせるのは少し大変なので、固定でもいいかなと思います。 方法が無いことは無いのですが、やはりFIELD命令がネックになります。
以下の関数は無理やり汎用性を持たせたCLFILE命令のラッパ関数です。
ファイルのフィールド数、各フィールド幅の取得を行う為に、 拡張関数の "FILE.FN3" を使用しています。
INF$の内容は以下の通りです。
=====
2016/04/02:の時の情報
■KILL命令のラッパ関数について
KILL命令の定義は以下の様です。
KILL <ファイル名> <ファイル名>:"[ドライブ名:]ファイル名[<S>]"の書式の文字列式 ("ファイル名"は"ファイル名称"+"."+"拡張子")KILL命令のラッパ関数は以下の様になります。
'--------------------------------------- 'ファイル削除(KILL命令のラップ) '--------------------------------------- 'Function GfKill%(Byval pstrFileName$) '引 数: ' pstrFileName$ :ファイル名 '--------------------------------------- Function GfKill%(Byval pstrFileName$) 'エラー処理宣言 On Error Goto GfKill.ErrProc '戻り値の初期化 GfKill% = GcFalse% '指定ファイル名の削除 KILL pstrFileName$ GfKill% = GcTrue% GfKill.Return '関数戻り On Error Goto 0 Exit Function '----- 'エラー処理 '----- GfKill.ErrProc Resume GfKill.Return End Functionエラー処理は何もしていませんが、ここでエラー内容などを表示するといいと思います。
■CLFILE命令のラッパ関数について
データファイルに書き込む関数を以下の様に定義します。 CLFILE命令の定義は以下の様です。
CLFILE [#]<ファイル番号> <ファイル番号>:1~16の値を返す数値式 (OPEN命令で指定したファイル番号を指定)CLFILE命令のラッパ関数は以下の様になります。
'--------------------------------------- 'ファイルレコード削除(CLFILE命令のラップ) '--------------------------------------- 'Function GfClFile%() '--------------------------------------- Function GfClFile% 'エラー処理宣言 On Error Goto GfClFile.ErrProc 'フィールドサイズ ' Const COL.CD% = 10 '上の関数[MfPutData%]で定義済み ' Const COL.NUM% = 26 '戻り値の初期化 GfClFile% = GcFalse% PRIVATE FILENO%, REC.CD$, REC.NUM$ 'TEST.DATファイルを、ファイル番号#1としてオープンします FILENO% = 1 OPEN GcTEST.DAT$ AS FILENO% RECORD 2147483647 FIELD #FILENO%, COL.CD% AS REC.CD$, COL.NUM% AS REC.NUM$ 'レコード削除 CLFILE #FILENO% GfClFile% = GcTrue% GfClFile.Return '関数戻り If FILENO% > 0 Then Close FILENO% Endif On Error Goto 0 Exit Function '----- 'エラー処理 '----- GfClFile.ErrProc Resume GfClFile.Return End Function
この関数は、"TEST.DAT"ファイルのレコード削除しかできない関数をラップしたものです。
FIELD命令はフィールド変数を固定でしか宣言できないのでこの様な感じになりました。 この部分を汎用性を持たせるのは少し大変なので、固定でもいいかなと思います。 方法が無いことは無いのですが、やはりFIELD命令がネックになります。
以下の関数は無理やり汎用性を持たせたCLFILE命令のラッパ関数です。
'--------------------------------------- 'ファイルレコード削除(CLFILE命令のラップ) '--------------------------------------- 'Function GfClFile2%(Byval pstrFileName$) '引 数: ' pstrFileName$ :ファイル名 '--------------------------------------- Function GfClFile2%(Byval pstrFile$) 'エラー処理宣言 On Error Goto GfClFile2.ErrProc '戻り値の初期化 GfClFile2% = GcFalse% 'ファイル情報提供関数(FILE.FN3)の利用 PRIVATE INF$, FieldNum%, I%, FSZ%(16) '40 文字分の領域を確保 INF$ = " " CALL "FILE.FN3" .fcInfGetF pstrFile$,INF$ FieldNum% = ASC(MID$(INF$, 22, 1)) ' フィールド数の獲得 FOR I% = 1 TO 16 '各フィールド幅の取得 FSZ%(I%) = ASC(MID$(INF$, 22 + I%, 1)) NEXT PRIVATE FILENO%, W$ '指定ファイルを、ファイル番号#1としてオープンします FILENO% = 1 OPEN pstrFile$ AS FILENO% RECORD 2147483647 'フィールド定義をフィールド数毎に分けて処理 SELECT FieldNum% CASE 1 FIELD #FILENO%, FSZ%(1) AS W$ CASE 2 FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$ CASE 3 FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$, FSZ%(3) AS W$ CASE 4 FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$, FSZ%(3) AS W$, FSZ%(4) AS W$ CASE 5 FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$, FSZ%(3) AS W$, FSZ%(4) AS W$, FSZ%(5) AS W$ CASE 6 FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$, FSZ%(3) AS W$, FSZ%(4) AS W$, FSZ%(5) AS W$, FSZ%(6) AS W$ '....(この後必要な分作成???) END SELECT 'レコード削除 CLFILE #FILENO% GfClFile2% = GcTrue% GfClFile2.Return '関数戻り If FILENO% > 0 Then Close FILENO% Endif On Error Goto 0 Exit Function '----- 'エラー処理 '----- GfClFile2.ErrProc Resume GfClFile2.Return End Function
ファイルのフィールド数、各フィールド幅の取得を行う為に、 拡張関数の "FILE.FN3" を使用しています。
CALL "FILE.FN3" .fcInfGetF FILENAME$, INF$ FILENAME$:ファイル名 INF$:ファイル情報が返される(40 文字、または、ヌル文字) (必ず40 バイト以上の領域を確保しておく)
INF$の内容は以下の通りです。
位置 | 文字数 | データ内容 | 値 |
---|---|---|---|
1 | 12 | ファイル名 | 文字列 |
13 | 2 | (システムリザーブ) | - |
15 | 2 | 最大レコード数 | 1~32767 |
17 | 2 | レコード数 | 1~32767 |
19 | 2 | 1クラスタあたりのレコード数 | 0 |
21 | 1 | レコード長 | 1~255 |
22 | 1 | フィールド数 | 1~16 |
23 | 16 | 各フィールドのフィールド幅 | 1~254 |
39 | 2 | (システムリザーブ) | - |
=====
2016/04/02:の時の情報
PR
コメント