在报告之间传递记录集

时间:2011-04-28 08:31:27

标签: ms-access vba access-vba

我有一个表格会生成邮寄报告。 该表单打开一个记录集,其中包含所需的所有字段。我在徘徊如何将这个记录集传递给报告,这样我就不需要再次打开相同的记录集。

同样,有时我也想在表单之间传递记录集(没有主/子表单关系),我该怎么做?

另一个小问题,当我在数据表视图中打开表单时,它总是非常大。打开时如何限制尺寸?

谢谢!

编辑:

为了更清楚,说我有“FORM”,当用户点击它上面的按钮时,“报告”将会打开。我希望“报告”使用已在“FORM”中创建(打开)的记录集。

同样在“FORM”上,有一个由用户填写的文本框,我也希望在“报告”中显示它。

EDIT2:

我累了但不能通过记录集,也没有从我表格上的文本框填充报表中的字段,非常烦人..

3 个答案:

答案 0 :(得分:2)

您应该只需将正确的SQL语句传递给报表即可完成此操作。这可以使用Opening Arguments完成。

假设您确实需要在表单上看到相同的记录集,那么您需要做什么取决于您打开表单的方式,或者您如何过滤表单。您确实可以使用相同的DAO Recordset对象,并将报表Recordset对象设置为Form的Recordset对象的副本或克隆。但是,这可能不是获得结果的必要条件。

解决方案#1
如果表单使用查询或SQL语句,则可以使用此解决方案。

表单上的代码:

DoCmd.OpenReport "rptReportName", acViewPreview, , , acWindowNormal, Me.RecordSource

报告代码:

Private Sub Report_Open(Cancel As Integer)
    Me.RecordSource = Nz(Me.OpenArgs, "")
End Sub

解决方案#2
如果表单使用表单的filter属性来过滤到正确的记录集,请使用此解决方案。我假设你想要将过滤条件传递给报告。您需要配置报告,以便它使用与您的表单相同的RecordSource(或者它必须至少包含将包含在您的过滤器语句中的表/字段)。问题是将报表的记录源传递给表单不会传递您在表单上设置的任何过滤器。

DoCmd.OpenReport "rptReportName", acViewPreview, , Nz(Me.Filter, ""), acWindowNormal

作为最后一点,无法设置Report的记录集属性。你可以像我已经显示的那样分配一个Recordsource(一个记录源是一个tablename,一个queryname或一个SQL语句)但你不能使用Recordset属性,除非数据库是一个Access Data Project,我不建议在所有

<强> EDIT1
从原始帖子中不清楚OP试图解决的问题。我错误地认为他无法获得相同的记录,以便在他的报告中显示他在表格上的内容。似乎OP担心两次前往服务器检索记录。

因为您无法在Access报表上设置Recordset值,所以最佳选择可能是创建本地Access表并将其用作临时表。我不知道你的记录集通常是多大。如果它非常大(5000多条记录),这个解决方案可能不是一个好主意。我能想到的一个问题是,它会导致您的前端数据库应用程序文件随着时间的推移而膨胀,除非您将文件设置为关闭时运行压缩和修复。

答案 1 :(得分:2)

我认为两次前往服务器的担心是没有根据的。

如果您使用的是Jet / ACE后端,Jet会在本地缓存数据,除非数据发生变化,否则不会重新检索(在这种情况下,我认为您可能需要更新 - 到目前为止的数据,没有?)。

对于服务器数据库,服务器本身可能会缓存结果,特别是如果在两种情况下使用的SQL语句都相同。

这看起来像是一个过早优化的案例。

答案 2 :(得分:0)

好吧如果我从你的问题中了解到你需要通过知道/不知道记录集编号来操纵表格中的数据。
如果是那时你需要改革如何访问表中数据的心态,因为在列表中提升记录集数量并不是很正确的方法,通常我们会提升数据并隐藏记录号。 /> 因此,当您阅读表格时,请尝试将字段传递给变量供以后使用,或将它们直接传递到列表视图 访问表格以获取每个数据的方式来自另一个总是变化的过程 但即使您想保留记录号以供以后使用,也要尝试将名称声明为公共变量ArrayList(),然后当您从表中读取时,可以使用'Variable'.add(RecordNumber)。 因此,当您需要访问特定号码时,请通过调用VariableName(ListViewLineNumber)从列表视图中获取阅读行号 如果此解决方案与您的问题密切相关,请通知我。

相关问题