忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)
データファイルの書き込み、読み込みの処理を行う場合、 その処理を行うそれぞれの場所で PUT命令  GET命令 を 行うのも冗長なので、通常は関数化してそれをコールします。

今回テストデータファイルとして以下の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

コメント

コメントを書く