如何添加空行来完成 Access 报告,使其与打印的表格相匹配?
How to add blank lines to complete an Access report so that it matches a printed form?
我处理一堆政府表格,我经常发现自己试图让 Access 2013 输出与预打印表格相匹配的报告。
大多数表格现在都是 .pdf 格式,因此如果没有附加软件,Access 不能很好地处理它们(据我所知),我无法在用户生产计算机上安装这些软件。
所以我通常将表单重新创建为 Access 报表,但是当我的记录只够半页时,我真的很困难。
如何获取打印所需记录的报告,然后用空白记录填充页面以使 "form" 看起来正确?
我愿意尝试任何可能的解决方案 - 我什至创建了空白记录来尝试完成这项工作。然而,我的目标是自动执行此过程,以便任何用户都可以生成报告并正确打印出来,而无需进行大量操作。
在此表格中,可能会使用部分或全部线条,并且每个人(我有大约 550 人,每个人都有一个单独的表格)有不同数量的线条,具体取决于他们的跳跃次数完成。
好的,您正在将完整的 PDF 表单重新创建为 Access 报告。下半部分是连续报告的详细信息部分。
最简单的方法确实是创建正确数量的 空记录,但会自动执行此操作(例如使用 DAO Recordset.AddNew
)。
我喜欢为此使用一个单独的虚拟 table(与原始 table 具有相同的结构),以免用虚拟记录污染原始 table。
表格有 20 行,所以如果你原来的 table 有当前人的 7 条记录,将 13 条记录插入虚拟 table,使用大的 PK,以便它们被排序到底.
然后使用查询作为报告的记录源,将主 table 与 Jumps 和 Dummy table 的 UNION table.
连接起来
或者 Report.Line()
方法:https://msdn.microsoft.com/en-us/library/office/ff198297.aspx
但是要做到这一点要复杂得多。
我会有一个虚拟 table,只有一个名为 id
的数字字段。使用大于 'extra' 记录的最大数量的记录填充此表格,使用从 1 到 id
的数字来填写表格。现在假设您对报表的原始记录源查询是:
select field1, field2, field3, field4
from myTable
order by field1
并且您总是希望 15 行来填充您的表单,然后将报表的记录源更改为:
select top 15 sort_seq, field1, field2, field3, field4
from (
select 0 as sort_seq, field1, field2, field3, field4
from myTable
union
select id, null, null, null, null
from dummyTable
) as X
order by sort_seq, field1
希望您已找到解决此问题的方法。我发布这个是希望如果其他人发现同样的问题,他们会发现这个是最好的解决方案,因为我现在已经苦苦挣扎了大约 2 天。
我想您至少有两个 table 和一个混合了来自两者的信息的查询,并且您的报告就是从这个查询中得出的。我将把它称为您的 Query1,所以诀窍是当您从您的表单打开报告时,您将使用您的表单的标签编号来制作 Query1 的过滤器,您将从那里获取报告的信息。像这样:
rectotal = DCount("*", "Quote-Report", "[Quote_No]=" & stQtNo)
该指令将计算您在“报价报告”查询中有多少条记录与报价单中的 [Quote_No] 字段具有相同的值,因为您将 stQtNo 变量分配给具有命名为“报价单”;并将此值放在直肠变量上。
现在对于直肠,您需要确定报告中需要多少行。我使用了 28,所以下面的公式将给出填充页面所需的空白行数。
If rectotal / 28 - Int(rectotal / 28) = 0 Then
x = 28
Else
x = 28 * (rectotal / 28 - Int(rectotal / 28))
End If
blanklines = 28 - x
tLines = rectotal + blanklines
当然,您可以使用 15、20 或您希望报告每页打印的行数。变量 blanklines 会给你这个数字。
然后我使用 Access 中的记录集过程打开 table,其中我有将在报告的详细信息部分打印的信息,并使用 blanklines 变量填写我需要的记录,并且Do Until Loop
.
Set db = CurrentDb
Set rs = db.OpenRecordset("Item_QD", dbOpenDynaset, dbseechanges)
Item_QD 是 table
我想在其中插入新记录以填充报告详细信息部分。
x = 0
rs.MoveLast
Do Until x = blanklines
rs.AddNew
rs![Quote_No] = stQtNo
rs![CODE No] = "Z" & x I use the Z and the number so I can erase the records once I don’t need them anymore.
x = x + 1
rs.Update
Loop
请注意,您需要 Dim db As Database
和 Dim rs As Recordset
模块头中私有子程序之外的变量。此外,您的访问权限需要 运行 这两个 类 以便您可以使用它们。
最后,打开报告后,您必须转到详细信息部分并执行重新查询命令以在打印前刷新所有行。需要格式化你的细节单元格才能打印网格线,剩下的就是历史了。
此过程的美妙之处在于,您可以根据需要在报告中添加和处理任意数量的行,并使报价、装箱单、采购订单等具有专业外观。
希望这能解决很多问题。有关如何使用和管理 ACCESS 记录集的快速参考,请访问:https://www.youtube.com/watch?v=WNm17l54z1c
Private Sub Report_Open(Cancel As Integer)
Dim blanklines, tLines As Integer
Dim rectotal, x As Long
Dim stQtNo As String
Set db = CurrentDb
Set rs = db.OpenRecordset("Item_QD", dbOpenDynaset, dbseechanges)
stQtNo = Forms![Quote].[Quote_No]
rectotal = DCount("*", "Quote-Report", "[Quote_No]=" & stQtNo)
If rectotal / 28 - Int(rectotal / 28) = 0 Then
x = 28
Else
x = 28 * (rectotal / 28 - Int(rectotal / 28))
End If
blanklines = 28 - x
tLines = rectotal + blanklines
x = 0
rs.MoveLast
Do Until x = blanklines
rs.AddNew
rs![Quote_No] = stQtNo
rs![CODE No] = "Z" & x
x = x + 1
rs.Update
Loop
End Sub
另一种解决方案。报告背后的代码。我将它用于没有分组且行高不变的简单报告。
Option Compare Database
Option Explicit
Public totalCount As Integer
Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
printBlankRecords getnumberofBlanks
End Sub
Public Sub printBlankRecords(numberBlanks As Integer)
Dim recordCount As Integer
recordCount = DCount("*", Me.RecordSource)
totalCount = totalCount + 1
If totalCount = recordCount Then
Me.NextRecord = False
'once you get to the last record, stay on last record
ElseIf totalCount > recordCount And totalCount < (recordCount + numberBlanks) Then
Me.NextRecord = False
'make the font and backcolor the same appearing to be empty record for each field
Me.RateID.ForeColor = Me.RateID.BackColor
End If
End Sub
Public Function getnumberofBlanks() As Integer
Dim recordCount As Integer
Dim N As Integer, X As Integer
X = 20
recordCount = DCount("*", Me.RecordSource)
If recordCount <= X Then
getnumberofBlanks = X - recordCount
Else
N = 1
Do While N * 21 + X <= recordCount
N = N + 1
Loop
getnumberofBlanks = (N * 21 + X) - recordCount
End If
End Function
我处理一堆政府表格,我经常发现自己试图让 Access 2013 输出与预打印表格相匹配的报告。
大多数表格现在都是 .pdf 格式,因此如果没有附加软件,Access 不能很好地处理它们(据我所知),我无法在用户生产计算机上安装这些软件。
所以我通常将表单重新创建为 Access 报表,但是当我的记录只够半页时,我真的很困难。
如何获取打印所需记录的报告,然后用空白记录填充页面以使 "form" 看起来正确?
我愿意尝试任何可能的解决方案 - 我什至创建了空白记录来尝试完成这项工作。然而,我的目标是自动执行此过程,以便任何用户都可以生成报告并正确打印出来,而无需进行大量操作。
在此表格中,可能会使用部分或全部线条,并且每个人(我有大约 550 人,每个人都有一个单独的表格)有不同数量的线条,具体取决于他们的跳跃次数完成。
好的,您正在将完整的 PDF 表单重新创建为 Access 报告。下半部分是连续报告的详细信息部分。
最简单的方法确实是创建正确数量的 空记录,但会自动执行此操作(例如使用 DAO Recordset.AddNew
)。
我喜欢为此使用一个单独的虚拟 table(与原始 table 具有相同的结构),以免用虚拟记录污染原始 table。
表格有 20 行,所以如果你原来的 table 有当前人的 7 条记录,将 13 条记录插入虚拟 table,使用大的 PK,以便它们被排序到底.
然后使用查询作为报告的记录源,将主 table 与 Jumps 和 Dummy table 的 UNION table.
连接起来或者 Report.Line()
方法:https://msdn.microsoft.com/en-us/library/office/ff198297.aspx
但是要做到这一点要复杂得多。
我会有一个虚拟 table,只有一个名为 id
的数字字段。使用大于 'extra' 记录的最大数量的记录填充此表格,使用从 1 到 id
的数字来填写表格。现在假设您对报表的原始记录源查询是:
select field1, field2, field3, field4
from myTable
order by field1
并且您总是希望 15 行来填充您的表单,然后将报表的记录源更改为:
select top 15 sort_seq, field1, field2, field3, field4
from (
select 0 as sort_seq, field1, field2, field3, field4
from myTable
union
select id, null, null, null, null
from dummyTable
) as X
order by sort_seq, field1
希望您已找到解决此问题的方法。我发布这个是希望如果其他人发现同样的问题,他们会发现这个是最好的解决方案,因为我现在已经苦苦挣扎了大约 2 天。
我想您至少有两个 table 和一个混合了来自两者的信息的查询,并且您的报告就是从这个查询中得出的。我将把它称为您的 Query1,所以诀窍是当您从您的表单打开报告时,您将使用您的表单的标签编号来制作 Query1 的过滤器,您将从那里获取报告的信息。像这样:
rectotal = DCount("*", "Quote-Report", "[Quote_No]=" & stQtNo)
该指令将计算您在“报价报告”查询中有多少条记录与报价单中的 [Quote_No] 字段具有相同的值,因为您将 stQtNo 变量分配给具有命名为“报价单”;并将此值放在直肠变量上。
现在对于直肠,您需要确定报告中需要多少行。我使用了 28,所以下面的公式将给出填充页面所需的空白行数。
If rectotal / 28 - Int(rectotal / 28) = 0 Then
x = 28
Else
x = 28 * (rectotal / 28 - Int(rectotal / 28))
End If
blanklines = 28 - x
tLines = rectotal + blanklines
当然,您可以使用 15、20 或您希望报告每页打印的行数。变量 blanklines 会给你这个数字。
然后我使用 Access 中的记录集过程打开 table,其中我有将在报告的详细信息部分打印的信息,并使用 blanklines 变量填写我需要的记录,并且Do Until Loop
.
Set db = CurrentDb
Set rs = db.OpenRecordset("Item_QD", dbOpenDynaset, dbseechanges)
Item_QD 是 table 我想在其中插入新记录以填充报告详细信息部分。
x = 0
rs.MoveLast
Do Until x = blanklines
rs.AddNew
rs![Quote_No] = stQtNo
rs![CODE No] = "Z" & x I use the Z and the number so I can erase the records once I don’t need them anymore.
x = x + 1
rs.Update
Loop
请注意,您需要 Dim db As Database
和 Dim rs As Recordset
模块头中私有子程序之外的变量。此外,您的访问权限需要 运行 这两个 类 以便您可以使用它们。
最后,打开报告后,您必须转到详细信息部分并执行重新查询命令以在打印前刷新所有行。需要格式化你的细节单元格才能打印网格线,剩下的就是历史了。 此过程的美妙之处在于,您可以根据需要在报告中添加和处理任意数量的行,并使报价、装箱单、采购订单等具有专业外观。
希望这能解决很多问题。有关如何使用和管理 ACCESS 记录集的快速参考,请访问:https://www.youtube.com/watch?v=WNm17l54z1c
Private Sub Report_Open(Cancel As Integer)
Dim blanklines, tLines As Integer
Dim rectotal, x As Long
Dim stQtNo As String
Set db = CurrentDb
Set rs = db.OpenRecordset("Item_QD", dbOpenDynaset, dbseechanges)
stQtNo = Forms![Quote].[Quote_No]
rectotal = DCount("*", "Quote-Report", "[Quote_No]=" & stQtNo)
If rectotal / 28 - Int(rectotal / 28) = 0 Then
x = 28
Else
x = 28 * (rectotal / 28 - Int(rectotal / 28))
End If
blanklines = 28 - x
tLines = rectotal + blanklines
x = 0
rs.MoveLast
Do Until x = blanklines
rs.AddNew
rs![Quote_No] = stQtNo
rs![CODE No] = "Z" & x
x = x + 1
rs.Update
Loop
End Sub
另一种解决方案。报告背后的代码。我将它用于没有分组且行高不变的简单报告。
Option Compare Database
Option Explicit
Public totalCount As Integer
Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
printBlankRecords getnumberofBlanks
End Sub
Public Sub printBlankRecords(numberBlanks As Integer)
Dim recordCount As Integer
recordCount = DCount("*", Me.RecordSource)
totalCount = totalCount + 1
If totalCount = recordCount Then
Me.NextRecord = False
'once you get to the last record, stay on last record
ElseIf totalCount > recordCount And totalCount < (recordCount + numberBlanks) Then
Me.NextRecord = False
'make the font and backcolor the same appearing to be empty record for each field
Me.RateID.ForeColor = Me.RateID.BackColor
End If
End Sub
Public Function getnumberofBlanks() As Integer
Dim recordCount As Integer
Dim N As Integer, X As Integer
X = 20
recordCount = DCount("*", Me.RecordSource)
If recordCount <= X Then
getnumberofBlanks = X - recordCount
Else
N = 1
Do While N * 21 + X <= recordCount
N = N + 1
Loop
getnumberofBlanks = (N * 21 + X) - recordCount
End If
End Function