所以我正致力于自动完成一个单调乏味的过程,而山姆大叔让我们在部署过程中这样做。我有一个数据库,我们将每天的日期放入表中。例如,我有4/10/2017到7/11/2017列出。 每天都需要显示日期和位置,我需要将六个结果垂直堆叠,然后向右移动,再进行六次,共三次。
我有一个名为2282report的报告,它是在适当的位置有四个subLocation [1-4] s的主报告。最初我做了TOP 6然后下一个会做TOP 6但是ID> 6然后我移动将日期作为ID,因为日期无论如何都不能重复。我不确定将它们链接起来的正确方法,以便下一个子报告将继续显示其余部分。
报告在运行时看起来像这样。我通常还有超过90天的时间来列出,所以我需要在主报告中创建第二页。
我以为我要做的就是为整个位置块创建一个新的子报告,但我不知道如何将report_details移动到一个新的列,一旦它显示6结果
我想到的另一个选项是将子报告留空,然后让主报告通过vba为每个子报告设置控制源。我觉得这个可能有用,因为它可以检查是否有更多天,然后有线,以便它可以创建一个新的页面继续。但后来我需要弄清楚如何让它继续下一页。还有一个底部只有16天而不是顶部的24个。
答案 0 :(得分:0)
您可能想在各种报表事件处理程序中使用VBA,但即使这可能有效,根据我的经验,这只会导致头痛,试图让所有内容正确格式化。相反,我建议在每行上创建一个带有页码的新报表。从已排序的页码列表中获取主报表,并通过页码字段绑定多列子报表。使用简单的VBA过程填充报告表,该过程根据您的方案正确地对行进行分页。
首先是报告表(根据需要添加约束):
CREATE TABLE SubReportTable (PageNum LONG, PageOrdinal LONG, _
Ordinal LONG, LastPage BIT, [Date of Service] DATE, [Location] TEXT)
在SubReport上:
SubReportTable
(或者指定对所需字段进行排序的查询)No
。在主报表上,设置以下属性:
SELECT SubReportTable.PageNum FROM SubReportTable WHERE (((SubReportTable.LastPage)=False)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
After Section
。 PageNum
在单独的"最后一页"上重复主报表上的行为。报告。设置此报告以根据报告表中的分页数据(即LastPage = True
)选择适当的记录子集。根据16个记录的最后一页的格式有多么不同,可能还需要为16个记录创建一个单独的SubReport,但是你可能会使用与主报表相同的SubReport来逃避......那就是' ll你要确定的问题。
SELECT SubReportTable.PageNum FROM SubReportTable WHERE ((SubReportTable.LastPage = True)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
最后填写报告表的一些代码。您可以直接从VBA立即窗口运行此过程,也可以将其放在某个按钮的单击事件处理程序中。可以调整分页逻辑以在最后一页上获得正确数量的记录。
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是报告的现有变量/函数的名称。