金融取引を記録する MS Access データベースがあります。frmDeposits
table に基づいたという名前のフォームがありますtblDep
。そのフォームのボタンの 1 つは、tblAccount
を使用して、現在のレコードから別のテーブルにデータを挿入するプロシージャを実行しますDoCmd.RunSql
。コードは次のようになります。
DoCmd.RunSQL "INSERT INTO tblAccount ([Date], CheckNo, Amount, Vendor, Cleared, Deposit, Printed, Misc) " _
& "SELECT [Date], CheckNo, Amount, Vendor, Cleared, " & ident & " AS Deposit, Printed, Misc " & _
& "FROM tblDep WHERE Form=" & formnum & ";"
formnum
変数は別の場所に設定され、フォーム内の現在のレコードを識別します。ident
変数は別の場所でも定義されています。
どういうわけか、コードの他の部分をデバッグする過程で、この SQL ステートメントの最後の行が消去され、次のようになりました。
DoCmd.RunSQL "INSERT INTO tblAccount ([Date], CheckNo, Amount, Vendor, Cleared, Deposit, Printed, Misc) " _
& "SELECT [Date], CheckNo, Amount, Vendor, Cleared, " & ident & " AS Deposit, Printed, Misc"
驚いたことに、フォームは正常に動作し続けました。この RunSQL ステートメントは、現在のレコードをfrmDeposits
取得して tblAccount テーブルに挿入していました。
私の質問は、なぜこれが機能するのですか? SELECT を含む SQL ステートメントには FROM 句が必要だと思いました。INSERT INTO ... VALUES を FROM なしで使用して単一のレコードを挿入できることは知っていますが、それでもフィールド名ではなく実際の値を指定する必要があります。
もう 1 つ気づいたこと: これは、フォームのモジュール内のコードでのみ機能するようです。SQL 文字列をクエリ デザインに貼り付けて実行するか、フォームの範囲外で同様のコードを実行すると、各フィールドに[パラメーター値を入力]ポップアップ ボックスが表示されます。VBA は SQL 文字列を事前に解析し、フォーム フィールドまたはテキスト ボックスをパラメータとして取得していますか? それとも、FROM をフォームの RecordSource にデフォルト設定していますか? SQL 文字列で参照されるすべてのフィールドのテキスト ボックスがフォーム上にあるわけではありませんが、それらはすべてフォームの基になるテーブルに存在します。
ところで、これは Access 2000 で実行されています。はい、古いバージョンであることはわかっていますが、それを使用する必要があります。
* *編集 - 1 つ追加されたメモ、この動作は DoCmd.RunSQL を使用する場合にのみ表示されます。同じ SQL 文字列を db.Execute に入れると、「パラメーターの数が間違っています」というエラーが返されます。