BHT:TOP

検索(search)

ファイル検索について


basic 構文で表現する場合

拡張関数:SEARCH.FN3 を使用する場合

拡張関数は、BHTの機器内に組み込まれています。※機種によっては別途購入が必要です。

使用方法:
CALL "SEARCH.FN3" .fcAndSrch SRC.FILENO%, SRC.RSTART, SRC.Fl.Len, SRC.RECORD, SRC.Fl.Ref$(), SRC.FL.REFCNT%

※この関数は、検索方法である第一引数以外は実数ではなく変数で指定する必要があります。
検索開始行のRSTART%なんてほぼ「1」を指定するのでそのまま書いたら、エラーになります。

引数数値指定備考
.fcAndSrch
(検索方法)
1 : AND(検索行番号取得)
2 : OR(検索行番号取得)
11 : AND(検索件数取得)
12:OR(検索件数取得)
.fcAndSrch
.fcOrSrch
.fcAndSrchN
.fcOrSrchN
FILENO%
(ファイル番号)
-Openしたファイル番号
RSTART%
(検索開始行番号)
-ファイルの何行目から検索するかを指定
だいたい「1」でしょう。
REND%
(検索終了行番号)
-ファイルの何行目まで検索するかを指定
ファイル全体の検索であれば
LOF(#ファイル番号)で最終行を取得し、これをセットします
RECORD%
(戻り値格納変数)
--
SRC.Fl.Ref$()
(検索条件)
-複数条件を指定したい場合は事前に変数を配列分準備する。
SRC.Fl.Ref$(0) = 条件
SRC.Fl.Ref$(1) = 条件

※条件の記入方法については以下参照
SRC.FL.REFCNT%
(検索条件数)
-検索条件数を指定します。
検索条件で3つ指定してもここの数字を2にすると
3つ目の条件が無視されます。

検索条件記入方法

使用方法例:SRC.Fl.Ref$(0) = CHR$(0) + CHR$(1) + ID$

内容
1桁目0
1
2
3
4
5
= (等しい)
!= (等しくない)
< (検索値より大きい)
> (検索値より小さい)
>= (検索値以上)
<= (検索値以下)
2桁目検索フィールドフィールド番号を指定します
3桁目以降検索文字列


上記までをもとに、以下に検索例を表示します。
下図のような6桁の社員番号15桁の指名フィールドで構成された『SYAINM.MST』という名前のマスターファイル内の検索です。
社員番号をもとに名前を取得します。

SYAINM.MSTSYAINM.FLD
fields 6 15

例:

 1: '変数定義
 2: private SRC.FILENO% : SRC.FILENO% = 1       'ファイル番号
 3: private SRC.RSTART : SRC.RSTART = 1         '開始行
 4: private SRC.Fl.Len                          '最終行
 5: private SRC.Fl.Ref$(1)                      '検索条件
 6: private SRC.FL.REFCNT% : SRC.FL.REFCNT% = 1 '検索条件数
 7:
 8: 'SYAINM.MSTファイルを、ファイル番号#1としてオープンします
 9: Open "SYAINM.MST" as #1 RECORD 2147483647
10: 
11: 'オープンしたファイルのフィールド定義を指定します
12: '以下はフィールド1が6桁、フィールド2が15桁です
13: FIELD #1, 6 as SRC.FL.VAL1$, 15 as SRC.FL.VAL2$
14: 
15: 'ファイルサイズ(最終行番号)を取得します
16: SRC.Fl.Len =  LOF(#1)
17: 
18: '検索条件を指定します
19: '変数ID$には何かしらの方法で社員番号が取得済とします。
20: SRC.Fl.Ref$(0) = CHR$(0) + CHR$(1) + ID$
21: 
22: '検索関数 [SEARCH.FN3] の使用
23: CALL "SEARCH.FN3" 1 SRC.FILENO%, SRC.RSTART, SRC.Fl.Len, SRC.RECORD, SRC.Fl.Ref$(), SRC.FL.REFCNT%
24:
25: '検索結果の分岐
26: 検索件数が0の場合
27: IF SRC.RECORD = 0 then
28:     ' エラー時の処理を書く
29: Else
30:     検索結果が取得できた場合
31:     ' 取得した行番号のレコードを取得します
32:     ' この時、6行目のフィールド指定した変数にそれぞれ代入されます
33:     get #1, SRC.RECORD
34:     ' 取得したレコードの第二フィールドを変数Name$に代入します
35:     Name$ = SRC.FL.VAL2$
36: End If
37: 
38: 'ファイルをクローズします
39: Close #1