访问 - 显示子表单结果的报表(连接表)

时间:2016-04-26 09:21:24

标签: vba ms-access access-vba

我对这个有点失落。我有一个子表单,它显示基于我的组合框选择的记录。这是这样完成的(从Combobox After_Update调用代码):

Sub ShowResults1()

 With Forms![MYForm].RecordsetClone
      .FindFirst "[ID] = " & Forms![MyForm]![CmbSearch]

      If Not .NoMatch Then
         If Forms![MyForm].Dirty Then Forms![MyForm].Dirty = False
         Forms![MyForm].MySubfom.SourceObject = "MySubform"
         Forms![MyForm].Bookmark = .Bookmark

      End If

 End With

End Sub

主表单绑定到连接表,这是它的记录源(它通过ID链接到2个表中):

SELECT JoinTable.*, Table1.IDx AS IDx_Table1, Table1.Field1, Table1.Field2, Table1.Field3, Table2.IDy AS IDy_Table2, Table2.Field1, Table2.Field2, Table2.Field3
FROM Table2 INNER JOIN (Table1 INNER JOIN JoinTable ON Table1.IDx = JoinTable.IDx) ON Table2.IDy = JoinTable.IDy;

当执行高级代码时,我得到符合条件的子表单结果,所以这很好。

现在,我想要的是一份报告,它将准确显示已经显示的子窗体。这太复杂了,还是有任何简单的解决方案?

编辑:

我创建了一个新查询(名为" SearchReport"):

   SELECT Table2.IDy, Table2.Field1, Table2.Field3
    FROM Table2 INNER JOIN (Table1 INNER JOIN Join_Table ON Table1.IDx = JoinTable.IDx) ON Table2.IDy = JoinTable.IDy
    WHERE JoinTable.IDy=3;

此查询成功显示了我想要的记录,但只显示了ID 3.现在我删除了" WHERE JoinTable.IDy = 3"来自Query,以便我可以根据我的组合框显示记录。这就是我尝试打开报告的方式:

   DoCmd.OpenReport "MyReport", acViewReport, "SearchReport", WhereCondition:="JoinTable.IDy =" & Forms![MyForm]![CmbSearch]

但是当打开报告时,Access会一直询问输入IDy的参数值。即使我输入3,也会显示该查询中显示的所有记录。有什么不对?

2 个答案:

答案 0 :(得分:1)

表单报告都有Record Source属性。

在此Record Source属性中,您可以指定表,查询或纯SQL语句。

在VBA中,如果您的子窗体已打开并显示正确的信息,则可以说MyReport.RecordSource = MySubForm.RecordSource

但实现你想要的最合适的方法是:

在报告的代码中,添加以下公开子项:

Public Sub Open_This_Report(strSQL)
    Me.RecordSource = strSQL
End Sub

在表单中,使用此ClickEvent添加一个按钮:

Private Sub myButton_Click()
    DoCmd.OpenReport "name_of_the_report", acViewNormal
    Call Report_name_of_the_report.Open_This_Report(me!SubFormName.Form.RecordSource)
    'or
    Call Report_name_of_the_report.Open_This_Report("specific SQL query")
End Sub

答案 1 :(得分:0)

解决。我必须从我在编辑中发布的Query中选择记录(命令button_click事件的完整代码 - 表单上的按钮):

   Dim sql As String

         sql =  "SELECT Table2.IDy, Table2.Field1, Table2.Field3" & _
" FROM Table2 INNER JOIN (Table1 INNER JOIN Join_Table ON Table1.IDx =" & _                   

"JoinTable.IDx) ON Table2.IDy = JoinTable.IDy"  & Forms![MyForm]![CmbSearch] DoCmd.OpenReport "APO_IIS", acViewReport

       Reports![Myreport].RecordSource = sql