2016-05-22 12 views
3

私はアクセスデータベースを使用して従業員情報を管理しています。検索ボックスを作成して従業員IDを入力すると、残りの情報が自動的に入力されるようにしたいと考えています。アクセスボックスに検索ボックスを作成

ボタンをクリックしたときに各列の値を取得して割り当てようとする機能を作成しましたが、機能しません。ここで

コードです:

Public Function GetEmployeeName() As ADODB.Recordset 
    Dim rst As ADODB.Recordset 
    Set GetEmployeeName = CurrentProject.Connection.Execute("select EmployeeName From EInfor where EmployeeID = " & txtEID.Value) 
End Function 

Private Sub btnSearch_Click() 
    txtEmployeeName = GetEmployeeName() 
End Sub 

答えて

1

GetEmployeeName()が与えられたEmployeeID一致するEmployeeNameを返すべきであるように私には思えます。その場合、Recordsetは必要ありません。 A DLookup式は必要なものを与えることができます。

Public Function GetEmployeeName(ByVal pEID As Long) As Variant 
    GetEmployeeName = DLookup("EmployeeName", "EInfor", "EmployeeID=" & pEID) 
End Function 

つまり関数は、パラメータとして目標EmployeeIDを供給するために期待し、それは、一つの特定のフォームのコントロールの値にハードワイヤードされていません。

一致するものが見つからない場合は、EmployeeNameがNullを返します。コマンドボタンのクリックイベントでは、Nz()を使用して、Nullに他のものを代入することができます。

Private Sub btnSearch_Click() 
    Me!txtEmployeeName.Value = Nz(GetEmployeeName(Me!txtEID.Value), "unknown") 
End Sub 
+0

非常に有用なアドバイスをいただきありがとうございます。 – Royy

0

あなたはデフォルトのプロパティFieldsを、持っているADODB.Recordsetを返すGetEmployeeName()に(Valueプロパティです)txtEmployeeNameのデフォルトのプロパティを設定しようコレクション。

これはおそらく動作しません。

が代わりにこれを試してみてください。そして、

"select * From EInfor where EmployeeID = " & CLng(txtEID.Value) 

そして:あなたは一度だけで、必要なすべての値を取得するために1つのSELECTステートメントを使用して検討すべき複数のテキストボックスを更新する場合

txtEmployeeName = GetEmployeeName().Fields(0) 

を次のようにテキストボックスを更新することができます:

txtEmployeeName = rst.Fields("EmployeeName") 
txtEmployeeBoss = rst.Fields("EmployeeBoss") 
txtEmployeeAddress = rst.Fields("EmployeeAddress") 
txtEmployeeSalary = rst.Fields("EmployeeSalary") 

注意次のように変更:

  • CLng()を使用して、私は唯一の数は、SQLコードに渡すことができることを確認しました(これはセキュリティ上の脆弱性で、例えばHow does the SQL injection from the "Bobby Tables" XKCD comic work?を参照してください)。
  • あなたが持っている2つの手順をマージしました。すべてをbtnSearch_Clickに入れてください。
0

入力時にレコードセットをフィルタリングするコンボボックスを作成できます。これは、あなたが探しているものに似ているが完全に一致しないレコードを探しているときに非常に便利です!

Alt + F11を押し、前に作成したフォームを右クリックします。下のスクリプトに貼り付けてください。

[![Option Compare Database 

Private Sub ComboSelect_Change() 

    ' You need to use String delimiters if you want to use a Text Field like: 
    ' Me.Filter "\[ATextFieldInRecordSource\] = """ & Me.FilterComboBox & """" 

    ' For a Numeric Field, use something like this: 
    ' Me.Filter "\[ANumericFieldInRecordSource\] = " & Me.FilterComboBox 
    ' Me.FilterOn = True 

    Me.\[Customer_Query subform1\].Form.Filter = "\[Company_Name\] Like '*" & 
        Replace(Me.ComboSelect.Text, "'", "''") & "*'" 
    Me.\[Customer_Query subform1\].Form.FilterOn = True 

End Sub][1]][1] 



Notice a few things: 
• The subform is named Customer_Query subform1’ 
• The combobox is named ComboSelect’ 
• Finally, the ‘like clause’ is used in combination with the wildcard character. 
• Like '*" & Replace(Me.ComboSelect.Text, "'", "''") & "*'" 

テキストをコンボボックスに入力すると、サブフォームの結果が動的に再クエリされます。

関連する問題