如何避免在 Access VBA 中出现 "You must enter a value" 错误消息
How to avoid a "You must enter a value" error message in Access VBA
我在 Access 2016 中遇到了避免 "You must enter a value in the __ field" 错误消息的问题。我有三个 tables,Tasks、Users 和 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 table 有一个主键和对 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 table 时,我的表单表现出了我的预期。然而,当我需要插入一条新记录时,我收到一条消息,指出我必须在 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 的约束 table。在我的 table 设计中,TaskID 和 UserID 都是按要求设置的(这是我的全部目标 - 我希望在用户实际分配给任务之前避免向 TaskAssignments 添加记录)。
alter table TaskAssignments add constraint TaskAssignmentsConstraint unique (TaskID, UserID);
注意错误的数据类型,每个 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
为了避免 date/time 格式化的麻烦:数据库引擎知道 Now()
,所以你可以直接在 Insert 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 显示输出)。
编辑
重新阅读问题和评论,我认为问题是:
您正在编辑装订表单,并且 updating/inserting 与表单所基于的 table 相同。这就是更新时写入冲突的来源,另一个错误可能是因为当您单击 is_assigned
时,绑定表单试图插入一条记录,但不能。
所以是的,您需要重新考虑您的方法,至少是部分地。
一种解决方案是将记录源插入临时 table,并以此为基础创建表单。那么其余的代码可能会起作用。
不过,这可能会使事情过于复杂。
我在尝试更新曾经是我 table 中主要字段的字段时遇到了这个问题。当我更改被认为是主要字段的内容时,我假设访问会自动停止强制执行不为空,但由于某种原因它没有。
我通过删除字段、保存 table 重新创建字段并保存 table 来修复它,问题就消失了。当然,如果您不想丢失 table 中的数据,那么这不是一个理想的解决方案,因此您可能想先尝试备份它,然后再尝试解决方案,然后重新插入值。
我在 Access 2016 中遇到了避免 "You must enter a value in the __ field" 错误消息的问题。我有三个 tables,Tasks、Users 和 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 table 有一个主键和对 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 table 时,我的表单表现出了我的预期。然而,当我需要插入一条新记录时,我收到一条消息,指出我必须在 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 的约束 table。在我的 table 设计中,TaskID 和 UserID 都是按要求设置的(这是我的全部目标 - 我希望在用户实际分配给任务之前避免向 TaskAssignments 添加记录)。
alter table TaskAssignments add constraint TaskAssignmentsConstraint unique (TaskID, UserID);
注意错误的数据类型,每个 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
为了避免 date/time 格式化的麻烦:数据库引擎知道 Now()
,所以你可以直接在 Insert 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 显示输出)。
编辑
重新阅读问题和评论,我认为问题是:
您正在编辑装订表单,并且 updating/inserting 与表单所基于的 table 相同。这就是更新时写入冲突的来源,另一个错误可能是因为当您单击 is_assigned
时,绑定表单试图插入一条记录,但不能。
所以是的,您需要重新考虑您的方法,至少是部分地。
一种解决方案是将记录源插入临时 table,并以此为基础创建表单。那么其余的代码可能会起作用。
不过,这可能会使事情过于复杂。
我在尝试更新曾经是我 table 中主要字段的字段时遇到了这个问题。当我更改被认为是主要字段的内容时,我假设访问会自动停止强制执行不为空,但由于某种原因它没有。
我通过删除字段、保存 table 重新创建字段并保存 table 来修复它,问题就消失了。当然,如果您不想丢失 table 中的数据,那么这不是一个理想的解决方案,因此您可能想先尝试备份它,然后再尝试解决方案,然后重新插入值。