忍者ブログ

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

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

BHT-BASIC4.0:データファイルの取り扱いについて(BHT-1300)
ハンディスキャナのプログラムとして当然データを入力するわけですが、 何処に格納するかと言えば、やはりファイルとしてハンディスキャナの内部に書き込むことになります。

最近私が作成したシステムでは、パソコンとのデータは全てデータファイル(テキストファイル)で やり取りを行うことにしました。 出庫処理などでは、作成された指示データをパソコンからダウンロードし、 そのデータに従って出庫の作業を行います。 また、入庫処理では検品チェックを行い、ハンディに入庫処理データを登録します。 入庫処理では作業が終わった時点で、パソコンにアップロードし 後処理をパソコン側で行う様にしました。

パソコンとハンディターミナルを切り離して作業ができるので 既存のシステムにハンディターミナルのシステムを付加する場合には有効だと思います。

ハンディターミナルにはLAN接続できるものもありますので、 直接データベースにアクセスして処理を行うこともできますが、 今回は見送りました。

ファイルの操作は昔のBASICと同じように OPEN命令 でファイル番号を指定して オープン処理を行います。データの読み書きは GET/PUT命令 で必ずレコード単位で行います。 処理後は CLOSE命令 でファイルをクローズします。

ファイルの格納先は内部Flashメモリと外部のmicroSD カードがあります。 それぞれの制約は以下の通りです。
仕様項目内部メモリ(Flash)外部メモリ(microSD カード)
最大ファイル数 420個 FAT32準拠
フォルダ作成 不可 可能
ファイル名の使用可能文字 英数字のみ
英字は,大文字/小文字の区別無
英数字,文字,スペース,ピリオドと
22種類の特殊文字
ファイル名の長さ制限 ファイル名:1~8文字
拡張子:1~3文字
(ファイル名と拡張子をピリオドで繋ぐ
但し、拡張子が無い場合はピリオドは要らない)
255文字
(ドライブ名およびフォルダ名を含めた場合は、259文字)
ドライブ名 Aドライブ
Bドライブ
Dドライブ

データファイルのレコード、フィールドの制約は以下の通りです。
項目制約内容
最大レコード件数 2,147,483,647(2G)※BHT搭載メモリサイズに依存
最大レコード長(バイト) 65,535
フィールド変数サイズ(文字) 8192
フィールド個数(個) 254

■レコードについて

レコードとはデータファイルを読み書きする時の基本単位で、データ1件分のことです。 レコードは FIELD命令 でフォーマットを定義します。 1レコードの最大長は、各フィールドのサイズの合計です。

■フィールド定義について

FIELD命令 の定義は以下の様になっています。

FIELD [#]<ファイル番号>,<フィールド幅> AS <フィールド変数>
            [,<フィールド幅> AS <フィールド変数>・・・] 

 <ファイル番号>:1~16の値を返す数値式
      (OPEN命令で指定したファイル番号を指定)

 <フィールド幅>:1~8192 の値を返す数値式を指定
      (対応するフィールド変数の大きさ(バイト数)を指定)

 <フィールド変数>:文字型単純変数
      (FIELD命令の前に宣言されている変数を指定)

■OPEN命令について

説明が前後しますが OPEN命令 の定義は以下の様になっています。

OPEN <ファイル名> AS[#]<ファイル番号>[RECORD <ファイル長>]

 <ファイル名>:"[ドライブ名:]ファイル名[<S>]"の書式の文字列式      ("ファイル名"は"ファイル名称"+"."+"拡張子")      (<S>はフィールド末尾のスペース除去オプション       ドライブ名に"D:\"指定のみ)  <ファイル番号>:1~16の値を返す数値式  <ファイル長>:1~2147483647の数値型定数      (ファイルに登録できる最大レコード数を指定:未指定は1000個)

・同時にオープンできるのはバーコード、通信デバイスと合わせて16個までです。
・ファイル長は新規にファイルをオープンする時にしか機能せず、 既存のファイルをオープンする時には無視されます。

■CLOSE命令について

CLOSE命令 の定義は以下の様になっています。

CLOSE[[#]<ファイル番号>[,[#]<ファイル番号>...]]

 <ファイル番号>:1~16の値を返す数値式

・ファイル番号を省略するとオープン済みのファイルが全てクローズされます。
・クローズすればファイル番号は再利用可能です。
・オープンされていないファイル番号を指定しても、エラーは発生しません。

■PUT命令について

OPEN命令 CLOSE命令 はファイル操作の最初と最後の処理で、 実際にデータを書き込む命令としての PUT命令 があります。

PUT [#]<ファイル番号>[,<レコード番号>]

 <ファイル番号>:1~16の値を返す数値式
      (OPEN命令で指定したファイル番号を指定)

 <レコード番号>:1~2147483647の値を返す数値式
      (最小値:1、最大値:OPEN命令で指定した最大登録レコード数)

・レコードへの書込みは FIELD命令 で定義された、 フィールド変数を介して行われます。(PUTする前にフィールド変数へ値を設定します)
・レコード番号を省略すると、現在の最大レコード番号+1の位置にレコードが書き込まれます。
・レコード番号は順番通りに指定しなくても書込みはOKで、 飛ばしたレコード番号の位置のレコードには空白が設定されます。
・レコードはテキストデータ(ASCII文字列)しか扱えないので、 数値データは STR$関数 で文字列に変換してからフィールド変数に設定します。

■GET命令について

GET命令 の定義は以下の様になっています。

GET [#]<ファイル番号>[,<レコード番号>]

 <ファイル番号>:1~16の値を返す数値式
      (OPEN命令で指定したファイル番号を指定)

 <レコード番号>:1~2147483647の値を返す数値式
      (最小値:1、最大値:OPEN命令で指定した最大登録レコード数)

・ファイル番号で指定されたデータファイルから、 レコード番号で指定されたレコードを読み込み、フィールド変数にデータを設定します。
・レコードが1件もないと実行時エラーが発生します。
・レコード番号を省略したときは、1つ前のGET命令で読んだレコード番号+1の番号のレコードが読まれます。
 (最終レコードの次をGETすると実行時エラーが発生します。)
・レコード番号が最大レコード数より大きいと実行時エラーが発生します。

■各命令の順番について

データファイルを扱う命令は基本的に以下の様な順番で行います。

(1)フィールド変数の宣言
(2) OPEN命令 
(3) FIELD命令 
(4) PUT命令 
(5) GET命令 
(6) CLOSE命令 

実際はこの順番でなくても良くて、PUT命令しかなかったり、 GET命令だけの処理かもしれません。

以下の簡単なソースで例を示します。
	SCREEN 1				'漢字モード
	LOCATE , , 2			'カーソルをブロック表示
	
	'フィールド変数定義
	PRIVATE REC1$, REC2$, REC3$, REC4$
	'ファイル番号変数
	PRIVATE FILENO%
	'ファイル番号#1としてオープン
	FILENO% = 1
	OPEN "TEST.DAT" AS FILENO% RECORD 2147483647
	FIELD #FILENO%, 2 AS REC1$, 4 AS REC2$, 8 AS REC3$, 16 AS REC4$
	'フィールド変数に値設定
	REC1$ = "AB"
	REC2$ = "12345"	'文字列多目
	REC3$ = "CDEFG"	'文字列少な目
	REC4$ = "0123456789012345"
	'レコード書込み(先頭レコード)
	PUT #FILENO%, 1

	'フィールド変数クリア
	REC1$ = ""
	REC2$ = ""
	REC3$ = ""
	REC4$ = ""
	'レコード読込み
	GET #FILENO%, 1
	'ファイルクローズ
	CLOSE #FILENO%
	'フィールド変数の表示
	PRINT "1:[" + REC1$ + "]"
	PRINT "2:[" + REC2$ + "]"
	PRINT "3:[" + REC3$ + "]"
	PRINT "4:[" + REC4$ + "]"
	
	WAIT 0, &h01 'キー入力待ち
	END	

このソースの実行結果は以下の図の様になります。

フィールド変数REC2$には文字列を多目に設定していますが、 あふれた分は無視されていることが分かります。
また、REC3$には文字列を少な目に設定しましたが、 GETした結果は同じ文字列が返ってきました。 データファイルの中身には足りない分には空白が入っているようですが、 実際に読みだすと削除されてくるようです。
もし空白も読み出したいのであれば、REC3$の設定で後ろの方に空白文字列を付加する必要があります。


=====
2016/04/02:の時の情報











PR

コメント

コメントを書く