首页 > 解决方案 > 运行访问报告,包括另一个具有相同日期范围的非关联附加报告

问题描述

三个 Access 报表使用两个传递查询和一个标准 SELECT 查询,并且全部单独工作。一个主报告以一个命令按钮开始,该按钮从表单中获取一个日期范围内的两个日期。每次使用后,我可以在 ptq 中看到这些日期参数的变化。其中一个附加报告基于另一个 ptq 运行,使用为日期范围提供的“默认”日期(没有什么可以重置 ptq 的这些日期,因为从主报告中调用附加报告 - 这是我的问题或断开连接我相信),另一个在标准选择查询中使用 WHERE 子句调用表单中的日期。这两个报告向主报告提供了额外但不同的数据。我不 t 相信它们将是带有链接的主字段和子字段的子报表,因为主报表数据和附加的报表数据没有关联。问题是日期范围没有传递给附加报告的一个 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 的标量不返回日期,它只需要日期参数来构建标量记录。

如何从主调用的报告中获取要传递给附加报告的 ptq 的日期参数?

另一个问题是,这些附加报表位于报表页脚部分,因此它们的数据将在主报表的记录列表之后立即打印。但是,由于我使用的是两列,因此即使在末尾有足够的空间时,所附报告的数据也总是打印在下一页而不是第一列(通常)或第二列(给定足够的记录)的底部列出的记录。我怎样才能使附加的报告直接跟随第一个列表?这应该是另一个问题吗?

标签: ms-accessreportsubreportpass-through

解决方案


好吧,您始终可以在启动报告之前设置 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查询,然后简单地将所有条件发送到打开报告命令,访问只会根据传递的条件拉下管道记录。这意味着您以前为报告提供过滤器的现有 VBA 代码将像以前一样工作。

另外,因为经常会为 sql server 和 PT 查询格式化日期,所以我有一个例程来为我格式化日期。在上面,我使用了 qudateSQLt(包括时间)。所以使用的方便的花花公子函数看起来像这样:

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

推荐阅读