Access 2016 で「__ フィールドに値を入力する必要があります」というエラー メッセージが表示されないように問題が発生しています。Tasks、Users、および TaskAssignments の 3 つのテーブルと、次のような分割フォームがあります。
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);