0

我有一个报告(ReportX),我希望从我的数据库中的两个不同的表单(FormA 和 FormB)中打开。我希望这样做,因为 FormA 和 FormB 处理我数据的不同方面,即使它们最终得到相同的输出。ReportX 基于来自 QueryX 的数据。

我遇到的问题是 QueryX 理想情况下会根据当前表单中的当前 RecordID 过滤数据。但我不知道如何做到这一点。我想设计 QueryX,以便 RecordID 的标准本质上是 CurrentForm!RecordID,但研究表明我不能这样做。我必须对每个表格进行单独但相同的查询和报告吗?或者当我单击 OpenReportX 命令按钮时,有没有办法使用 VBA 来定义查询条件?

我已经尝试在 OpenReport 命令中使用 WHERE 条件:

DoCmd.OpenReport "ReportX", acViewPreview, ,"RecordID = " & RecordID

但这并没有显示我希望的结果。我需要显示/打印每个 RecordID 的报告标题和页脚中的页数,以仅反映相关 RecordID 的当前/总页数。(换句话说,如果记录 1 是一页,记录 2 是两页,记录 3 是三页,那么 ReportX 在显示记录 2 的第一页时,应该说“Page 1 of 2”而不是“Page 2 of 6.") 因此,能够使用记录过滤器正确显示和打印单个记录也可以解决我的问题。

哪个是最不麻烦/最可能的解决方案?

4

2 回答 2

0

当您打开报表时,您应该能够使用 WHERE 条件参数来完成此操作:

DoCmd.OpenReport "rptName", acViewPreview, ,"RecordID = " & Me!RecordID

如果我需要对报表的记录源进行比 Where 条件参数可以为我做的更多的控制,我会将 Reports RecordSource 设置为空白(在设计报表之后)。接下来,我编写代码在 Open Report 按钮的 Click 事件中创建正确的 SQL 语句,然后编写代码以打开报表并将 SQL 作为报表的开始参数传递。

Private Sub cmdOpenReport_Click()
    Dim sSQL as string
    sSQL = "SELECT * FROM tblWhatever WHERE RecordID = " & Me!RecordID
    DoCmd.OpenReport "rptReportName", acViewPreview, , , ,sSQL
End Sub

然后在报告的 Open 事件中,我编写代码来设置记录源:

Private Sub Report_Open(Cancel As Integer)
    If IsNull(Me.OpenArgs) = False Then
        Me.RecordSource = Me.OpenArgs
    End If
End Sub

如果这些都没有完成你想要的,那么你有一个不同类型的问题。我有点难以理解为什么您需要所有记录显示在标题中,而在详细信息区域中只显示一条记录。以及您希望如何实现这一点。您可能最好先尝试编写一个查询,该查询为您提供您正在寻找的确切结果,以便您知道它可以完成。

作为旁注,我实际上在我的设计中使用了很少的保存查询。这并不是说使用它们有什么问题,因为该选项是为了您的方便而存在的。我经常在表单和报表上使用原始 SQL,并将 RecordSource 设置为表单或报表打开或加载事件上的 SQL。

于 2013-09-03T20:26:48.027 回答
0

是的,您可以在查询中指向表单数据项,然后在报表中使用该查询。需要在报表运行之前打开表单。至于每条记录都有一个标题,这在报表的设置中以及它如何显示数据中进行控制。

在 Field 或 Critera 中,您可以使用以下格式:

[Forms]![frm_Process_Candidates]![QuestionTemplate]

其中 frm_Process_Candidates 是分配给表单的名称,QuestionTemplate 是表单上控件的名称,或者是表单数据源中的字段。

如果你有一个子表单,中间会有另一个 [Form] 调用。

[Forms]![frm_Dropdown_Admin]![frm_Dropdown_Admin_Detail].[Form]![text22]

访问应该从那里弄清楚。

于 2013-09-03T20:31:37.237 回答