2

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);
4

2 に答える 2

1

間違ったデータ型に注意してください。それぞれ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()ため、これを 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 で出力が表示されます)。


編集

質問とコメントを読み直して、問題は次のとおりだと思います。

バインドされたフォームを編集しており、フォームの基になっている同じテーブルで更新/挿入しています。それが更新時の書き込み競合の原因です。他のエラーはおそらく、クリックしたときにバインドされたフォームがレコードを挿入しようとしているis_assignedが、できないためです。

そうです、少なくとも部分的には、アプローチを再考する必要があります。

1 つの解決策は、レコードソースを一時テーブルに挿入し、それに基づいてフォームを作成することです。その後、残りのコードはおそらく機能します。

ただし、物事を複雑にしすぎている可能性があります。

于 2016-08-03T09:43:21.080 に答える