2

スタッフ、コース、および Training_Record というリンクされたテーブルを持つデータベースがあります。各スタッフ メンバーには、各コースと Training_Record テーブルの各エントリと同様に、数値の主キーがあります。スタッフとコースの Training_Record 参照レコードの Staff_ID と Course_ID。

スタッフメンバーまたはコースが追加されると、Training_Record (フィールド: Staff_ID、Course_ID、Date_Taken、Notes) にスタッフ、コースレコードが挿入されるため、スタッフメンバー 1 を追加すると、レコード (1,1,,,), (1,2 、、、) など、コース 8 を追加すると、(1,8,,,)、(2,8,,,) などのレコードが挿入されます。これは機能します。

次に、トレーニングを記録するフォームを作成します。ユーザーはコースを選択し、日付を入力して、リストボックスからスタッフ メンバーを選択します。VBAコードをトリガーする保存ボタンがあります。日付とコースはボックスから取得され、リストボックスをループして、選択したスタッフ メンバーを連結して文字列にします。これはすべて機能し、それを確認するメッセージ ボックスが表示されます。次に、更新 SQL クエリを実行して、Training_Record を更新する必要があります。

私が抱えている問題は、SQL の更新に関するものです。SQL クエリ エディターで機能する更新クエリがありますが、変数で記述されています。

UPDATE Training_Record
SET Date_Taken = '12/12/12'
WHERE Staff_ID IN (1,2,3,4,5) AND Course_ID = 4

これにより Training_Record が更新され、スタッフ 1、2、3、4、および 5 が 12/12/12 にコース 4 を受講したことが示されます。ただし、VBA ではこれは機能しません。これは、VBA での私の SQL クエリです。

strSQL = "UPDATE Training_Record" _
       & "SET Date_Taken = (" & strDate & ")" _
       & "WHERE Staff_ID IN (" & strCriteria & ") AND Course_ID = (" & strCourse & ")"

DoCmd.RunSQL strSQL

コードが生成するエラーは、「実行時エラー '3144': UPDATE ステートメントの構文エラー」です。デバッガーは、クエリに続く DoCmd.RunSQL ステートメントを強調表示します。VBA コード全体:

Private Sub SaveTraining_Click()

Dim db As DAO.Database
Dim VarItem As Variant
Dim strCriteria As String
Dim strDate As Variant
Dim strCourse As Variant
Dim strSQL As String

Set db = CurrentDb()

'Extract the course ID and the training date from the form
strCourse = Me!CourseID.Value
strDate = Me!TrainingDate.Value

'Dealing with empty boxes- zero length
If IsNull(strCourse) Then
    MsgBox "Please select a course." _
        , vbOKOnly, "No course selected"
End If

If IsNull(strDate) Then
    MsgBox "Please enter a date." _
        , vbOKOnly, "No date given"
End If

If StaffMembers.ItemsSelected.Count = 0 Then
    MsgBox "Please select staff members." _
        , vbOKOnly, "No staff members"
End If

If (Not IsNull(strCourse)) And (Not IsNull(strDate)) And (StaffMembers.ItemsSelected.Count > 0) Then

    'Extract each selected member and concatenate into a string for sql query

    For Each VarItem In Me!StaffMembers.ItemsSelected
        strCriteria = strCriteria & "," & Me!StaffMembers.ItemData(VarItem)
    Next VarItem

    'Gets rid of extra comma on query string
    strCriteria = Right(strCriteria, Len(strCriteria) - 1)

    'Message box
    MsgBox ("Staff: " & strCriteria & vbNewLine & "Date: " & strDate & vbNewLine & "Course: " & strCourse & vbNewLine & "No. Selected staff: " & StaffMembers.ItemsSelected.Count)

    strSQL = "UPDATE Training_Record" _
           & "SET Date_Taken = (" & strDate & ")" _
           & "WHERE Staff_ID IN (" & strCriteria & ") AND Course_ID = (" & strCourse & ")"

    DoCmd.RunSQL strSQL

End If

Set db = Nothing

End Sub

TL;DR VBA で SQL UPDATE クエリを実行できません

どこかで構文エラーのような気がするのですが、どこかわかりません。アイデアやアドバイスをいただければ幸いです。

4

2 に答える 2

2

行末のスペースが足りないだけだと思います

あなたは古いクエリを印刷します

UPDATE Training_RecordSET Date_Taken = ()WHERE Staff_ID IN () AND Course_ID = ()

ご覧のとおり、キーワードの前に名前の衝突がありSETWHERE

したがって、あなたstrSQLをに変更してください

strSQL = "UPDATE Training_Record " _
       & "SET Date_Taken = (" & strDate & ") " _
       & "WHERE Staff_ID IN (" & strCriteria & ") AND Course_ID = (" & strCourse & ")"

(値が提供されていない)として出力されます

UPDATE Training_Record SET Date_Taken = () WHERE Staff_ID IN () AND Course_ID = () 

SQL構文に関してはどちらが正しいですか

私があなただったら、Training_Recordテーブルの列のデータ型もチェックします

通常 (これは Type-mismatch error に適用されます)、

日付の場合、変数または値を両側でラップします#

& "SET Date_Taken = (#" & strDate & "#) ...

文字列には一重引用符を使用します'

WHERE Operator_Name = ('" & operName & "') ...

数値の場合、正しいデータ型を提供するためにキャストする以外は何も使用する必要はありません

于 2013-08-21T12:51:40.000 に答える
0

私の推測:

strSQL = "UPDATE Training_Record" _
       & "SET Date_Taken = (#" & Format(strDate, "mm\/dd\/yyyy") & "#)" _
       & "WHERE Staff_ID IN (" & strCriteria & ") AND Course_ID = (" & strCourse & ")"

staff_ID が文字列の場合:

strSQL = "UPDATE Training_Record" _
       & "SET Date_Taken = (#" & Format(strDate, "mm\/dd\/yyyy") & "#)" _
       & "WHERE Staff_ID IN ('" & strCriteria & "') AND Course_ID = (" & strCourse & ")"
于 2013-08-21T12:27:38.527 に答える