2016-06-08 7 views
1

Ich erhalte einen Fehler "Datentyp Mismatch in Kriterien Ausdruck" jedes Mal auf einem Formular, das ich in meiner Datenbank mit kaskadierenden Comboboxen aus zwei verschiedenen Tabellen eingerichtet: tblUnits und tblProjects. Die erste Combobox (cboUnit) wählt die entsprechende UnitID aus tblUnits aus, während die zweite (cboProject) Optionen auf ProjectIDs auf die ausgewählte UnitID beschränkt.Nicht übereinstimmender Datentyp in Kriterien Ausdruck Fehler in Cascading Combobox

RowSource für cboUnit:

SELECT [tblUnits].ID, [tblUnits].Unit FROM tblUnits ORDER BY [Unit]; 

Und hier ist der Code für die After-Update:

Private Sub cboUnit_AfterUpdate() 
    On Error Resume Next 
    cboProject.RowSource = "Select tblProjects.ID " & _ 
          "FROM tblProjects " & _ 
          "WHERE tblProjects.UnitID = '" & cboUnit.Value & _ 
          "ORDER BY tblProjects.ID;" 

Die ProjectID und UnitID Felder in der Zieltabelle sind numerisch sind aber nicht Felder Nachschlag, und das gebundene Spalten sind korrekt. Ich verstehe nicht, warum ich das Kriteriums-Mismatch auch dann bekomme, wenn ich mich streng mit den Fremdschlüsseln befasse.

+1

das Zitat in der WHERE-Klausel muss gelöscht werden und vor 'ORDER' wird ein Leerzeichen benötigt! Überprüfen Sie mit 'debug.print cboUnit.Value 'ob' cboUnit' an 'UnitID' gebunden ist. – BitAccesser

+0

Vielen Dank! Habe das gerade erwischt. – sockpuppetmonkey

Antwort

4

Christopher erklärt, wie der Fehler aus der SELECT Anweisung zur Heilung der Code erstellt.

Allerdings glaube ich nicht, dass Sie cboProject.RowSource jedes Mal ändern müssen, wenn der Benutzer einen Wert in cboUnit auswählt.

Es sollte einfacher sein, diese zu verwenden für cboProject.RowSource, und es nicht danach ändern:

SELECT p.ID FROM tblProjects AS p 
WHERE p.UnitID = [Forms]![YourFormNameHere]![cboUnit] 
ORDER BY p.ID; 

Dann alles, was Sie für cboUnitNach einem Update zu tun, müssen ist requery cboProject:

Private Sub cboUnit_AfterUpdate() 
    Me!cboProject.Requery 
+0

Perfekt, danke. – sockpuppetmonkey

1

Es sieht so aus, als hätten Sie ein verwaistes einfaches Zitat, in dem Sie den cboUnit-Wert löschen. Unter der Annahme, dass beide Felder sind automatische Nummerierung (oder lange Ints), löschen Sie einfach den Apostroph:

Private Sub cboUnit_AfterUpdate() 
On Error Resume Next 
cboProject.RowSource = "Select tblProjects.ID " & _ 
         "FROM tblProjects " & _ 
         "WHERE tblProjects.UnitID = " & cboUnit.Value & _ 
         " ORDER BY tblProjects.ID;"