首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询更改后未更新访问报告

查询更改后未更新访问报告
EN

Stack Overflow用户
提问于 2017-08-28 19:27:54
回答 1查看 3K关注 0票数 0

下面有一个表单,允许用户以多种方式过滤数据库。当他们按下表单上的筛选按钮时,报表将基于筛选器查询填充。问题是,如果我再次过滤数据库,即使在报表代码中使用.requery,报告也不会更新到新的查询结果。我知道,如果手动关闭报表,它就能工作,但是,当我将它编码到DoCmd.Close时,它实际上并不会关闭报表。如果我在acViewPreview中显示它,它每次在表单上使用重新筛选按钮时都会更新,但是我不能在报表上使用按钮。我正试着让它像个售货亭,所以我不想让导航标签显示出来。

滤波器形式

Report

表单代码:

代码语言:javascript
复制
Private Sub btnFilter_Click()
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim SQL2 As String
    Dim ToDate As Date
    Dim FromDate As Date

    SQL2 = ""

    Set db = CurrentDb()
    Set qdf = db.QueryDefs("Filter")

If cmbFilter.Value = "Vended Date" Then

    ToDate = Format(DTPickerTo.Value, "YYYY-MM-DD")
    FromDate = Format(DTPickerFrom.Value, "YYYY-MM-DD")

SQL2 = "SELECT CribMaster_Quality.Line,CribMaster_Quality.[Vended Date],CribMaster_Quality.PartNumber,CribMaster_Quality.Group,CribMaster_Quality.ItemNumber,CribMaster_Quality.Amount,CribMaster_Quality.Description,CribMaster_Quality.Cost,CribMaster_Quality.[Extended Cost],CribMaster_Quality.User " & _
        " FROM CribMaster_Quality" & _
        " WHERE CribMaster_Quality.[Vended Date]" & _
        " BETWEEN #" & FromDate & "# AND #" & ToDate & "#" & _
        " ORDER BY CribMaster_Quality.[Vended Date] DESC;"
ElseIf ckbDateConst = True Then

    ToDate = Format(DTPickerTo.Value, "YYYY-MM-DD")
    FromDate = Format(DTPickerFrom.Value, "YYYY-MM-DD")

    SQL2 = "SELECT CribMaster_Quality.Line,CribMaster_Quality.[Vended Date],CribMaster_Quality.PartNumber,CribMaster_Quality.Group,CribMaster_Quality.ItemNumber,CribMaster_Quality.Amount,CribMaster_Quality.Description,CribMaster_Quality.Cost,CribMaster_Quality.[Extended Cost],CribMaster_Quality.User " & _
        " FROM CribMaster_Quality" & _
        " WHERE CribMaster_Quality." & Me!cmbFilter.Value & " = '" & Me!cmbFilterBy.Value & "' And CribMaster_Quality.[Vended Date] " & _
        " BETWEEN #" & FromDate & "# AND #" & ToDate & "#" & _
        " ORDER BY " & Me.cmbFilter.Value & " DESC;"
    Else
    SQL2 = "SELECT CribMaster_Quality.Line,CribMaster_Quality.[Vended Date],CribMaster_Quality.PartNumber,CribMaster_Quality.Group,CribMaster_Quality.ItemNumber,CribMaster_Quality.Amount,CribMaster_Quality.Description,CribMaster_Quality.Cost,CribMaster_Quality.[Extended Cost],CribMaster_Quality.User " & _
            " FROM CribMaster_Quality" & _
            " WHERE CribMaster_Quality." & Me!cmbFilter.Value & " = '" & Me!cmbFilterBy.Value & "'" & _
            " ORDER BY " & Me.cmbFilter.Value & " DESC;"
    End If

    qdf.SQL = SQL2
    Set db = Nothing
    Set qdf = Nothing

    DoCmd.OpenReport "CribMasterReport", acViewReport
End Sub

报告代码:

代码语言:javascript
复制
Private Sub btnReFilter_Click()
    DoCmd.Close , acSaveNo
    DoCmd.OpenForm "Filter Database Form"
End Sub

Private Sub Report_Load()

Me.Requery

With VendedDatetxt
    .Requery
End With

With ItemNumbertxt
    .Requery
End With

With Linetxt
    .Requery
End With

With PartNumbertxt
    .Requery
End With

With Usertxt
    .Requery
End With

With Amounttxt
    .Requery
End With

With Costtxt
    .Requery
End With

With ExtendedCosttxt
    .Requery
End With

End Sub
EN

回答 1

Stack Overflow用户

发布于 2017-08-29 19:43:09

问题1:重新查询报表

使用标准技术打开报表时(例如单击导航窗格中的报表)或使用DoCmd.OpenReport打开报表时,Access将创建可通过Application.Reports集合访问的报表的默认实例。在第一次打开报表之前,或者如果默认报表实例完全关闭(即从内存中删除),Application.Reports集合将不包含报表的实例。在访问默认实例之前,请确保报表已经打开。

与其他MS对象模型集合一样,Application.Reports没有“包含”方法或其他直接方法来测试报表是否已经打开,只能通过循环遍历数字索引和测试每个报表对象。虽然在我看来这似乎很草率,但最简单的方法是使用错误处理来直接获取报告,如果找不到该错误,则捕获该错误:

代码语言:javascript
复制
On Error Resume Next
Set frm = Application.Reports("CribMasterReport")
If err.Number <> 0 Then
  'Default instance not open
End If

注意:不要像使用对象那样使用类名来引用报表,就像在Report_CribMasterReport.Requery中一样。如果这样做,VBA将自动创建报表的一个新的隐藏实例,但它与上面描述的默认实例不同,并且这个新实例将无法通过Application.Reports集合访问。同样,在这样一个对象上使用属性和调用方法在很大程度上是无效的。(创建和使用这样的独立实例是可能的,但这是一种先进的技术,充满了自身的缺陷和挑战。)

正如问题所描述的,其他在线来源也证实了这一点,在基础查询或数据发生更改后,Report.Requery无法有效地刷新报表。但是,重置Report.RecordSource会强制在“正常报表视图”中对报表进行完全刷新。

第2期:未关闭的报告

DoCmd.Close命令缺少一个逗号。应该是DoCmd.Close , , acSaveNo。更好的做法是始终对可选参数使用显式名称。输入额外的参数绝对值得在逗号的模棱两可的列表中输入错误的内容和时间:

代码语言:javascript
复制
DoCmd.Close Save:=acSaveNo

问题3:不必要的调用

完全没有必要对报表和Report_Load事件中的每个控件调用Requery。我知道您正在尝试调试这种情况,但是这种行为应该会自动发生。此外,当表单首次加载时,Form_Load事件只发生一次,因此除非报告完全关闭并重新打开,否则不会再次调用代码。

最后选择了一些代码

代码语言:javascript
复制
Private Sub btnFilter_Click()
    '... Include previous code to reset report query

    '* Call DoCmd.OpenReport every time to
    '* 1) Ensure default report is open 
    '* 2) Automatically activate the report (even if it was already open)
    DoCmd.OpenReport "CribMasterReport", acViewReport

    On Error Resume Next
    Dim frm As Report_CribMasterReport
    Set frm = Application.Reports("CribMasterReport")
    If Err.Number = 0 Then
        '* Force the Report object to re-run query and recreate report
        frm.RecordSource = frm.RecordSource
    End If
End Sub

不再有必要完全关闭这份报告。

代码语言:javascript
复制
Private Sub btnReFilter_Click()
    ''DoCmd.Close Save:=acSaveNo
    DoCmd.OpenForm "Filter Database Form"
End Sub

Private Sub Report_Load()
    '* Eliminated unnecessary Requery calls
End Sub
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45926094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档