3

金融取引を記録する MS Access データベースがあります。frmDepositstable に基づいたという名前のフォームがあります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 に入れると、「パラメーターの数が間違っています」というエラーが返されます。

4

1 に答える 1

2

Access アプリケーションには、VBA コードが 2 つの形式で存在します。そしてコンパイルされた「pコード」。おそらく、ソース コード テキストのその部分が失われたときに、保存された p-code が変更されなかったことが原因です。IOW、欠落しているFROM句の記号がまだ含まれています。

あなたの状況では、私は破損を疑い、コンパイルされたコードをクリーンアップするために逆コンパイルを実行します。まず、安全に保管するためにデータベースのバックアップを作成します。この質問に対する 2 つの回答で、逆コンパイルの詳細な手順を見つけることができます: HOW TO decompile and recompile

率直に言って、腐敗は一種の荒唐無稽な推測です。ただし、ソース コードの一部が不思議なことに消えてしまい、Access がまだそこにあるかのように動作するため、破損している可能性が高くなります。

別の可能性はあなたが持っていることDoCmd.SetWarnings = Falseです。オフにするとSetWarnings、失敗した試行に関するエラー メッセージがサイレント モードで破棄されますINSERT。したがって、エラー メッセージは表示されませんが、実際には何も挿入されません。

于 2013-03-24T23:26:09.020 に答える