マスタデータファイルを検索する場合によく使われるバイナリサーチがあります。
バイナリサーチとは日本語では二分検索と言われるもので、
プログラマの方ならば説明の必要もないぐらい一般的なものだと思います。
前提条件として検索対象となるコードを、昇順ソートしてファイルに登録しておきます。
バイナリサーチでは最初に先頭レコード(左側)と最終レコード(右側)の中央に位置するコードが、 検索コードより大きいかまたは、小さいかを比較します。
中央のコードが大きい場合は、中央の位置を次の処理の右側とします。 また、中央のコードが小さい場合は、中央の位置を次の処理の左側とします。 再度、左側と右側の中央の位置を求めて、中央のコードと検索コードの比較を行います。
これを繰り返すことで領域を狭めていき最終的に目的のコードが見つかるまで行います。 (結果的に見つからない場合もありますが)
これらの一連の処理を BSEARCH.FN3 は行っています。
オープンされていないファイルのサーチもできるのですが、検索した結果、 対象のレコードデータを取得して何かの処理を行うのが普通だと思いますので、 オープン済みファイルが対象のものだけを扱います。
それではこれを使った検索の関数をテストデータファイルを例に使ったものが以下に様になります。
上記の検索関数の動作をテストするソースを以下に記します。
最初のテストデータの書き込みは、コードが重複せずに昇順に行っています。 このファイルはマスタデータとして考えていますので、コードの重複はあり得ません。
尚、ユーザ関数 MfPutData% は以下の記事にありますので、参照して下さい。
BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)
バイナリサーチの3番目まではレコードの内容を読めていますが、 4番目のコード"CD0005"はテストデータ書込みで行っていないのでレコードは検索できません。
このソースの実行結果は以下の図の様になります。
■関連記事
⇒BHT-BASIC:DENSOのハンディターミナルの開発言語のBHT-BASIC4.0を使ってみた
⇒BHT-BASIC4.0:変数宣言の書き方(BHT-1300)
⇒BHT-BASIC4.0:変数宣言の書き方その2(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数について(BHT-1300)
⇒BHT-BASIC4.0:演算子について(BHT-1300)
⇒BHT-BASIC4.0:画面への表示について(BHT-1300)
⇒BHT-BASIC4.0:キー入力について(BHT-1300)
⇒BHT-BASIC4.0:数値用キー入力関数(ユーザ定義関数)について(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数の値渡し・参照渡しについて(BHT-1300)
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数について
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその2
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその3
⇒BHT-BASIC4.0:TeraTermを使ってDENSOのハンディターミナルにファイル(プログラム)転送を行う方法
⇒BHT-BASIC4.0:I/OポートとWAIT、さらにTIMERについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)
⇒BHT-BASIC4.0:データファイルの検索について(SEARCH関数)
⇒BHT-BASIC4.0:ユーザ関数の引数の仮変数に対する代入の注意点
⇒BHT-BASIC4.0:データファイルの削除等について(KILL、CLFILEのラッパ関数)
⇒BHT-BASIC4.0:ファイルの存在確認関数を作ってみました
⇒BHT-BASIC4.0:拡張関数のサーチ処理関数(SEARCH.FN3)の使い方
⇒BHT-BASIC4.0:簡単なメニュー表示・選択を行うユーザ関数について
⇒BHT-BASIC4.0:ファイル伝送におけるXFILE命令の使い方
⇒BHT-BASIC4.0:バーコードの読込み(バーコードスキャン)について
⇒BHT-BASIC4.0:Bluetoothデバイスアドレス取得等について
⇒VB.NET:ハンディターミナル(BHT-1300等)とのデータファイルの送受信について
前提条件として検索対象となるコードを、昇順ソートしてファイルに登録しておきます。
バイナリサーチでは最初に先頭レコード(左側)と最終レコード(右側)の中央に位置するコードが、 検索コードより大きいかまたは、小さいかを比較します。
中央のコードが大きい場合は、中央の位置を次の処理の右側とします。 また、中央のコードが小さい場合は、中央の位置を次の処理の左側とします。 再度、左側と右側の中央の位置を求めて、中央のコードと検索コードの比較を行います。
これを繰り返すことで領域を狭めていき最終的に目的のコードが見つかるまで行います。 (結果的に見つからない場合もありますが)
これらの一連の処理を BSEARCH.FN3 は行っています。
■バイナリサーチ処理関数(BSEARCH.FN3)について
CALL "BSEARCH.FN3" .fcBSrcOp FILENO%, FIELDNO%, STRING$, RECORDNO
<引き数>
.fcBSrcOp: オープンされているファイルのバイナリサーチ指定
FILENO% : ファイル番号
FIELDNO%: フィールド番号
STRING$ : 検索文字列
FILENUM%: 検索ファイル数
<戻り値>
RECORDNO:検索結果(レコード番号)
・RECORDNO には、検索条件に一致するデータが見つかったレコード番号が返されます。
見つからなかった場合、0 が返されます。
・RECORDNO は、整数型の最大値(32767)を超える場合あるので、
変数に代入する場合、長整数型変数か実数型変数を推奨します
<引き数>
.fcBSrcOp: オープンされているファイルのバイナリサーチ指定
FILENO% : ファイル番号
FIELDNO%: フィールド番号
STRING$ : 検索文字列
FILENUM%: 検索ファイル数
<戻り値>
RECORDNO:検索結果(レコード番号)
・RECORDNO には、検索条件に一致するデータが見つかったレコード番号が返されます。
見つからなかった場合、0 が返されます。
・RECORDNO は、整数型の最大値(32767)を超える場合あるので、
変数に代入する場合、長整数型変数か実数型変数を推奨します
オープンされていないファイルのサーチもできるのですが、検索した結果、 対象のレコードデータを取得して何かの処理を行うのが普通だと思いますので、 オープン済みファイルが対象のものだけを扱います。
それではこれを使った検索の関数をテストデータファイルを例に使ったものが以下に様になります。
■検索関数の利用
上記の検索関数の動作をテストするソースを以下に記します。
最初のテストデータの書き込みは、コードが重複せずに昇順に行っています。 このファイルはマスタデータとして考えていますので、コードの重複はあり得ません。
尚、ユーザ関数 MfPutData% は以下の記事にありますので、参照して下さい。
BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)
バイナリサーチの3番目まではレコードの内容を読めていますが、 4番目のコード"CD0005"はテストデータ書込みで行っていないのでレコードは検索できません。
このソースの実行結果は以下の図の様になります。
【DENSO】ハンディターミナルBHT-1306BWB+USB通信ユニットCU-1321+ACアダプタAD2+標準バッテリBT-130L-C【送料無料・代引手数料無料】【02P05Nov16】 価格: 208,980円 |
■関連記事
⇒BHT-BASIC:DENSOのハンディターミナルの開発言語のBHT-BASIC4.0を使ってみた
⇒BHT-BASIC4.0:変数宣言の書き方(BHT-1300)
⇒BHT-BASIC4.0:変数宣言の書き方その2(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数について(BHT-1300)
⇒BHT-BASIC4.0:演算子について(BHT-1300)
⇒BHT-BASIC4.0:画面への表示について(BHT-1300)
⇒BHT-BASIC4.0:キー入力について(BHT-1300)
⇒BHT-BASIC4.0:数値用キー入力関数(ユーザ定義関数)について(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数の値渡し・参照渡しについて(BHT-1300)
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数について
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその2
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその3
⇒BHT-BASIC4.0:TeraTermを使ってDENSOのハンディターミナルにファイル(プログラム)転送を行う方法
⇒BHT-BASIC4.0:I/OポートとWAIT、さらにTIMERについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)
⇒BHT-BASIC4.0:データファイルの検索について(SEARCH関数)
⇒BHT-BASIC4.0:ユーザ関数の引数の仮変数に対する代入の注意点
⇒BHT-BASIC4.0:データファイルの削除等について(KILL、CLFILEのラッパ関数)
⇒BHT-BASIC4.0:ファイルの存在確認関数を作ってみました
⇒BHT-BASIC4.0:拡張関数のサーチ処理関数(SEARCH.FN3)の使い方
⇒BHT-BASIC4.0:簡単なメニュー表示・選択を行うユーザ関数について
⇒BHT-BASIC4.0:ファイル伝送におけるXFILE命令の使い方
⇒BHT-BASIC4.0:バーコードの読込み(バーコードスキャン)について
⇒BHT-BASIC4.0:Bluetoothデバイスアドレス取得等について
⇒VB.NET:ハンディターミナル(BHT-1300等)とのデータファイルの送受信について