2017-08-28 92 views
0

我有一个表格,下面的表格允许用户以多种方式过滤数据库。当他们按下表单上的筛选器按钮时,将根据筛选器查询填充报告。问题是如果我再次过滤数据库,即使在报告代码中使用.requery,报告也不会更新到新的查询结果。我知道如果我手动关闭了它的工作报告,但是当我将它编码到DoCmd.Close时,它实际上并没有关闭报告。如果我在 acViewPreview中显示它,它会在每次使用表单上的refilter按钮时更新,但是我无法使用报表中的按钮。我试图让它像一个亭子,所以我不希望导航标签显示。查询更改后访问报告不会更新

过滤形式

enter image description here

报告

enter image description here

表格代号:

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 

报告编号:

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 
+0

访问报告可能有许多不同的方式,并且不直观。如果我是你,我会重新查询主表单(或中间表单),然后再打一个新的报表。如果您在选择选项之前需要显示结果,请在中间表单上显示并将按钮放在那里。任何简化报告都可以为您节省大量的麻烦。 – abraxascarab

+0

@abraxascarab Access如何报告错误? – nicomp

+0

@abraxascarab除了我已经用过的东西之外,你怎样称呼新的报告? 'DoCmd.OpenReport' – holi4683

回答

0

问题1:重新查询报告

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

与其他MS Office对象模型集合一样,Application.Reports没有“Contains”方法或其他直接方式来测试报告是否已经打开,只能通过循环访问数字索引并测试每个报告对象。虽然看起来稀松对我来说,最简单的方法是使用错误处理尝试直接获得该报告,然后捕捉错误,如果它不发现:

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。更好的是总是使用可选参数的显式名称。键入一个额外的参数,绝对是值得保存的挫折和时间错别字逗号暧昧名单:

DoCmd.Close Save:=acSaveNo 

问题3:不必要的调用

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

最后一些替代代码

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 

它不再需要完全关闭的报告。

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