我遇到了避免"你必须在__字段中输入值的问题" Access 2016中的错误消息。我有三个表,任务,用户和TaskAssignments,以及如下所示的拆分表单:
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)
我有一个on click事件,用于检查TaskAssignments中是否存在记录,并更新或插入TaskAssignments。当我调试.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);
答案 0 :(得分:0)
请注意错误的数据类型,每个Dim
都需要自己的数据类型!
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
为了避免日期/时间格式的麻烦:数据库引擎知道Now()
,因此您可以在插入SQL中直接使用它:
AssignmentQuery = "insert into TaskAssignments (UserID, taskID, DateAssignmentUpdated, AssignmentUpdatedBy, is_assigned) values " _
& vbCrLf & "(" & SelectedUserID & "," & SelectedTaskID & ", Now(), '" & CurrentUser & "'," & IsAssigned & ");"
如果仍然无效,请使用Debug.Print AssignmentQuery
代替MsgBox
并将实际的SQL添加到您的问题中(Ctrl + G显示输出)。
修改强>
重新阅读问题和评论,我认为问题是:
您正在编辑绑定表单,并且正在更新/插入表单所基于的同一个表中。这就是Update上的Write冲突来自的地方,另一个错误可能是因为绑定的表单在您单击is_assigned
时尝试插入记录,但不能。
所以是的,你需要重新考虑你的方法,至少部分。
一种解决方案是将记录源插入临时表,并将表单基于该表。然后剩下的代码可能会工作。
但是,这可能过于复杂了。答案 1 :(得分:0)
我在尝试更新用作表格中主要字段的字段时出现此问题。当我改变被认为是主要字段的内容时,我认为访问会自动停止执行不是空的,但由于某种原因它没有。
我通过删除字段来修复它,保存表重新创建字段并保存表格,问题就消失了。当然,如果您在该表中有数据而不想丢失,那么这将不是一个理想的解决方案,因此您可能需要首先尝试备份,然后再尝试解决方案,然后重新插入值。