1

VBA 関数で次のクエリを実行しようとしています。「パラメーターが少なすぎます。1 が必要です。」というメッセージが表示され続けます。

strSQL = "Parameters [Report Date] DateTime;" & vbCrLf & _
                    "SELECT SCF.code AS [Stock Code], " & vbCrLf & _
                    "SCF.desc AS [Description], " & vbCrLf & _
                    "SCF.grp AS [Product Group]," & vbCrLf & _
                    "SCF.qCurr AS [Closing Stock], " & vbCrLf & _
                    "SCF.abp AS [Avg Price], " & vbCrLf & _
                    "Sum(([Closing Stock]*[Avg Price])) AS [STOCK VALUE], " & vbCrLf & _
                    "MaxDate.tDate AS [Last Transaction Date], " & vbCrLf & _
                    "Sum(IIf(([Last Transaction Date]>[Report Date]),([Closing Stock]*[Avg Price]),0)) AS [After Report Date], " & vbCrLf & _
                    "DateDiff(""d"",[Last Transaction Date],[Report Date]) AS [Days since Last Transaction], " & vbCrLf & _
                    "[Report Date]" & vbCrLf & _
            "INTO [FinReport] " & vbCrLf & _
            "FROM SCF RIGHT JOIN MaxDate ON MaxDate.parent = SCF.this "
strSQL = strSQL & _
            "WHERE (SCF.qCurr <> 0) " & vbCrLf & _
            "GROUP BY SCF.code, " & vbCrLf & _
                        "SCF.desc, " & vbCrLf & _
                        "SCF.grp, " & vbCrLf & _
                        "SCF.qCurr, " & vbCrLf & _
                        "SCF.abp, " & vbCrLf & _
                        "MaxDate.tDate" & vbCrLf & _
            "ORDER BY MaxDate.tDate;"

Set qdf = db.CreateQueryDef("", strSQL)
qdf.Parameters("[Report Date]").Value = Form_IO_Form.ReportDate_TB.Value
qdf.Execute

すべてのフィールド (もちろん [Report Date] 以外) が存在し、クエリがアクセス クエリとして単独で実行されることを確認しました(ポップアップで [Report Date] が要求されます)。

ヘルプ!

編集1:ここで要求されたのは、DBファイルをZIPとしてです。Access 2007 の .accdb ファイル
DB ファイルです。

4

2 に答える 2

1

SQL ステートメントは、db エンジンからエラー #3122 をトリガーします。

You tried to execute a query that does not include the specified expression 'DateDiff("d",[Last Transaction Date],[Report Date])' as part of an aggregate function.

そのエラーにより、db エンジンがパラメーターを考慮する前に、ステートメントが失敗します。

VBA で SQL ステートメントを作成する場合は、db エンジンが受け入れるものから始めることをお勧めします。次に、@mwolfe02 からDebug.Print strSQL... への適切なアドバイスに従って、db エンジンに実行を依頼している完成したステートメントを調べる機会を自分自身に与える必要があります。

編集:アップロードした ACCDB ファイルを調べましたが、クエリがエラー #3122 をトリガーしない理由がまだわかりません。ただし、クエリは保存されたクエリとして機能し、VBA コードから実行すると機能します。「パラメーターが少なすぎる」という苦情が寄せられた理由は、作成した一時的な QueryDef を実際に実行していなかったからです。代わりに、次のように SQL テキストを実行しようとしました。

' Execute created Query '
CurrentDb.Execute strSQL, dbFailOnError

このアプローチに変更すると(質問で示したように)、エラーなしで機能します。

qdf.Execute
于 2012-05-28T14:35:58.183 に答える
1

フィールド名の 1 つにタイプミスがあると思います。Debug.Print strSQLそれを見つける最も簡単な方法は、ラインの直前にラインを投げることですSet qdf...

次に、Access UI で新しいクエリを作成し、SQL ビューに切り替えて、すぐに表示されるウィンドウから SQL テキストを貼り付け、クエリを実行します。Access は、Report Date(期待どおりの) と入力ミスのあるフィールドの名前を入力するように求めます。

于 2012-05-28T13:15:52.670 に答える