2016-08-02 27 views
1

Ich habe Probleme bei der Vermeidung einer Fehlermeldung "Sie müssen einen Wert im Feld __ eingeben" in Access 2016. Ich habe drei Tabellen, Aufgaben, Benutzern und TaskAssignments, und eine geteilte Form, die wie folgt aussieht:So vermeiden Sie eine Fehlermeldung "Sie müssen einen Wert eingeben" in Access VBA

User Task Assigned? 

User1 Task1 True 
User1 Task2 False 
User1 Task3 True 
User2 Task1 False 
User2 Task2 False 
User2 Task3 True 
User3 Task1 True 
User3 Task2 True 
User3 Task3 True 

jede Aufgabe mehrere Benutzer zugeordnet werden kann, und jeder Benutzer auf mehrere Aufgaben zugewiesen. Ich möchte, dass in meinem Formular alle möglichen Werte angezeigt werden. Verwenden Sie dann ein Kontrollkästchen, damit ich auf diese Aufgabe klicken und einen Benutzer hinzufügen kann. Die TaskAssignments-Tabelle hat einen Primärschlüssel und eine eindeutige Integritätsbedingung sowohl für TaskID als auch für UserID.

Die Datenherkunft für meine Form ist eine Abfrage:

select x.UserName, x.TaskName, ta.is_assigned 
from (select * from Tasks, Users) x 
left join TaskAssignments ta on (ta.TaskID = x.TaskID and ta.UserID = x.UserID) 

ich ein auf Click-Ereignis haben, wenn ein Datensatz in TaskAssignments und entweder Aktualisierungen oder Einfügungen in TaskAssignments existiert überprüft. Wenn ich meine Abfragen debug.print und manuell ausführe, machen beide das, was erwartet wird. Wenn ich manuell einen Datensatz in meine TaskAssignments-Tabelle einfüge, verhält sich mein Formular wie erwartet. Wenn ich jedoch einen neuen Datensatz einfügen muss, erhalte ich eine Nachricht, dass ich eine TaskID in TaskAssignments eingeben muss.

Ich habe versucht, das Formular erneut abzufragen, aber ich erhalte immer noch die Fehlermeldung. Warum kann ich den Datensatz, den ich gerade eingefügt habe, nicht finden?

Hilfe bitte?!? Muss ich meinen Ansatz hier drastisch überdenken?

Hier ist die VBA:

Private Sub is_assigned_Click() 

Dim CurrentUser, AssignmentQuery As String, SelectedUserID, SelectedTaskID As Integer 
Dim ShouldInsert, IsAssigned As Boolean 

CurrentUser = Environ$("Username") 
SelectedUserID = Me.UserID 
SelectedTaskID = Me.TaskID 
IsAssigned = Me.is_assigned 

Dim db As DAO.Database, rs As DAO.Recordset, strSQL As String 
Set db = CurrentDb 
strSQL = "select UserID, taskID from TaskAssignments where UserID=" & SelectedUserID & " and taskID =" & SelectedTaskID & ";" 

Set rs = db.OpenRecordset(strSQL) 

If rs.EOF = True Then 
    ShouldInsert = True 
    Else: ShouldInsert = False 
End If 

If ShouldInsert = True Then 
    AssignmentQuery = "insert into TaskAssignments (UserID, taskID, DateAssignmentUpdated, AssignmentUpdatedBy, is_assigned) values " _ 
    & vbCrLf & "(" & SelectedUserID & "," & SelectedTaskID & ",#" & Now & "#,'" & CurrentUser & "'," & IsAssigned & ");" 

ElseIf ShouldInsert = False Then 
    AssignmentQuery = "update TaskAssignments set UserID=" & SelectedUserID & ", DateAssignmentUpdated=#" & Now & "#, AssignmentUpdatedBy='" & CurrentUser & "',is_assigned=" & IsAssigned _ 
    & vbCrLf & " where taskID = " & SelectedTaskID & " And UserID = " & SelectedUserID & ";" 
End If 

MsgBox AssignmentQuery 
db.Execute (AssignmentQuery) 

Forms("Task Assignments").Requery 

Set rs = Nothing 
Set db = Nothing 

End Sub 

bearbeiten - hier sind die Abfragen erzeugt:

Insert

insert into TaskAssignments 
(UserID, TaskID, DateAssignmentUpdated, AssignmentUpdatedBy, is_assigned) 
values (301,4,Now(),'mylogin',True); 

aktualisieren

update TaskAssignments 
set UserID=270, DateAssignmentUpdated=Now(), AssignmentUpdatedBy='mylogin', is_assigned=False 
where TaskID = 1 And UserID = 270; 

Und eine Einschränkung für meine TaskAssignments Tabelle. Sowohl TaskID als auch UserID werden in meinem Tabellendesign wie gewünscht gesetzt (was mein Ziel war - ich hatte gehofft zu vermeiden, Datensätze zu TaskAssignments hinzuzufügen, bis der Benutzer tatsächlich einer Aufgabe zugewiesen wurde).

alter table TaskAssignments add constraint TaskAssignmentsConstraint unique (TaskID, UserID); 
+0

Was kommt zurück, wenn Sie dB.RecordsAffected direkt nach dB.execute überprüfen. – dbmitch

+0

Woher erhalten Sie die Fehlermeldung? Welche Linie? Werden die Daten eingefügt? Passt die SQL-Datei zu Ihrem manuellen SQL-Aufwand? – dbmitch

+0

Erhalten Sie diese Nachricht, weil Sie über Eigenschaften auf Tabellenebene verfügen; "erforderlich: ja" und "Nulllänge zulassen: Nein"? – LiamH

Antwort

0

von falschen Datentypen Vorsicht, jeder Dim benötigt einen eigenen Datentyp!

Dim CurrentUser As String, AssignmentQuery As String 
Dim SelectedUserID As Long, SelectedTaskID As Long ' don't use 16-bit Integer for ID columns 
Dim ShouldInsert As Boolean, IsAssigned As Boolean 

Um Probleme mit Datum/Uhrzeit Formatierung zu vermeiden: der Datenbank-Engine kennt Now(), so dass Sie direkt dies im Insert SQL verwenden können:

AssignmentQuery = "insert into TaskAssignments (UserID, taskID, DateAssignmentUpdated, AssignmentUpdatedBy, is_assigned) values " _ 
& vbCrLf & "(" & SelectedUserID & "," & SelectedTaskID & ", Now(), '" & CurrentUser & "'," & IsAssigned & ");" 

Wenn es immer noch nicht funktioniert , verwenden Sie Debug.Print AssignmentQuery anstelle von MsgBox und fügen Sie Ihrer Frage das aktuelle SQL hinzu (Strg + G zeigt die Ausgabe an).


bearbeiten

Re-Lektüre die Frage und Kommentars, ich denke, das Problem ist:

Sie bearbeiten eine gebundene Form, und aktualisieren/in der gleichen Tabelle einfügen das Formular basiert auf. Das ist, wo der Write-Konflikt auf Update stammt, der andere Fehler ist wahrscheinlich, weil das gebundene Formular versucht, einen Datensatz einzufügen, wenn Sie auf is_assigned klicken, aber nicht können.

Also ja, Sie müssen Ihren Ansatz zumindest teilweise überdenken.

Eine Lösung besteht darin, die Recordsource in eine temporäre Tabelle einzufügen und das Formular darauf zu basieren. Dann wird der Rest des Codes wahrscheinlich funktionieren.

Es kann jedoch sein, Dinge zu komplizieren.

+0

Danke für das Feedback, ich habe das berücksichtigt und die Beschreibung aktualisiert. – randomname

+0

Danke. Siehe Bearbeiten. – Andre

+0

Eine temporäre Tabelle hat gut funktioniert, ich habe "select ... in" für meine Recordsource-Abfrage hinzugefügt und dann meine temporäre Tabelle als Recordsource des Formulars verwendet. Danke! – randomname