2016-06-08 6 views
0

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.

Antwort

0

Sie sollten uns die SQL aus Ihrer Abfrage zeigen - ich kann keinen Grund sehen, warum Sie versuchen, States.State zu verwenden, also schlage ich diese Änderung vor, aber es ist wirklich schwer, viel mehr als das jetzt zu helfen

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 

EDIT: Aktualisierte SQL-Anweisung mit doppelten Anführungszeichen

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

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

+0

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

+0

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

0

Zu Beginn benötigen Sie Leerzeichen zwischen Ihren verketteten Strings in SQL - ich habe nur ein Leerzeichen vor SET und WHERE hinzugefügt. Erhalten Sie eine Fehlermeldung?

Können Sie 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]));" 

Auch sieht es so aus, als ob Sie das qdf nicht schließen, bevor Sie das SQL aktualisieren.

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

Das wird auch die Abfrage brechen mit, wie Sie StrCriteria

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

Und wenn alle Ihre einzelnen Felder sind Textfelder, dass Sie sie gehen zu müssen, in entkommen wickeln doppelte Anführungszeichen

+0

können Sie Debug.Print StrCriteria, bevor Sie es benutzen - und per Post als bearbeiten in Ihrem Beitrag oben (tun gleiche mit strSQL) – dbmitch

+0

Ich habe die von Ihnen vorgeschlagenen Änderungen vorgenommen und sie im obigen Code aktualisiert. Ich habe die von Ihnen angeforderte debug.print hinzugefügt. – CasWalker

+0

Beginnen mit - Ändern '&" OR "' in '&" ODER "' – dbmitch

0

Ich denke, es hat etwas mit der Verwendung der Variablen strCriteria, verwenden Sie den wörtlichen Text.

Was haben Sie jetzt:

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

die Variablen Inhalte nutzen zu können, zu Flucht benötigen es als Teil Ihrer Abfrage, wie folgt aus:

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

Auch als dbmitch Sie bemerkt, Möglicherweise benötigen Sie einen Platz vor Ihrem WHERE.

+0

Ich habe den Code geändert auf Ihren und dbmitchs Rat. Wenn ich jetzt den Code ausführe, werde ich aufgefordert, die Parameter für States.States einzugeben. Ich bekomme keine anderen tatsächlichen Fehler. – CasWalker

+0

Können Sie eine debug.print der SQL-Anweisung tun? Vielleicht hilft es, wenn Sie die auszuführende Abfrage sehen. –

+0

Ich habe es am Ende der Frage hinzugefügt. – CasWalker