尝试将参数传递给MS Access查询

时间:2016-10-11 21:33:20

标签: vba ms-access access-vba report datasource

我正在尝试根据查询编写MS Access报告,我可以通过编程方式将日期范围用于使用VBA。我以Between [StartDate] and [EndDate]为标准设置了查询。然后我在表单上有以下代码:

Private Sub AutoReport1_Click()
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset

Set qdf = CurrentDb.QueryDefs("MixByRangeA")

qdf.Parameters("StartDate").Value = #10/2/2014#
qdf.Parameters("EndDate").Value = #11/2/2014#


Set rst = qdf.OpenRecordset()

End Sub

似乎没有发生任何事情。查询应该打开并显示在屏幕上吗?我根据我的互联网搜索尝试了上面的一些代码变体,但没有任何作用。

3 个答案:

答案 0 :(得分:1)

没有任何事情发生,因为您在设置qdfrst后没有做任何事情。我不完全确定你想要完成什么,但是:


1.如果要打开其RecordSource是查询结果的报告(动态设置参数),请尝试将以下内容放在报告的代码模块中:

Private Sub Report_Open(Cancel As Integer)
    Dim db As DAO.Database: Set db = CurrentDb
    Dim qdf As DAO.QueryDef
    Dim sql As String

    Set qdf = db.QueryDefs("MixByRangeA")

    sql = qdf.sql
    sql = Replace(sql, "[StartDate]", "#10/2/2014#")
    sql = Replace(sql, "[EndDate]", "#11/2/2014#")
    Me.RecordSource = sql

    On Error Resume Next
    qdf.Close: Set qdf = Nothing
    db.Close: Set db = Nothing
End Sub

在表格中,使用此功能打开报告:

Private Sub AutoReport1_Click()
    DoCmd.OpenReport "Report1", acViewReport
End Sub


2.如果您只想打开查询(动态设置参数),请尝试以下操作:

Public Sub AutoReport1_Click()
    Dim db As DAO.Database: Set db = CurrentDb
    Dim qdf As DAO.QueryDef
    Dim sql As String

    Set qdf = db.QueryDefs("MixByRangeA")

    sql = qdf.sql
    sql = Replace(sql, "[StartDate]", "#10/2/2014#")
    sql = Replace(sql, "[EndDate]", "#11/2/2014#")
    qdf.sql = sql
    DoCmd.OpenQuery (qdf.Name)

    On Error Resume Next
    qdf.Close: Set qdf = Nothing
    db.Close: Set db = Nothing
End Sub

答案 1 :(得分:0)

简单方法是从查询中删除参数并将过滤器应用于报告:

Dim StartDate As Date
Dim EndDate As Date

StartDate = #10/2/2014#
EndDate = #11/2/2014#

DoCmd.OpenReport "YourReport", , , "[YourDateField] Between #" & Format(StartDate, "yyyy\/mm\/dd") & "# And #" & Format(EndDate, "yyyy\/mm\/dd") & "#"

答案 2 :(得分:0)

我认为不能以你想要的简单方式完成。

这看起来很遗憾,因为您通过使用带参数参数的存储过程而不是构造动态SQL来遵循可被视为“最佳实践”的内容。

事实是,即使一般来说这是一种好习惯,但你仍然违背了Access团队希望你使用其软件的自然流程!看起来你被迫动态构造一个WHERE子句来喷入提供的方法:(