访问包含多个列组的报表
Access Report with multiple column groups
所以我正在致力于自动化一个繁琐的过程,这是山姆大叔让我们在部署时做的。我有一个数据库,我们在其中输入我们部署到 table 的每一天的日期。例如,我列出了 4/10/2017 到 7/11/2017。
每天都需要显示日期和位置,我需要将六个结果垂直堆叠,然后向右移动以重复接下来的六个。
我有一份名为 2282report 的报告,它是主报告,在适当的位置有四个 subLocation[1-4]。最初我让它做 TOP 6 然后下一个会做 TOP 6 但是 ID > 6 但后来我移动到使日期成为 ID 因为日期无论如何都不能重复。我不确定将它们链接起来的正确方法,以便下一个子报表继续显示其余部分。
运行 时的报告如下所示。我通常还有 90 多天的时间来列出,因此我需要为主报告创建第二页。
我想我要做的是为整个位置块创建一个新的子报表,但我不知道如何让 report_details 在显示 6 后移动到新列结果。
我刚刚想到的另一个选择是将子报表留空,然后让主报表通过 vba 为每个子报表设置控制源。我觉得这个可能有用,因为它可以检查是否有更多天数然后有行,以便它可以创建一个新页面继续。但是我需要弄清楚如何让它继续到下一页。还有一个底部部分只有 16 天,而顶部有 24 天。
您可能想在各种报告事件处理程序中使用 VBA,但即使这可能有效,根据我的经验,这只会导致在尝试正确格式化所有内容时令人头疼。相反,我建议创建一个新的报告 table,每行都有一个页码。从排序的页码列表中获取主报告,并通过页码字段绑定多列子报告。使用一个简单的 VBA 程序填充报告 table,该程序可根据您的方案正确对行进行分页。
首先是报告 table(根据需要添加约束):
CREATE TABLE SubReportTable (PageNum LONG, PageOrdinal LONG, _
Ordinal LONG, LastPage BIT, [Date of Service] DATE, [Location] TEXT)
在子报表上:
- Set RecordSoucre 属性:
SubReportTable
(或者指定一个按所需字段排序的查询)
- 将列数设置为 4 以及其他列设置(填充、方向等)。
- 将“详细信息”部分和其他控件的 CanGrow 属性 设置为
No
。
- 调整列和详细信息部分的大小以正确适合页面上的所有列。 (这可能需要在主窗体上的打印预览和设计之间来回切换。)
在主报表上,设置以下属性:
- 记录源 属性:
SELECT SubReportTable.PageNum FROM SubReportTable WHERE (((SubReportTable.LastPage)=False)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
- 详细信息部分 属性 强制新页面 到
After Section
。
- SubReport 对象的 Link 主字段 和 Link 子字段 都到
PageNum
- 调整 SubReport 对象的大小以正确适合所有列。
在单独的 "Last Page" 报告中复制主报告的行为。根据报告 table(即 LastPage = True
)中的分页数据,将此报告设置为 select 正确的记录子集。根据具有 16 条记录的最后一页的格式有何不同,它可能还需要为 16 条记录创建一个单独的子报表,但您可能会使用与主报表相同的子报表而逃脱……这将是您的问题确定。
- 记录源 属性:
SELECT SubReportTable.PageNum FROM SubReportTable WHERE ((SubReportTable.LastPage = True)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
最后是一些代码来填充报告 table。您可以直接从 VBA 立即 Window 运行 此过程,或将其放在某个按钮的单击事件处理程序中。可以调整分页逻辑以在最后一页上获得正确数量的记录。
Public Sub PrepareSubReporTable()
On Error GoTo Catch_PrepareSubReporTable
Dim db As Database
Dim rs As Recordset2
Dim rows As Long, pgs24 As Long, rowsLast24 As Long, rows16 As Long
Dim i As Long, p As Long, pi As Long
Set db = CurrentDb
db.Execute "DELETE * FROM [SubReportTable]", dbFailOnError
db.Execute _
"INSERT INTO SubReportTable ( PageNum, PageOrdinal, Ordinal, LastPage, [Date of Service], [Location] )" & _
" SELECT Null AS PageNum, Null AS PageOrdinal, Null AS Ordinal, False as LastPage," & _
" [Data].[Date of Service], [Data].[Location]" & _
" FROM [Data]" & _
" ORDER BY [Data].[Date of Service], [Data].[Location];", _
dbFailOnError
rows = db.OpenRecordset("SELECT Count(*) FROM SubReportTable").Fields(0)
pgs24 = rows \ 24
rows16 = rows - 24 * pgs24
If rows16 > 16 Then
rowsLast24 = rows16
pgs24 = pgs24 + 1
rows16 = 0
Else
rowsLast24 = 24
End If
Set rs = db.OpenRecordset( _
"SELECT * FROM SubReportTable" & _
" ORDER BY [Date of Service], [Location];")
i = 0
Do Until rs.EOF
p = i \ 24 + 1
rs.Edit
rs![PageNum] = p
If p > pgs24 Then
rs![lastPage] = True
pi = (i - pgs24 * 24) Mod 16 + 1
Else
pi = i Mod 24 + 1
End If
rs![PageOrdinal] = pi
i = i + 1
rs![Ordinal] = i
rs.Update
rs.MoveNext
Loop
rs.Close
Exit Sub
Catch_PrepareSubReporTable:
MsgBox Err.Number & ": " & Err.Description, _
vbOKOnly Or vbExclamation, "Error in PrepareSubReporTable"
End Sub
现在生成主要报告和最后一页报告,手动或在某处的 VBA 代码中。
注意:我使用字段名称 PageNum 而不是 Page,因为这似乎会在打印预览期间导致 SubReport 绑定出现问题...可能是因为 Page 是报告的现有变量/函数的名称。
所以我正在致力于自动化一个繁琐的过程,这是山姆大叔让我们在部署时做的。我有一个数据库,我们在其中输入我们部署到 table 的每一天的日期。例如,我列出了 4/10/2017 到 7/11/2017。 每天都需要显示日期和位置,我需要将六个结果垂直堆叠,然后向右移动以重复接下来的六个。
我有一份名为 2282report 的报告,它是主报告,在适当的位置有四个 subLocation[1-4]。最初我让它做 TOP 6 然后下一个会做 TOP 6 但是 ID > 6 但后来我移动到使日期成为 ID 因为日期无论如何都不能重复。我不确定将它们链接起来的正确方法,以便下一个子报表继续显示其余部分。
运行 时的报告如下所示。我通常还有 90 多天的时间来列出,因此我需要为主报告创建第二页。
我想我要做的是为整个位置块创建一个新的子报表,但我不知道如何让 report_details 在显示 6 后移动到新列结果。
我刚刚想到的另一个选择是将子报表留空,然后让主报表通过 vba 为每个子报表设置控制源。我觉得这个可能有用,因为它可以检查是否有更多天数然后有行,以便它可以创建一个新页面继续。但是我需要弄清楚如何让它继续到下一页。还有一个底部部分只有 16 天,而顶部有 24 天。
您可能想在各种报告事件处理程序中使用 VBA,但即使这可能有效,根据我的经验,这只会导致在尝试正确格式化所有内容时令人头疼。相反,我建议创建一个新的报告 table,每行都有一个页码。从排序的页码列表中获取主报告,并通过页码字段绑定多列子报告。使用一个简单的 VBA 程序填充报告 table,该程序可根据您的方案正确对行进行分页。
首先是报告 table(根据需要添加约束):
CREATE TABLE SubReportTable (PageNum LONG, PageOrdinal LONG, _
Ordinal LONG, LastPage BIT, [Date of Service] DATE, [Location] TEXT)
在子报表上:
- Set RecordSoucre 属性:
SubReportTable
(或者指定一个按所需字段排序的查询) - 将列数设置为 4 以及其他列设置(填充、方向等)。
- 将“详细信息”部分和其他控件的 CanGrow 属性 设置为
No
。 - 调整列和详细信息部分的大小以正确适合页面上的所有列。 (这可能需要在主窗体上的打印预览和设计之间来回切换。)
在主报表上,设置以下属性:
- 记录源 属性:
SELECT SubReportTable.PageNum FROM SubReportTable WHERE (((SubReportTable.LastPage)=False)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
- 详细信息部分 属性 强制新页面 到
After Section
。 - SubReport 对象的 Link 主字段 和 Link 子字段 都到
PageNum
- 调整 SubReport 对象的大小以正确适合所有列。
在单独的 "Last Page" 报告中复制主报告的行为。根据报告 table(即 LastPage = True
)中的分页数据,将此报告设置为 select 正确的记录子集。根据具有 16 条记录的最后一页的格式有何不同,它可能还需要为 16 条记录创建一个单独的子报表,但您可能会使用与主报表相同的子报表而逃脱……这将是您的问题确定。
- 记录源 属性:
SELECT SubReportTable.PageNum FROM SubReportTable WHERE ((SubReportTable.LastPage = True)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
最后是一些代码来填充报告 table。您可以直接从 VBA 立即 Window 运行 此过程,或将其放在某个按钮的单击事件处理程序中。可以调整分页逻辑以在最后一页上获得正确数量的记录。
Public Sub PrepareSubReporTable()
On Error GoTo Catch_PrepareSubReporTable
Dim db As Database
Dim rs As Recordset2
Dim rows As Long, pgs24 As Long, rowsLast24 As Long, rows16 As Long
Dim i As Long, p As Long, pi As Long
Set db = CurrentDb
db.Execute "DELETE * FROM [SubReportTable]", dbFailOnError
db.Execute _
"INSERT INTO SubReportTable ( PageNum, PageOrdinal, Ordinal, LastPage, [Date of Service], [Location] )" & _
" SELECT Null AS PageNum, Null AS PageOrdinal, Null AS Ordinal, False as LastPage," & _
" [Data].[Date of Service], [Data].[Location]" & _
" FROM [Data]" & _
" ORDER BY [Data].[Date of Service], [Data].[Location];", _
dbFailOnError
rows = db.OpenRecordset("SELECT Count(*) FROM SubReportTable").Fields(0)
pgs24 = rows \ 24
rows16 = rows - 24 * pgs24
If rows16 > 16 Then
rowsLast24 = rows16
pgs24 = pgs24 + 1
rows16 = 0
Else
rowsLast24 = 24
End If
Set rs = db.OpenRecordset( _
"SELECT * FROM SubReportTable" & _
" ORDER BY [Date of Service], [Location];")
i = 0
Do Until rs.EOF
p = i \ 24 + 1
rs.Edit
rs![PageNum] = p
If p > pgs24 Then
rs![lastPage] = True
pi = (i - pgs24 * 24) Mod 16 + 1
Else
pi = i Mod 24 + 1
End If
rs![PageOrdinal] = pi
i = i + 1
rs![Ordinal] = i
rs.Update
rs.MoveNext
Loop
rs.Close
Exit Sub
Catch_PrepareSubReporTable:
MsgBox Err.Number & ": " & Err.Description, _
vbOKOnly Or vbExclamation, "Error in PrepareSubReporTable"
End Sub
现在生成主要报告和最后一页报告,手动或在某处的 VBA 代码中。
注意:我使用字段名称 PageNum 而不是 Page,因为这似乎会在打印预览期间导致 SubReport 绑定出现问题...可能是因为 Page 是报告的现有变量/函数的名称。