Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 在FROM、报表和报表之间传递记录集_Ms Access_Vba - Fatal编程技术网

Ms access 在FROM、报表和报表之间传递记录集

Ms access 在FROM、报表和报表之间传递记录集,ms-access,vba,Ms Access,Vba,我有一个表格,可以生成一份报告供邮寄。 表单打开一个包含所有所需字段的记录集。我想知道如何将此记录集传递给报表,这样就不需要再次打开同一记录集 类似地,有时我还希望在表单之间传递记录集(没有主/子表单关系),我如何才能做到这一点 还有一个小问题,当我在数据表视图中打开一个表单时,它总是非常大。打开时如何限制其大小 谢谢 编辑: 更清楚地说,假设我有“表单”,当用户点击按钮时,“报告”将打开。我希望“Report”使用已在“FORM”中创建(打开)的记录集 同样在“表单”上,有一个文本框,由用户填

我有一个表格,可以生成一份报告供邮寄。 表单打开一个包含所有所需字段的记录集。我想知道如何将此记录集传递给报表,这样就不需要再次打开同一记录集

类似地,有时我还希望在表单之间传递记录集(没有主/子表单关系),我如何才能做到这一点

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

谢谢

编辑:

更清楚地说,假设我有“表单”,当用户点击按钮时,“报告”将打开。我希望“Report”使用已在“FORM”中创建(打开)的记录集

同样在“表单”上,有一个文本框,由用户填写,我也想在“报告”上显示它

编辑2:


我很累,但无法通过记录集,也无法从表单上的文本框填充报告中的字段,非常烦人。

如果我从您的问题中了解到,您需要通过知道/不知道记录集编号来操作表中的数据。
如果是这样的话,那么您需要改变如何访问表中数据的思维方式,因为提升列表中的记录集编号不是非常正确的方式,通常我们会提升数据,而记录编号是隐藏的。
因此,当您读取表时,请尝试将字段传递到变量中以供以后使用,或直接将其传递到列表视图。
访问表以获取来自另一个进程的每个数据的方法,该进程总是不同的。
但是,即使您想保留记录编号以备以后使用,也可以尝试将名称声明为公共变量,如
ArrayList()
,然后当您从表中读取时,可以使用
“变量”。添加(记录编号)

因此,当您需要访问特定号码时,通过调用
VariableName(ListViewLineNumber)

如果此解决方案与您的问题解决方案接近,请通知我

只需将正确的SQL语句传递到报表中,就可以实现这一点。这可以使用开始参数来完成

假设您确实希望报表上的记录集与表单上的记录集相同,则需要执行的操作取决于您如何打开表单,或如何筛选表单。您确实可以使用相同的DAO记录集对象,并将reports记录集对象设置为表单记录集对象的副本或克隆。但是,这可能不是获得所需结果的必要条件

解决方案#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
最后请注意,无法设置报表的记录集属性。您可以指定我已经展示过的记录源(记录源是表名、queryname或SQL语句),但您不能使用记录集属性,除非数据库是Access数据项目,我不建议使用它

Edit1
从最初的帖子中不清楚OP想要解决什么问题。我错误地认为他很难在报告中显示与表格中相同的记录。似乎OP更关心的是两次到服务器检索记录


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

我认为担心两次访问服务器是没有道理的

如果您使用的是Jet/ACE后端,Jet将在本地缓存数据,并且除非数据发生更改,否则不会进行重新检索(在这种情况下,我认为您可能需要最新的数据,不是吗?)

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


在我看来,这似乎是一个过早优化的案例。

您使用的是哪种报告?crystal report还是内置datareport?@Rasel:只是我从Scratch生成的报告我想,您是在尝试显示报告(您将从记录集生成)在窗体中。然后首先插入一个窗体,在此窗体中添加一个框架。在框架中添加与记录集相同数量的标签。然后遍历记录集,并在每个循环中添加运行时记录集中带有标签标题的每一行。在不同位置使用记录集(form/)添加一个模块,并在该模块上将记录集声明为public@darkjh. Rasels propose是一条很好的道路,在任何简单的条件下都是唯一可行的easy@It就是说我必须创建一个全局变量来传递这些值?@darkjh。是的,为此我建议使用全局变量,因为我们可能希望移动到另一个子系统或函数来使用它们。但使用不推荐的局部变量是合乎逻辑的。如何使用这种方法创建访问报告?当然,如果只显示一条记录,则可以绘制