【问题标题】:Access VBA - qdf parameters item not found - error 3265访问 VBA - 未找到 qdf 参数项 - 错误 3265
【发布时间】:2020-07-05 22:08:02
【问题描述】:

我似乎无法理解我在这里做错了什么。我在以“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));

【问题讨论】:

  • 您只需要阅读参数查询并使用 querydefs。您必须在qryCreateInvoicesApproved 中定义参数,然后使用查询中定义的实际参数名称。看起来您正在尝试根据表单的记录集使用某种类型的混合参数???

标签: vba ms-access runtime-error


【解决方案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

【讨论】:

  • 我不太明白 - 当我尝试运行它时,我得到一个对话框,要求我输入 Approveparam、dateparam、typeparam 的参数。这些应该已经在 frmDatabaseInput 中定义了
  • 您的查询运行情况如何?从 SQL 窗口或 VBA 代码?当您 运行它 使用非空值时,表单是否打开?
  • 好吧,我认为 vba 运行了查询,查询取决于来自 frmAccountingDatabaseInput、invoiceapproved、combo272、combo 274 的值。然后,表单是我运行 VBA 的地方 - 我选择了发票日期(dateparam),选择发票类型(typeparam),然后剩下一些匹配的记录(显示表格)。目标是将这几条记录以 pdf 格式保存到我的桌面。希望这是有道理的!
  • 正确。 VBA 调用此参数化查询并将这些表单值自动传递给命名参数。它不应该提示您。您是否在查询中包含参数行? VBA 中是否包含适当的查询名称qryCreateInvoicesApproved?数据类型是否对齐?
  • OK 我意识到这一步实际上运行良好。它在代码的后面 - DoCmd.OpenReport "RPTInvoice", acFormatPDF, FilePath - 它要求我输入参数。 “RPTInvoice”是记录的 PDF 布局。它还调用查询中的值
【解决方案2】:

看起来您正试图强迫自己使用参数查询,但并没有真正致力于它。如果您不想真正使用一个,您可以更改您的 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);

【讨论】:

  • 您将其更改为 db - 或 currentdb 是对的。从记录集代码运行时,您可能需要将其更改为参数查询。在下面使用@Parfaits 的代码
  • 你让我插入的行给了我一个“需要对象”错误。我认为这是因为 qdf 没有定义?我将其更改为“Db.openrecordset(...)”,但现在我收到一条错误消息“参数太少。预期为 3。”
  • 我也尝试了@parfait 的代码 - 当我尝试运行代码时,该查询让我输入了值,但这些值已经存在于表单中。当我将查询的 where 子句的第一部分更改为“WHERE (tblAccountingDatabase.Invoice_approved = Yes”时,预期参数减少到两个。所以我认为错误出现在 where 子句中 - 它只是不喜欢我引用combo272和274的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2017-05-04
相关资源
最近更新 更多