我在避免 Access 2016 中的“您必须在 __ 字段中输入值”错误消息时遇到问题。我有三个表,任务、用户和任务分配,以及一个看起来像这样的拆分表单:
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
每个任务可以有多个用户分配给它,每个用户分配给多个任务。我希望我的表单显示所有可能的值,然后使用复选框,以便我可以单击并将用户添加到该任务。TaskAssignments 表在 TaskID 和 UserID 上都有一个主键和一个唯一约束。
我的表单的记录源是一个查询:
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)
我有一个单击事件,用于检查 TaskAssignments 中是否存在记录,并更新或插入 TaskAssignments。当我 debug.print 并手动运行我的查询时,它们都会执行预期的操作。当我手动将一条记录插入到我的 TaskAssignments 表中时,我的表单的行为符合我的预期。但是,当我需要插入新记录时,我会收到一条消息,指出我必须在 TaskAssignments 中输入一个 TaskID。
我尝试重新查询表单,但仍然收到错误消息。为什么它找不到我刚刚插入的记录?
请帮忙?!?我需要在这里彻底重新考虑我的方法吗?
这是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
编辑- 这里是产生的查询:
插入
insert into TaskAssignments
(UserID, TaskID, DateAssignmentUpdated, AssignmentUpdatedBy, is_assigned)
values (301,4,Now(),'mylogin',True);
更新
update TaskAssignments
set UserID=270, DateAssignmentUpdated=Now(), AssignmentUpdatedBy='mylogin', is_assigned=False
where TaskID = 1 And UserID = 270;
以及对我的 TaskAssignments 表的约束。TaskID 和 UserID 都是在我的表设计中根据需要设置的(这是我的全部目标 - 我希望避免将记录添加到 TaskAssignments,直到用户实际被分配到任务)。
alter table TaskAssignments add constraint TaskAssignmentsConstraint unique (TaskID, UserID);