访问VBA - 找不到qdf参数项 - 错误3265

时间:2016-07-29 20:27:45

标签: vba runtime-error access

我似乎无法理解我在这里做错了什么。我在“qdf.Parameters ...”开头的三行中收到错误3265(此集合中未找到的项目)我的理解是我在这里定义了我的sql语句的where子句,但也许我错了?对vba来说很新,有点访问权限。

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));

2 个答案:

答案 0 :(得分: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()
...

要使用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

答案 1 :(得分:0)

看起来你似乎试图强迫自己使用参数查询但却没有真正致力于它。如果您不想真正使用它,可以更改SQL结构以使用通用参数名称 - 然后使用qdf.Parameters方法填充表单中的值。

但我认为这对你现在拥有的东西最简单。

替换以下行:

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)

使用此行打开记录集

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

将您的查询更改为:

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);