2016-07-29 10 views
0

ここで間違ったことを理解できないようです。私は "qdf.Parameters ..."で始まる3行でエラー3265(このコレクションに見つかりません)が表示されます。私の理解は、ここで私のSQL文のwhere節を定義することですが、多分私は間違っています?アクセスがあるvbaにはかなり新しいので少し混乱します。VBAにアクセス - qdfパラメータの項目が見つかりません - エラー3265

Sub Save_Invoices_Meet_Criteria() 

Dim FileName As String 
Dim FilePath As String 
Dim myStmt As String 
Dim Db As DAO.Database 
Dim myrs As DAO.Recordset 

Set Db = CurrentDb() 

Dim qdf As DAO.QueryDef 
Set qdf = Db.QueryDefs("qryCreateInvoicesApproved") 

qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![Invoice_approved]") = [Forms]![frmAccountingDatabaseInput]![Invoice_approved] 
qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![invoice_date]") = [Forms]![frmAccountingDatabaseInput]![Combo272] 
qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![Invoice_Type}") = [Forms]![frmAccountingDatabaseInput]![Combo274] 

Set myrs = CurrentDb.OpenRecordset("SELECT distinct [reference] from qryCreateInvoicesApproved", 2) 

Do Until myrs.EOF 

FileName = Me.reference 
foldername = Format(Now(), "YYYY-MM-DD") 
FilePath = "C:\Users\company\Desktop\Invoicing Database\Save_Test\" & foldername & "\" & FileName & ".pdf" 

DoCmd.OpenReport "RPTInvoice", acFormatPDF, FilePath 
'DoCmd.OutputTo acOutputReport, , acFormatPDF, FilePath 



DoCmd.Close 
myrs.MoveNext 

Loop 

myrs.Close 
Set myrs = Nothing 

End Sub 

マイSQL文:あなたは、パラメータクエリを使用しますが、実際にそれにコミットしていないために自分自身を強制しようとしているようですが、一種の見え

SELECT tblAccountingDatabase.* 
FROM tblAccountingDatabase 
WHERE (((tblAccountingDatabase.Invoice_approved)=Yes) And ((tblAccountingDatabase.invoice_date)=Forms!frmAccountingDatabaseInput!Combo272) And ((tblAccountingDatabase.Invoice_Type)=Forms!frmAccountingDatabaseInput!Combo274)); 
+0

パラメータクエリとquerydefを読んでください。 'qryCreateInvoicesApproved'であなたのパラメータを定義してから、クエリで定義された実際のパラメータ名を使用する必要があります。あなたのフォームのレコードセットに基づいて、いくつかのタイプのハイブリッドパラメータを使用しようとしているようですね。 – dbmitch

答えて

0

。真に1つを使用したくない場合は、SQL構造を変更して汎用パラメーター名を使用することができます。次にqdf.Parametersメソッドを使用してフォームから値を入力します。

しかし、これはあなたが現在持っているものの中で最も簡単だと思います。

これらの行に置き換えます

SELECT DISTINCT [reference] 
FROM tblAccountingDatabase 
WHERE (tblAccountingDatabase.Invoice_approved=[Forms]![frmAccountingDatabaseInput]![Invoice_approved]) 
AND (tblAccountingDatabase.invoice_date=Forms!frmAccountingDatabaseInput!Combo272) 
AND (tblAccountingDatabase.Invoice_Type=Forms!frmAccountingDatabaseInput!Combo274); 
:にクエリを変更し

Set myrs = qdf.OpenRecordset("SELECT * from qryCreateInvoicesApproved", 2)

レコードセットを開くには、このラインで

Dim qdf As DAO.QueryDef 
Set qdf = Db.QueryDefs("qryCreateInvoicesApproved") 

qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![Invoice_approved]") = [Forms]![frmAccountingDatabaseInput]![Invoice_approved] 
qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![invoice_date]") = [Forms]![frmAccountingDatabaseInput]![Combo272] 
qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![Invoice_Type}") = [Forms]![frmAccountingDatabaseInput]![Combo274] 

Set myrs = CurrentDb.OpenRecordset("SELECT distinct [reference] from qryCreateInvoicesApproved", 2) 

+0

db-またはcurrentdbに変更してもよろしいですか?レコードセットコードから実行する場合は、パラメータクエリに変更する必要があります。以下の@ Parfaitsのコードを使用してください – dbmitch

+0

私が挿入した行は私に "オブジェクトが必要です"というエラーを表示します。 qdfが定義されていないためだと思いますか?私はそれを "Db.openrecordset(...)"に変更しましたが、 "パラメータが少なすぎます。予想される3."というエラーが表示されます。 – AstToTheRegionalMgr

+0

私も@parfaitのコードを試しました - そのクエリは私がコードを実行しようとすると入力値を持っていますが、値はすでにフォームに存在しています。クエリのwhere句の最初の部分を "WHERE(tblAccountingDatabase.Invoice_approved = Yes")と変更すると、予想されるパラメータは2に減少します。だから私はエラーがwhere句にあると思う - それはちょうど私がcombo272と274を参照している方法を好きではない – AstToTheRegionalMgr

1

ストアドクエリの先頭にPARAMETERS行を追加して、VBA querydefオブジェクトで参照してください。次に、Querydef.OpenRecordset()メソッドを使用して、パラメータ化されたクエリをレコードセットオブジェクトに渡します。

SQL

PARAMETERS [Approveparam] YesNo, [Dateparam] Datetime, [Typeparam] String; 
SELECT DISTINCT [reference] 
FROM tblAccountingDatabase 
WHERE (((tblAccountingDatabase.Invoice_approved) = [Approveparam]) 
    AND ((tblAccountingDatabase.invoice_date) = [Dateparam]) 
    AND ((tblAccountingDatabase.Invoice_Type) = [Typeparam])); 

VBA

... 
Dim qdf As DAO.QueryDef 
Set qdf = Db.QueryDefs("qryCreateInvoicesApproved") 

qdf!Approveparam = [Forms]![frmAccountingDatabaseInput]![Invoice_approved] 
qdf!Dateparam = [Forms]![frmAccountingDatabaseInput]![Combo272] 
qdf!Typeparam = [Forms]![frmAccountingDatabaseInput]![Combo274] 

Set myrs = qdf.OpenRecordset() 
... 

同じを使用して、フォーム/レポート/マクロにパラメータを渡すには:今、あなたは存在しない名前付きパラメータを渡しますparamterizedクエリの使用DoCmd.SetParameterメソッド。そして、はい、すべての値を引用符で囲む必要があります。したがって、引用符はエスケープします。また、DoCmd.OutputToを使用してレポートをPDFに変換してください。

DoCmd.SetParameter "Approveparam", _ 
      """" & [Forms]![frmAccountingDatabaseInput]![Invoice_approved] & """" 
DoCmd.SetParameter "Dateparam", _ 
      """" & [Forms]![frmAccountingDatabaseInput]![Combo272] & """" 
DoCmd.SetParameter "Typeparam", _ 
      """" & [Forms]![frmAccountingDatabaseInput]![Combo274] & """" 

DoCmd.OpenReport "RPTInvoice", acViewPreview 
DoCmd.OutputTo acOutputReport, "RPTInvoice", acFormatPDF, FilePath 
+0

私は '私はそれを実行しようとすると、Approveparam、dateparam、typeparamのパラメータを入力するダイアログボックスが表示されます。これらはfrmDatabaseInputですでに定義されているはずです – AstToTheRegionalMgr

+0

クエリをどのように実行していますか? SQLウィンドウかVBAコードか? * null以外の値で*実行したときにフォームがオープンされていますか? – Parfait

+0

さて、私はvbaがクエリを実行したと思って、クエリはfrmAccountingDatabaseInput、invoiceapproved、combo272、combo 274の値に依存します。次に、フォームはVBAを実行する場所です - 私は請求書の日付(dateparam)を選択し、請求書のタイプ(typeparam)、および一致するレコードがいくつか残っています(テーブルが表示されます)。目標は、それらのいくつかのレコードをpdfとしてデスクトップに保存することです。希望は意味をなさない! – AstToTheRegionalMgr

関連する問題