假设您正在使用microsoft访问设计销售报告.您有2个参数:Startdate和EndDate.
我可以想到在报告运行时提示最终用户输入这些参数的3种方法.
创建一个包含2个文本框和一个按钮的表单.Button运行报告,报告按名称返回表单以获取开始日期和结束日期.
创建一个包含2个文本框和一个按钮的表单.该按钮运行报告,但通过docmd.openreport命令设置适当的过滤器.
将报告基于Query并定义查询参数.Access将自动逐个提示这些参数.
哪种方式最好?
哪个最好取决于许多因素.首先,如果要运行不带参数的报表,则不希望在报表的记录源中定义它们.这也是你的第一个建议的问题,它会将报告与表单联系起来(从Access/Jet的角度来看,在记录源的SQL中声明的PARAMETER与表单控件引用之间几乎没有区别;实际上,如果你做得对,任何时候使用表单控件引用,你都会将它定义为参数!).
在这三个中,最灵活的是您的第二个建议,这意味着无需打开表单即可运行报表,无需在运行时提供参数.
你已经遗漏了两种可能性,这就是使用Form的OnOpen事件在运行时设置记录源.为此,您将使用acDialog参数打开要收集日期的表单,填写后隐藏表单,然后即时编写记录源.像这样的东西:
Private Sub Report_Open(Cancel As Integer)
Dim dteStart as Date
Dim dteEnd As Date
DoCmd.OpenForm "dlgGetDates", , , , , acDialog
If IsLoaded("dlgGetDates") Then
With Forms!dlgGetDates
dteStart = !StartDate
dteEnd = !EndDate
End With
Me.Recordsource = "SELECT * FROM MyTable WHERE DateField Between #" _
& dteStart & "# AND #" & dteEnd & "#;"
DoCmd.Close acForm, "dlgGetDates"
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
[编辑:IsLoaded()是MS提供的功能.它是我所有Access编码的基础,我忘了它不是内置函数.代码:]
Function IsLoaded(ByVal strFormName As String) As Boolean
' Returns True if the specified form is open in Form view or Datasheet view.
Const conObjStateClosed = 0
Const conDesignView = 0
If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then
If Forms(strFormName).CurrentView <> conDesignView Then
IsLoaded = True
End If
End If
End Function
Run Code Online (Sandbox Code Playgroud)
现在,这种方法有一些优点:
您可以预先填写日期,以便用户只需单击"确定"即可.
您可以在多个位置重复使用该表单来收集多个表单的日期值,因为表单不关心它正在使用哪个报表.
但是,没有条件方式可以选择是否打开表单.
因此,我经常使用类模块来存储报告的过滤条件,然后检查相关的类模块实例是否具有在OnOpen事件触发时设置的过滤器值.如果设置了条件,那么我会动态编写记录源的SQL,如果没有设置,我只使用默认记录源(以及OpenReport参数中传递的任何过滤器).在此设置中,只有在收集条件并设置类模块实例后才能运行报表.这种方法的优点是报告可以在两个上下文中的任何一个中运行,并且没有一个部分需要彼此了解任何内容 - 报告只需要了解类模块的接口.
归档时间: |
|
查看次数: |
37635 次 |
最近记录: |