将Report的Open事件中的参数传递给参数查询(Access 2007)

JPM*_*JPM 4 parameters ms-access report

我想知道是否有办法使用VBA在Access 2007查询中设置参数.我是在Access中使用VBA的新手,我的任务是为现有应用添加一些功能.

我遇到的问题是可以在应用程序的两个不同位置调用相同的报告.第一个是数据输入表单上的命令按钮,另一个是交换机按钮.报告本身基于一个参数查询,该查询要求用户输入供应商ID.

用户不希望在数据输入表单上输入供应商ID(因为表单已经显示供应商ID),但是从交换机,他们希望提示他们输入供应商ID.

我遇到的问题是如何调用报告的查询(在报告的open事件中)并将表单中的SupplierID作为参数传递.我已经尝试了一段时间,我无法正常工作.到目前为止,这是我的代码,但我显然很难过.

Private Sub Report_Open(取消为整数)

Dim intSupplierCode As Integer

'Check to see if the data entry form is open
If CurrentProject.AllForms("frmExample").IsLoaded = True Then

    'Retrieve the SupplierID from the data entry form
    intSupplierCode = Forms![frmExample]![SupplierID]

    'Call the parameter query passing the SupplierID????
    DoCmd.OpenQuery "qryParams"


Else

    'Execute the parameter query as normal

    DoCmd.OpenQuery "qryParams"?????


End If
Run Code Online (Sandbox Code Playgroud)

结束子

我已经尝试了Me.SupplierID = intSupplierCode,虽然它编译了,但是当我运行它时它会爆炸.这是我的参数查询的SQL代码:

参数[输入供应商]长; SELECT Suppliers.SupplierID,Suppliers.CompanyName,Suppliers.ContactName,Suppliers.ContactTitle FROM Suppliers WHERE(((Suppliers.SupplierID)= [Enter Supplier]));

我知道有很多方法可以解决这个问题(也可能是一种简单的方法),但就像我说的那样,我缺乏使用Access和VBA的经验会让事情变得困难.如果你们中的任何人都可以提供帮助,那就太好了!

Alb*_*lal 7

这里建议的是100%从查询中删除参数.这不仅解决了你的问题,而且意味着你可以使用查询代码,其他形式,而不是让你的整个设计崩溃,因为一个愚蠢的形式没有打开(因此你的问题的非常原因).

因此,从查询中删除参数.这也意味着您的报告现在不需要已经打开的表单.而且,如果没有打开一些愚蠢的形式,为什么你的报告无法运作?

因此,删除参数.现在,在打开报表的表单中,它可以传递过滤器,更多的是使用所谓的"where"子句.这个"where"子句是在MS访问中设计的,用于解决必须提前知道需要什么样的参数和过滤器的问题.它在运行时发生,因此许多不同的表单可以调用并打开该报告.

现在,在调用和打开表单的形式中,您可以:

Docmd.OpenReport "rptSuppliers",acViewPreview, , _
                "SupplierCode = " & me.SupplierCode
Run Code Online (Sandbox Code Playgroud)

因此,在上面,参数是动态创建的.最大的好处是明天你可以用另一个表单打开同一个报表,也许按地区过滤.

在NO where子句被传递并且用户只是打开表单的情况下,将不使用过滤器并且不会出现提示并且将显示所有记录.这可能是你最好的方法.

但是,如果出于某些奇怪的原因,当一个愚蠢的形式恰好不打开时,你仍然认为有必要提供一些报告提示,那么将以下代码放在表单on-open事件中.

If CurrentProject.AllForms("form1").IsLoaded = False Then
   Me.Filter = "SupplierID = " & InputBox("Enter Supplier ID")
   Me.FilterOn = True
End
Run Code Online (Sandbox Code Playgroud)

但是,我真的会努力避免在报告打开事件中对一些愚蠢的表单名称进行硬编码.这不仅意味着现在连接到报告中的一些无聊的形式,你硬编码的依赖,但如果你以后副本报告,甚至复制的原始形式(甚至重命名这些对象),那么你必须进入应用程序并进行搜索,现在找到您作为开发人员引入依赖项的地方.这种方法可以大大增加应用程序的维护成本,因此应该提出.

所以,这里的建议是转储参数查询.只需提供表单或一些提示系统即可启动报告.这些表单应提示用户输入您要过滤的信息.或者在您的情况下,绑定表单和当前记录提供该信息.这个系统的美妙之处在于,报告中没有任何重要性.

任何形式,甚至任何代码都可以免费通过pramaeter,它不仅限于SupplierID,而是可以是您希望的任何类型的过滤器或参数.

请记住,也许用户可能不希望该表单打开,也许他们不希望提示.根据您的设计和问题,即使在没有打开任何表单的情况下启动报表,用户也将被迫输入参数值,并且不希望提示他们查看该报表中的所有reocrds.