2014-02-26 99 views
1

我在Access 2010中有兩個文本框(輸入搜索條件的AIPIDTxt和顯示結果的AIPResultTxt)和一個按鈕(搜索按鈕)。我在Access中也有一個Table Table1。當我單擊搜索按鈕時,我需要執行一個查詢,其條件位於表單中的AIPIDTxt文本框中,將結果存儲在記錄集中,並將結果顯示在文本框AIPResultTxt中。所以我在按鈕事件處理程序中輸入了下面的VBA代碼。運行時錯誤3464:標準表達式中的數據類型不匹配

Private Sub SearchB_Click() 

Dim localConnection As ADODB.Connection 
Dim query As String 
Dim aipid_rs As ADODB.Recordset 
Dim db As Database 

Set db = CurrentDb 
Set localConnection = CurrentProject.AccessConnection 
MsgBox "Local Connection successful" 
query = "SELECT [AIP Name] FROM [Table1] WHERE [AIP ID]= 
" & [Forms]![AIPIDSearchF]![AIPIDTxt] & "" 
Set aipid_rs = db.OpenRecordset(query) 
Me.AIPResultTxt.Text = aipid_rs![AIP Name] 
End Sub 

但是,當我按一下按鈕我得到本地連接成功的消息框,然後運行時錯誤3464在行:

Set aipid_rs= db.OpenRecordset(query) 

...我已經尋找類似的錯誤,並作出更正。但錯誤不斷。我的查詢有問題嗎?無法找出錯誤。該表是本地表。所以我可以在vba中直接給查詢中的[Table1]和字段名稱。試圖添加分隔符,因爲這些字段是文本字段。但是這並沒有奏效。我也不能給出以下查詢:

query = "SELECT [AIP Name] FROM [Table1] WHERE [AIP ID]= " & [Forms]![AIPIDSearchF]! 
[AIPIDTxt].Text & "" 

這給了我一個運行時錯誤,指出文本不能從失去焦點的控件引用。我的標準是文本框中的文本。當我點擊按鈕時,文本框會失去焦點。但是當我搜索錯誤時,解決方案是刪除「.Text」。所以,我結束了上面的查詢。不知道什麼是錯行:

Set aipid_rs= db.OpenRecordset(query) 
+0

列「AIP_ID」的數據類型是什麼? – shahkalpesh

+0

@shahkalpesh:AIP ID是文本數據類型 –

+0

您需要在查詢值周圍加引號。 –

回答

0

您正在使用ADO記錄集,因此打開的語法不正確。下面應該爲你工作(除非你可能會得到一個錯誤設置文本如果控制不具有焦點...)

Dim localConnection As ADODB.Connection 
Dim query   As String 
Dim aipid_rs  As ADODB.Recordset 
Dim db    As Database 

Set db = CurrentDb 
Set localConnection = CurrentProject.AccessConnection 
MsgBox "Local Connection successful" 
query = "SELECT [AIP Name] FROM [Table1] WHERE [AIP ID]= '" & [Forms]![AIPIDSearchF]![AIPIDTxt] & "'" 
'Set aipid_rs = db.OpenRecordset(query) 
Set aipid_rs = New ADODB.Recordset 
aipid_rs.Open query, localConnection, adOpenStatic, adLockReadOnly 
If Not aipid_rs.EOF Then 
    Me.AIPResultTxt.Text = aipid_rs![AIP Name] 
Else 
    MsgBox "No records!!" 
End If 
aipid_rs.Close 
Set aipid_rs = Nothing 
localConnection.Close 
Set localConnection = Nothing 
db.Close 
Set db = Nothing 
2

我懷疑你有一個以上的問題的代碼。但Access只會抱怨它找到的第一個問題。在這兩條線再看看......

Dim aipid_rs As ADODB.Recordset 
Set aipid_rs = db.OpenRecordset(query) 

OpenRecordset是返回一個DAO記錄一個DAO方法。但是代碼嘗試將其分配給aipid_rs,該代碼被宣佈爲As ADODB.Recordset。這些記錄集類型不兼容。

有一個ADO連接對象變量,localConnection,稍後不會使用它。雖然它不會觸發錯誤,但它沒有用處。實際上,我沒有看到任何理由使用ADO中的任何內容來完成此任務。

我建議你試試這個版本的代碼......

'Dim localConnection As ADODB.Connection 
'Dim query As String ' query is a reserved word 
Dim strQuery As String 
'Dim aipid_rs As ADODB.Recordset 
Dim aipid_rs As DAO.Recordset 
Dim db As Database 

Set db = CurrentDb 
'Set localConnection = CurrentProject.AccessConnection 
'MsgBox "Local Connection successful" 
' you said [AIP ID] is text type, so include quotes around 
' the text box value 
strQuery = "SELECT [AIP Name] FROM [Table1] WHERE [AIP ID]= '" & _ 
    [Forms]![AIPIDSearchF]![AIPIDTxt] & "'" 
Debug.Print strQuery 
DoCmd.RunCommand acCmdDebugWindow 
Set aipid_rs = db.OpenRecordset(strQuery) 
'Me.AIPResultTxt.Text = aipid_rs![AIP Name] ' .Text property is only 
    ' available when control has focus; it will trigger 
    ' an error at any other time       
Me.AIPResultTxt.Value = aipid_rs![AIP Name] 

注意Debug.Print strQuery將顯示SELECT語句在即時窗口中的文本,並DoCmd.RunCommand acCmdDebugWindow打開立即窗口。如果查詢仍然存在問題,請複製語句文本並將其粘貼到新查詢的SQL視圖中以進行測試。

最後,我很好奇,這是否可能會給你你需要更少的代碼是什麼?

Private Sub SearchB_Click() 
    Me.AIPResultTxt.Value = DLookup("[AIP Name]", "Table1", _ 
     "[AIP ID]='" & Me.AIPIDTxt & "'") 
End Sub 
0

OK,所以我一直在尋找一個簡單的搜索元素很長一段時間... 我已經嘗試使用子窗體,我試過記錄集。所有這些都給了我信息。但不是我正在尋找的緊湊性,謝謝!

使用DOA stuf很棒,但不適合我的應用。使用 以上:

Me.AIPResultTxt.Value = DLookup("[AIP Name]", "Table1", _ "[AIP ID]='" & Me.AIPIDTxt & "'")

我的代碼,我一直在尋找... 得益於緊湊! T

相關問題