2016-06-08 76 views
0

我有一個問題,我覺得我接近解決問題,但缺少一些東西。我有一個包含五個對象的未綁定表單。訪問 - 使用Multiselect Listbox更新表單值的查詢VBA

'SSN'是一個標準的文本框。 '約會狀態'是啓用了多選的列表框。源是一個名爲States的表。 'Carrier'是一個組合框。 '約會狀態'是一個組合框。 '應用程序請求日期'是一個日期字段。

一旦所有五個對象都有值,我有一個運行下面代碼的按鈕。我想將值傳遞給更新查詢以用作條件。

正在更新的字段是「約會狀態」和「應用程序請求日期」。其他字段是選擇正確的記錄。

當前代碼運行,並且更新查詢接收大部分條件。唯一沒有正確填充的字段是「約會狀態」,我認爲這會從strCriteria中獲得。

代碼運行時,它會要求用戶在需要從「約會狀態」列表框中拉出時填充strCriteria值。

我找到了一個網站的代碼,告訴如何從多選列表框中獲取值,然後爲一個標準選擇查詢創建SQL。我試圖儘可能地適應它。主要的區別是SQL構建。當我使用原件時,它可以工作。

我修改後的代碼運行更新查詢:

Private Sub Command35_Click() 

Dim db As DAO.Database 
Dim qdf As DAO.QueryDef 
Dim varItem As Variant 
Dim strCriteria As String 
Dim strSQL As String 
Set db = CurrentDb() 
Set qdf = db.QueryDefs("Appointment Update Query") 

If Me![Appointment State].ItemsSelected.Count > 0 Then 
    For Each varItem In Me![Appointment State].ItemsSelected 
    strCriteria = strCriteria & "States.States = " & Chr(34) _ 
        & Me![Appointment State].ItemData(varItem) & Chr(34) & " OR " 
    Next varItem 
    strCriteria = Left(strCriteria, Len(strCriteria) - 3) 
Else 
    strCriteria = "States.States Like '*'" 
End If 
strSQL = "UPDATE [Appointment Query]" _ 
& " SET [Appointment Query].[Appointment Status] = [Forms].[Appointment Update].[Appointment Status], [Appointment Query].[Appt Request Date] = [Forms]![Appointment Update].[Appt Request Date]" _ 
& " WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=" & strCriteria & ") AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier]));" 

qdf.SQL = strSQL 
qdf.Close 

DoCmd.OpenQuery "Appointment Update Query" 

Set db = Nothing 
Set qdf = Nothing 

End Sub 

原始代碼:

Private Sub cmdOK_Click() 
Dim db As DAO.Database 
Dim qdf As DAO.QueryDef 
Dim varItem As Variant 
Dim strCriteria As String 
Dim strSQL As String 
Set db = CurrentDb() 
Set qdf = db.QueryDefs("qryMultiSelect") 
If Me!lstRegions.ItemsSelected.Count > 0 Then 
    For Each varItem In Me!lstRegions.ItemsSelected 
    strCriteria = strCriteria & "tblData.Region = " & Chr(34) _ 
        & Me!lstRegions.ItemData(varItem) & Chr(34) & "OR " 
    Next varItem 
    strCriteria = Left(strCriteria, Len(strCriteria) - 3) 
Else 
    strCriteria = "tblData.Region Like '*'" 
End If 
strSQL = "SELECT * FROM tblData " & _ 
     "WHERE " & strCriteria & ";" 
qdf.SQL = strSQL 
DoCmd.OpenQuery "qryMultiSelect" 
Set db = Nothing 
Set qdf = Nothing 
End Sub 

我如何能得到這個正常工作任何想法?

Debug.Print STRSQL:

UPDATE [Appointment Query] SET [Appointment Query].[Appointment Status] = [Forms].[Appointment Update].[Appointment Status], [Appointment Query].[Appt Request Date] = [Forms]![Appointment Update].[Appt Request Date] WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=States.States = "AL" OR States.States = "AZ") AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier])); 

Debug.Print strCriteria:

States.States = "AL" OR States.States = "AZ" 

美國是表中的狀態縮寫的名字,第二個是國家的字段名。

回答

0

您應該向我們展示您的查詢中的SQL - 我無法看到您嘗試使用States.State的原因,因此我建議進行此更改,但現在很難提供比此更多的幫助

If Me![Appointment State].ItemsSelected.Count > 0 Then 
    strCriteria = "IN (" 
    For Each varItem In Me![Appointment State].ItemsSelected 
    strCriteria = strCriteria & Chr(34) _ 
        & Me![Appointment State].ItemData(varItem) & Chr(34) & "," 
    Next varItem 
    strCriteria = Left$(strCriteria, Len(strCriteria)-1) & ")" ' Remove last comma 
Else 
    strCriteria = "= """ & Me![Appointment State] & """" 
End If 

編輯:用雙引號

strSQL = "UPDATE [Appointment Query]" _ 
& " SET [Appointment Query].[Appointment Status] = [Forms].[Appointment Update].[Appointment Status], [Appointment Query].[Appt Request Date] = [Forms]![Appointment Update].[Appt Request Date]" _ 
& " WHERE ((([Appointment Query].SSN)=""" & [Forms]![Appointment Update].[SSN] & """) AND (([Appointment Query].[Appointment State]) " & strCriteria & _ 
") AND (([Appointment Query].Carrier)=""" & [Forms]![Appointment Update].[Carrier] & """));" 
+0

我試圖插入你的代碼,但它沒有奏效。我玩弄它,並得到它輸出strCriteria爲:「AL」或「AZ」與:如果我![約會狀態] .ItemsSelected.Count> 0然後 對於我的每個varItem![約會狀態] .ItemsSelected strCriteria = strCriteria&CHR(34)_ 與我[預約狀態] .ItemData(varItem)CHR(34)& 「OR」 接着varItem strCriteria =左!(strCriteria,LEN(strCriteria) - 3) Else strCriteria =「=」「」&Me![Appointment State]&「」「」 End If' – CasWalker

+0

我爲混亂的混亂道歉,試圖弄清楚如何正確格式化評論...隨着編輯到目前爲止代碼確實會運行並將字段傳遞給查詢條件。有一個問題,因爲它沒有更新正確的行數。如果選擇了一個狀態值,它似乎會拉出正確的記錄。如果使用了兩個,它會拉動比它應該更多的記錄。我假設它與沒有引號的文本字段有關?我不知道如何將它們與括號內的字段整合...我嘗試了幾種不同的方法,但每次都會拋出一個錯誤。 – CasWalker

+0

每當您進行更改時,請更新您的代碼和上面產生的調試信息,以便我們看到發生了什麼。我將在最後一個回答中用雙引號更新strSQL語句 – dbmitch

0

首先,您需要在SQL中的連接字符串之間有空格 - 我在SET和WHERE之前添加了一個空格。你有錯誤信息嗎?

你可以Debug.print strSQL嗎?

strSQL = "UPDATE [Appointment Query]" _ 
& " SET [Appointment Query].[Appointment Status] = [Forms].[Appointment Update].[Appointment Status], [Appointment Query].[Appt Request Date] = [Forms]![Appointment Update].[Appt Request Date]" _ 
& " WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=strCriteria) AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier]));" 

此外,它看起來像你在更新SQL之前不關閉qdf。

qdf.SQL = strSQL 
qdf.Close 
DoCmd.OpenQuery "Appointment Update Query" 

這也將打破與你如何建立strCriteria

(([Appointment Query].[Appointment State])=strCriteria) 

和查詢,如果您的任何個人字段是你將需要包裝他們逃脫文本字段雙引號

+0

更新SQL語句可以你Debug.Print strCriteria在使用它之前 - 並張貼在您的文章上方的編輯(做同樣與STRSQL ) – dbmitch

+0

我編輯了您建議的代碼並在上面的代碼中更新了它們。我添加了你所要求的debug.print。 – CasWalker

+0

開始 - 更改'&「或」'爲「&」或「' – dbmitch

0

我認爲它沒有使用變量strCriteria,你正在使用文字文本。

你現在有什麼:

"WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=strCriteria) AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier]));" 

要作爲查詢的一部分使用你所需要的變量內容逃生,就像這樣:

"WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=" & strCriteria & ") AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier]));" 

此外,作爲dbmitch注意到你可能需要在您的之前有空格。

+0

我改變了基於代碼根據你和dbmitch的建議。當我現在運行代碼時,它會要求我輸入States.States的參數。除此之外,我沒有收到任何實際的錯誤。 – CasWalker

+0

你可以做一個sql語句的debug.print嗎?也許看到要執行的查詢將有助於澄清事情。 –

+0

我已將它添加到問題的底部。 – CasWalker