三个访问报告使用两个直通查询和一个标准的SELECT查询,并且所有这些都单独工作。一个主报告通过命令按钮开始,该命令按钮从表单中获取两个日期范围的日期。每次使用后,我可以在ptq中看到这些日期参数发生变化。附件报告中的一个基于另一个ptq使用提供的日期范围的“默认”日期运行(当从主报告中调用附件报告时,没有任何方法可以重置ptq的那些日期,这是我的问题或我认为断开连接),另一种是在标准选择查询中使用WHERE子句从表单中调用日期。这两个报告向主报告提供了其他但不同的数据。我不认为它们将是具有链接的主字段和子字段的子报表,因为主报表数据和附加的报表数据没有关联。问题是日期范围未传递到附件报表的一个ptq,因此日期永远不会更改,只会返回其ptq中的“默认”日期范围。这是两个ptq:
exec dbo.uspJobsCompletedThruPress '2019-10-07 05:30:00','2019-10-12 14:29:59'
exec dbo.uspJobsCompletedThruPress_SubReport '2019-10-14 05:30:00','2019-10-19 14:29:59'
子报告sp返回预期的单个记录。
我曾尝试像其他附件报告一样使用SELECT查询,但由于sp的标量不返回日期,它仅使用date参数来构建标量记录,因此无法正常工作。
如何获取日期参数以从主调用报告传递到附件报告的ptq?
另一个问题是,这些附加的报告位于报告页脚部分,因此其数据将在主报告的记录列表之后立即打印。但是,由于我使用的是两列,因此即使报表末尾有足够的空间,附加报表的数据也总是打印在下一页而不是第一列(通常)或第二列(具有足够的记录)的底部。列出的记录。如何使该附件报告直接跟随第一个列表?这应该是另一个问题吗?
TIA,蒂姆
好吧,您始终可以在启动报告之前设置PT查询。
所以您可以使用以下代码:
Sub Mytestzz()
Dim strDtStart As String
Dim strDtEnd As String
strDtStart = qudateT("some date source for start date")
strDtEnd = qudateT("some date source for end date")
With CurrentDb.QueryDefs("qryJobsPressPass")
.SQL = "exec dbo.uspJobsCompletedThruPress " & strDtStart & "," & strDtEnd
End With
With CurrentDb.QueryDefs("qryJobsPressPassSub")
.SQL = "exec dbo.uspJobsCompletedThruPress_SubReport " & strDtStart & "," & strDtEnd
End With
' now launch your report.
End Sub
因此,一旦您运行了上面的代码,那么现在使用的两个PT查询都已设置完毕,可以开始使用了。如果您根据上述两个查询启动报告,那么它们将尊重您的标准。请记住,您可以在打开的报表中添加其他“ where”子句,但是客户端仍会根据上述PT查询提取您拥有的所有数据(视图实际上更好-因为您不必理会PT查询,然后简单地将所有条件发送到open report命令,访问权限将仅根据传递的条件将记录下拉至管道,这意味着您以前为报告提供过滤器的现有VBA代码将像以前一样工作。通过使用视图而不是使用PT查询,往往会获得同样好的性能(如果不是更好的话)(尤其是如果您要向openreport命令提供其他条件的话)。
而且,由于经常会格式化sql server和PT查询的日期,因此我有一个例程可以为我格式化日期。在上面,我使用了qudateSQLt(包括时间)。这样使用的便捷dandy函数如下所示:
Public Function qudateSQLt(myDate As Variant) As String
' returns a formatted string of date, surrounded with # signs
' format is mm/dd/yyyy as required for sql, regardless of date setting
If IsNull(myDate) = True Then
qudateSQLt = ""
Else
' use ISO date format
qudateSQLt = "'" & Format(myDate, "yyyy-mm-dd HH:NN:SS") & "'"
End If
End Function