2

テキスト ボックスがフォーカスを失った後、アクセス時にフォームにデータを入力するときにイベントを作成しようとしています。ボックスが null でない場合、ID と値を別のテーブルに格納する必要があります。以下のコードを試してみると、「Runtime error 3061 Too few parameters Expected 1」が表示されます。デバッグ モードでチェックしたところ、値が引き継がれて文字列に取り込まれています。

Private Sub Consolidate_LostFocus()
Dim queryString As String
queryString = "INSERT INTO [ReportMasterTable]([#], [Notes]) VALUES(" & [#].Value & ", " &   [Consolidate].Value & ")"

If Consolidate.Text <> vbNullString Then

    CurrentDb.Execute (queryString)

End If
End Sub
4

2 に答える 2

3

#または のNotesフィールドのいずれかReportMasterTableがテキスト データ タイプの場合は、しようとする値を引用符で囲む必要がありますINSERT

たとえば、両方のフィールドがテキスト型の場合:

queryString = "INSERT INTO [ReportMasterTable]([#], [Notes])" & vbCrLf & _
    "VALUES ('" & [#].Value & "', '" & [Consolidate].Value & "')"

[#].Valueor[Consolidate].Valueに一重引用符が含まれている場合、状況はさらに複雑になります。挿入された値内の一重引用符を二重にすることができます。ただし、パラメータ化されたクエリに切り替える方が簡単かもしれません...引用の問題はなくなります。

Dim db As DAO.database
Dim qdf As DAO.QueryDef
Dim strInsert As String
strInsert = "PARAMETERS hash_sign Text (255), note_value Text (255);" & vbCrLf & _
    "INSERT INTO [ReportMasterTable]([#], [Notes])" & vbCrLf & _
    "VALUES (hash_sign, note_value)"
Set db = CurrentDb
Set qdf = db.CreateQueryDef("", strInsert)
qdf.Parameters("hash_sign").value = Me.[#]
qdf.Parameters("note_value").value = Me.[consolidate]
qdf.Execute dbFailOnError
Set qdf = Nothing
Set db = Nothing

プロシージャを実行するたびにステートメントを再構築する代わりに、SQL ステートメントを名前付きクエリとして保存し、それを開いて実行することもできます。

于 2013-01-25T20:33:17.113 に答える
1

フォームを ReportMasterTable にバインドしたくない理由はありますか?

# というコントロールとフィールドが本当にあるとしたら、大変なことになります。

フォームを ReportMasterTable にバインドし、クエリで更新する場合、問題が発生します。

フォーカス喪失イベントは、選択するのが非常に悪いイベントです。誰かがフォームをタブで移動するたびに、コードが実行されます。更新後の方が良いでしょう。

テキスト データ型を更新していますが、引用符を使用していません。

"INSERT INTO [ReportMasterTable]([#], [Notes]) VALUES(" & [#].Value _
    & ", '" &   [Consolidate].Value & "')"
于 2013-01-25T20:34:05.303 に答える