Ich habe ein Problem, das ich fühle ich bin nah an der Lösung, aber etwas fehlt. Ich habe ein ungebundenes Formular mit fünf Objekten.Access - Update-Abfrage von Formularwerten mit Multiselect Listbox VBA
"SSN" ist eine Standardtextbox. 'Terminstatus' ist ein Listenfeld mit aktivierter Mehrfachauswahl. Die Quelle ist eine Tabelle namens States. 'Carrier' ist eine Combobox. 'Terminstatus' ist eine Combobox. "Appt Anfragedatum" ist ein Datumsfeld.
Sobald Werte in allen fünf Objekten sind, habe ich eine Schaltfläche, die den Code unten ausführt. Ich möchte die Werte an eine Aktualisierungsabfrage übergeben, die als Kriterium verwendet wird.
Die Felder, die aktualisiert werden, sind 'Appointment Status' und 'Appt Request Date'. Die anderen Felder sollen die richtigen Datensätze auswählen.
Derzeit wird der Code ausgeführt, und die Aktualisierungsabfrage erhält die meisten Kriterien. Das einzige Feld, das nicht korrekt ausgefüllt wird, ist der "Terminstatus", von dem ich dachte, er würde von strCriteria ausgehen.
Wenn der Code ausgeführt wird, fordert er den Benutzer auf, den strCriteria-Wert aufzufüllen, wenn er aus der Listbox "Appointment States" abgerufen werden muss.
Ich habe den Code von einer Site gefunden, die erzählte, wie man die Werte aus einem Multiselect-Listenfeld ergreift und dann das SQL für eine Ein-Kriterien-Select-Abfrage erstellt. Ich habe versucht, es so gut wie möglich anzupassen. Der Hauptunterschied ist der SQL-Build. Wenn ich das Original verwende, funktioniert es.
Mein modifizierten Code die Update-Abfrage zu bedienen:
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
Der ursprüngliche Code:
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
Alle Ideen, wie ich dies richtig funktioniert bekommen?
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"
Staaten ist der Name der Tabelle, die Zustands Abkürzungen in sind, und die zweite Staaten ist der Feldname.
Ich habe versucht, Ihren Code einzufügen, aber es hat nicht funktioniert. Ich habe damit herumgewirbelt und strCriteria als "AL" oder "AZ" ausgegeben mit: 'If Me! [Appointment State] .ItemsSelected.Count> 0 Dann Für jede Variable in mir! [Appointment State] .ItemsSelected StrCriteria = StrCriteria & Chr (34) _ & Me [Termin State] .ItemData (varItem) & Chr (34) & "OR" Weiter varItem StrCriteria = links! (StrCriteria, Len (StrCriteria) - 3) Else strCriteria = "=" "" & Ich! [Verabredung] & Ende If' – CasWalker
Ich entschuldige mich für das Durcheinander, versuche herauszufinden, wie man Kommentare richtig formatiert ... Mit den Änderungen so weit Der Code wird ausgeführt und übergibt die Felder an die Abfragekriterien. Es gibt jedoch ein Problem, da die korrekte Anzahl der Zeilen nicht aktualisiert wird. Wenn ein Statuswert ausgewählt ist, scheint er die richtigen Datensätze zu ziehen. Wenn zwei verwendet werden, zieht es mehr Datensätze als es sein sollte. Ich nehme an, dass es etwas mit den Textfeldern zu tun hat, die keine Anführungszeichen haben? Ich bin mir nicht sicher, wie ich sie in ein Klammerfeld integrieren soll ... Ich habe ein paar verschiedene Methoden ausprobiert, aber jedes Mal ist ein Fehler aufgetreten. – CasWalker
Aktualisieren Sie Ihren Code und die daraus resultierenden Debugger, wenn Sie Änderungen vornehmen, damit wir sehen können, was passiert. Ich werde die strSQL-Anweisung mit doppelten Anführungszeichen in meiner letzten Antwort aktualisieren – dbmitch