运行 访问报告,包括另一个具有相同日期范围的非关联附加报告
Run access report including another non-associated attached report with same date range
三个访问报告使用两个传递查询和一个标准 SELECT 查询,所有这些都单独工作。一个主要报告是通过一个命令按钮启动的,该按钮从一个日期范围的表单中获取两个日期。每次使用后,我都可以在 ptq 中看到那些日期参数发生变化。其中一个附加报告基于另一个 ptq 运行,使用提供的 "default" 日期作为日期范围(没有任何东西可以重置 ptq 的那些日期,因为从主报告调用附加报告 - 这是我的问题或断开连接我相信),另一个是标准 select 查询,其中包含从表单调用日期的 WHERE 子句。这两份报告为主要报告提供了额外但不同的数据。我不相信它们将是具有链接主字段和子字段的子报表,因为主报表数据和附加报表数据没有关联。问题是日期范围没有传递给附加报告的一个 ptq,因此日期永远不会改变,只会返回其 ptq 中的 "default" 日期范围。这是两个 ptqs:
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 returns 一条预期的记录。
我试过像其他附加报告一样使用 SELECT 查询,但这不起作用,因为 sp 的标量 returns 没有日期,它只需要日期参数来构建标量记录.
如何从调用的主报告获取日期参数以传递给附加报告的 ptq?
另一个问题是,这些附加报告位于报告页脚部分,因此它们的数据将在主报告的记录列表之后立即打印。但是,由于我使用的是两列,所附报告的数据总是打印在下一页上,而不是第一列(通常)或第二列(如果有足够的记录)的底部,即使末尾有足够的空间也是如此列出的记录。我怎样才能使附加的报告直接跟在第一个列表之后?这应该是另一个问题吗?
好吧,您始终可以在启动报告之前设置 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 代码为报告提供过滤器将像以前一样工作。通过使用视图而不是 PT 查询,您往往会获得同样好的性能(如果不是更好的话)(特别是如果您向 openreport 命令提供额外的条件)。
此外,因为人们经常会为 sql 服务器和 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
三个访问报告使用两个传递查询和一个标准 SELECT 查询,所有这些都单独工作。一个主要报告是通过一个命令按钮启动的,该按钮从一个日期范围的表单中获取两个日期。每次使用后,我都可以在 ptq 中看到那些日期参数发生变化。其中一个附加报告基于另一个 ptq 运行,使用提供的 "default" 日期作为日期范围(没有任何东西可以重置 ptq 的那些日期,因为从主报告调用附加报告 - 这是我的问题或断开连接我相信),另一个是标准 select 查询,其中包含从表单调用日期的 WHERE 子句。这两份报告为主要报告提供了额外但不同的数据。我不相信它们将是具有链接主字段和子字段的子报表,因为主报表数据和附加报表数据没有关联。问题是日期范围没有传递给附加报告的一个 ptq,因此日期永远不会改变,只会返回其 ptq 中的 "default" 日期范围。这是两个 ptqs:
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 returns 一条预期的记录。
我试过像其他附加报告一样使用 SELECT 查询,但这不起作用,因为 sp 的标量 returns 没有日期,它只需要日期参数来构建标量记录.
如何从调用的主报告获取日期参数以传递给附加报告的 ptq?
另一个问题是,这些附加报告位于报告页脚部分,因此它们的数据将在主报告的记录列表之后立即打印。但是,由于我使用的是两列,所附报告的数据总是打印在下一页上,而不是第一列(通常)或第二列(如果有足够的记录)的底部,即使末尾有足够的空间也是如此列出的记录。我怎样才能使附加的报告直接跟在第一个列表之后?这应该是另一个问题吗?
好吧,您始终可以在启动报告之前设置 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 代码为报告提供过滤器将像以前一样工作。通过使用视图而不是 PT 查询,您往往会获得同样好的性能(如果不是更好的话)(特别是如果您向 openreport 命令提供额外的条件)。
此外,因为人们经常会为 sql 服务器和 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