データファイルの書き込み、読み込みの処理を行う場合、 その処理を行うそれぞれの場所で PUT命令 、 GET命令 を 行うのも冗長なので、通常は関数化してそれをコールします。
今回テストデータファイルとして以下の2個のフィールドを持つファイルを想定します。
・第1フィールド:コードデータ(16バイト)
・第2フィールド:数量データ(12バイト)
FIELD命令 は以下の様になります。
フィールド変数に値を設定するところで、 コードデータは右側に空白を付加してサイズ分のみ設定しています。 また、数値は文字列化後、左側にに空白を付加してサイズ分のみ設定しています。
レコード番号の指定が0の場合は、ファイルの最後尾に追加書込みし、 番号が呈されている場合はその番号で上書きします。
フィールド変数から値を返す変数に設定するところで、 GfTrim$ ユーザ関数で前後の空白を省いています。
レコード書込関数も読込関数もエラー処理では何もしていませんが、 エラー内容等を表示することも必要ではと思いますので、 実際のシステムで利用される方はご自身で追加してみて下さい。
尚、これらの関数を利用してテストしてみます。以下のソースにテスト処理を記述します。
このソースの実行結果は以下の図の様になります。
MfGetData%関数のコールをレコード番号を1から順次カウントアップして与えています。 実際のレコードが無くなった時点で戻り値としてGcFalse%が返ってくるので、 その時にWHILEループが終わります。
=====
2016/04/02:の時の情報
今回テストデータファイルとして以下の2個のフィールドを持つファイルを想定します。
・第1フィールド:コードデータ(16バイト)
・第2フィールド:数量データ(12バイト)
FIELD命令 は以下の様になります。
'フィールドサイズを定義 CONST COL.CD% = 16 'コード CONST COL.NUM% = 12 '数量 'フィールド変数 PRIVATE REC.CD$, REC.NUM$ 'フィールド定義 FIELD #1, COL.CD% AS REC.CD$, COL.NUM% AS REC.NUM$フィールドサイズをわざわざCONST命令で定義していますが、この後でこれを有効に使います。 フィールドサイズをどこかで定義しておけば、リテラルで FIELD命令 に記述するよりは ソースがわかりやすと思います。
■書き込み関数について
データファイルに書き込む関数を以下の様に定義します。 Const GcTEST.DAT$ = "TEST.DAT" '--------------------------------------- 'データ書込 '--------------------------------------- 'Function MfPutData%(Byval pstrCD$, Byval plngNum&, Byval plngRecNo&) '引 数: ' pstrCD$ :コード ' pdblVal$ :数量 ' plngRecNo& :レコードNO(0:レコード追加) '戻り値: ' MfPutData% :書込OK:GcTrue%, NG:GcFalse% '--------------------------------------- Function MfPutData%(Byval pstrCD$, Byval plngNum&, Byval plngRecNo&) 'エラー処理宣言 On Error Goto MfPutData.ErrProc 'フィールドサイズ Const COL.CD% = 16 Const COL.NUM% = 12 '戻り値の初期化 MfPutData% = GcFalse% PRIVATE FILENO%, REC.CD$, REC.NUM$ FILENO% = 0 'TEST.DATファイルを、ファイル番号#1としてオープンします FILENO% = 1 OPEN GcTEST.DAT$ AS FILENO% RECORD 2147483647 FIELD #FILENO%, COL.CD% AS REC.CD$, COL.NUM% AS REC.NUM$ 'フィールドへデータ設定 REC.CD$ = LEFT$(pstrCD$ + GfSpc$(COL.CD%), COL.CD%) '既定の桁数分スペースを付加 REC.NUM$ = RIGHT$(GfSpc$(COL.NUM%) + STR$(plngNum&), COL.NUM%) '既定の桁数分スペースを付加 If plngRecNo& = 0 Then 'レコードNOが0の場合,レコードの最後尾に追加 PUT FILENO% Else 'レコードNOが指定された場合,レコードの上書 PUT FILENO%, plngRecNo& Endif '正常を返す MfPutData% = GcTrue% MfPutData.Return '関数戻り If FILENO% > 0 Then Close FILENO% Endif On Error Goto 0 Exit Function '----- 'エラー処理 '----- MfPutData.ErrProc Resume MfPutData.Return End Function
フィールド変数に値を設定するところで、 コードデータは右側に空白を付加してサイズ分のみ設定しています。 また、数値は文字列化後、左側にに空白を付加してサイズ分のみ設定しています。
レコード番号の指定が0の場合は、ファイルの最後尾に追加書込みし、 番号が呈されている場合はその番号で上書きします。
■読み込み関数について
データファイルに書き込む関数を以下の様に定義します。 '--------------------------------------- 'データ読込 '--------------------------------------- 'Function MfGetData%(Byref pstrCD$, Byref plngNum&, Byval plngRecNo&) '引 数: ' pstrCD$ :コード ' pdblVal$ :数量 ' plngRecNo& :レコードNO '戻り値: ' MfGetData% :読込OK:GcTrue%, NG:GcFalse% '--------------------------------------- Function MfGetData%(Byref pstrCD$, Byref plngNum&, Byval plngRecNo&) 'エラー処理宣言 On Error Goto MfGetData.ErrProc 'フィールドサイズ ' Const COL.CD% = 10 '上の関数[MfPutData%]で定義済み ' Const COL.NUM% = 26 '戻り値の初期化 MfGetData% = GcFalse% PRIVATE FILENO%, REC.CD$, REC.NUM$ FILENO% = 0 'TEST.DATファイルを、ファイル番号#1としてオープンします FILENO% = 1 OPEN GcTEST.DAT$ AS FILENO% RECORD 2147483647 FIELD #FILENO%, COL.CD% AS REC.CD$, COL.NUM% AS REC.NUM$ '読込 GET FILENO%, plngRecNo& '値を返す pstrCD$ = GfTrim$(REC.CD$) 'コード plngNum& = VAL(GfTrim$(REC.NUM$)) '数量 '正常を返す MfGetData% = GcTrue% MfGetData.Return '関数戻り If FILENO% > 0 Then Close FILENO% Endif On Error Goto 0 Exit Function '----- 'エラー処理 '----- MfGetData.ErrProc Resume MfGetData.Return End Function
フィールド変数から値を返す変数に設定するところで、 GfTrim$ ユーザ関数で前後の空白を省いています。
レコード書込関数も読込関数もエラー処理では何もしていませんが、 エラー内容等を表示することも必要ではと思いますので、 実際のシステムで利用される方はご自身で追加してみて下さい。
尚、これらの関数を利用してテストしてみます。以下のソースにテスト処理を記述します。
SCREEN 1 '漢字モード LOCATE , , 2 'カーソルをブロック表示 '最初は書き込み処理の連続 PRIVATE W% W% = MfPutData%("CD0001", 100, 0) W% = MfPutData%("CD0002", 102, 0) W% = MfPutData%("CD0101", 201, 0) W% = MfPutData%("CD0201", 202, 0) W% = MfPutData%("CD1001", 500, 0) PRIVATE CD$, NUM&, REC% REC% = 1 W% = GcTrue% '読み込み処理をレコード番号1から順次行う WHILE W% = GcTrue% W% = MfGetData%(CD$, NUM&, REC%) IF W% = GcTrue% THEN PRINT CD$ + ":" + STR$(NUM&) END IF REC% = REC% + 1 WEND WAIT 0, &h01 'キー入力待ち END
このソースの実行結果は以下の図の様になります。
MfGetData%関数のコールをレコード番号を1から順次カウントアップして与えています。 実際のレコードが無くなった時点で戻り値としてGcFalse%が返ってくるので、 その時にWHILEループが終わります。
=====
2016/04/02:の時の情報
PR
コメント