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);
Was kommt zurück, wenn Sie dB.RecordsAffected direkt nach dB.execute überprüfen. – dbmitch
Woher erhalten Sie die Fehlermeldung? Welche Linie? Werden die Daten eingefügt? Passt die SQL-Datei zu Ihrem manuellen SQL-Aufwand? – dbmitch
Erhalten Sie diese Nachricht, weil Sie über Eigenschaften auf Tabellenebene verfügen; "erforderlich: ja" und "Nulllänge zulassen: Nein"? – LiamH