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

Report

表单代码:
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发布于 2017-08-29 19:43:09
问题1:重新查询报表
使用标准技术打开报表时(例如单击导航窗格中的报表)或使用DoCmd.OpenReport打开报表时,Access将创建可通过Application.Reports集合访问的报表的默认实例。在第一次打开报表之前,或者如果默认报表实例完全关闭(即从内存中删除),Application.Reports集合将不包含报表的实例。在访问默认实例之前,请确保报表已经打开。
与其他MS对象模型集合一样,Application.Reports没有“包含”方法或其他直接方法来测试报表是否已经打开,只能通过循环遍历数字索引和测试每个报表对象。虽然在我看来这似乎很草率,但最简单的方法是使用错误处理来直接获取报告,如果找不到该错误,则捕获该错误:
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事件中的每个控件调用Requery。我知道您正在尝试调试这种情况,但是这种行为应该会自动发生。此外,当表单首次加载时,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 Subhttps://stackoverflow.com/questions/45926094
复制相似问题