List 7-83 FormProductフォームのBTN_SEARCH_Clickプロシージャ


  1: Private Sub BTN_SEARCH_Click()
  2:     ' 検索する
  3:     Dim searchfield As Long
  4:     Dim order As ADODB.SearchDirectionEnum
  5:     Dim fieldname As String
  6:     Dim searchStr As String
  7:     Dim FindStr As String
  8:     Dim dateFlag As Boolean
  9:     
 10:     searchfield = COMBO_SEARCHFIELD.ListIndex
 11:     If searchfield = -1 Then
 12:         MsgBox "検索列が選択されていません", vbOKOnly, "検索エラー"
 13:         Exit Sub
 14:     End If
 15:     
 16:     ' ユーザーが選択した検索列に対応するColumnオブジェクトの番号を取得
 17:     searchfield = COMBO_SEARCHFIELD.ItemData(searchfield)
 18:     ' ユーザーが選択した検索列に対応するg_objRec変数が指す
 19:     ' ADODB.Recordsetオブジェクトに対応するフィールド名を取得する
 20:     fieldname = DGrid_Product.Columns(searchfield).DataField
 21:     
 22:     ' 検索方向の取得
 23:     If OPT_UP.Value = True Then
 24:         ' 上方向のサーチ
 25:         order = adSearchBackward
 26:     Else
 27:         ' 下方向のサーチ
 28:         order = adSearchForward
 29:     End If
 30:     
 31:     ' 検索文字列の取得
 32:     searchStr = TXT_SEARCH.Text
 33:     
 34:     ' 検索対象となるフィールドの型を調べる
 35:     ' ここでは,データベースエンジンとして
 36:     ' SQL Server 7.0もしくはMSDEのみを対象とする
 37:     Select Case g_objRec.Fields(fieldname).Type
 38:         Case adChar, adVarChar, adWChar, adVarWChar
 39:             ' 文字列である
 40:             ' like演算子による検索とする
 41:             FindStr = fieldname & " like " & "'" & searchStr & "*'"
 42:             dateFlag = False
 43:         Case adDBTimeStamp
 44:             ' 日付/時刻である
 45:             ' 入力された日付や時刻のフォーマットが正しいかどうかを調べる
 46:             If Not IsDate(searchStr) Then
 47:                 MsgBox "指定された検索文字列が正しい日付ではありません", _
                            vbOKOnly, "検索エラー"
 48:                 Exit Sub
 49:             End If
 50:             ' =演算子による検索とする
 51:             ' ここで日付の形式が正しくなるようFormatDateTime関数を使う
 52:             searchStr = FormatDateTime(searchStr)
 53:             If TimeValue(searchStr) <> 0 Then
 54:                 ' 時刻まで指定されているとき
 55:                 ' = 演算子で検索する
 56:                 FindStr = fieldname & " = " & "#" & searchStr & "#"
 57:                 dateFlag = False
 58:             Else
 59:                 ' 時刻は指定されていないとき
 60:                 ' >= 演算子で検索する
 61:                 FindStr = fieldname & " >= " & "#" & searchStr & "#"
 62:                 dateFlag = True
 63:             End If
 64:         Case Else
 65:             ' 数値と思われる
 66:             ' 入力された数値が正しいかどうかを調べる
 67:             If Not IsNumeric(searchStr) Then
 68:                 MsgBox "指定された検索文字列が正しい数値ではありません", _
                            vbOKOnly, "検索エラー"
 69:                 Exit Sub
 70:             End If
 71:             ' =演算子による検索とする
 72:             FindStr = fieldname & " = " & searchStr
 73:             dateFlag = False
 74:     End Select
 75:     
 76:     ' 検索する
 77:     ' On Error Resume Nextを使うのは,
 78:     ' ユーザーが異常な検索文字列を渡したとしても
 79:     ' エラーとしないようにするための処理
 80:     On Error Resume Next
 81:     
 82:     If dateFlag = False Then
 83:         ' 日付ではないときの検索
 84:         g_objRec.Find FindStr, 1, order
 85:     
 86:         If Err.NUMBER <> 0 Then
 87:             ' 何らかのエラーが発生した
 88:             MsgBox "指定された検索文字が不正です", vbOKOnly, _
                        "検索エラー"
 89:             Exit Sub
 90:         End If
 91:     Else
 92:         ' 日付であるときの検索
 93:         Do
 94:             g_objRec.Find FindStr, 1, order
 95:             If g_objRec.EOF Or g_objRec.BOF Then
 96:                 Exit Do
 97:             End If
 98:         Loop While g_objRec.Fields(fieldname).Value >= _
                            DateAdd("d", 1, searchStr)
 99:     End If
100:     
101:     If g_objRec.BOF Then
102:         ' BOFに達したということは,見つからなかったとき
103:         MsgBox "指定された値は見つかりませんでした", vbOKOnly, "検索"
104:         g_objRec.MoveFirst
105:     End If
106:     
107:     If g_objRec.EOF Then
108:         ' EOFに達したということは,見つからなかったとき
109:         MsgBox "指定された値は見つかりませんでした", vbOKOnly, "検索"
110:         g_objRec.MoveLast
111:     End If
112: End Sub