2016-04-26 40 views
0

我有点失落与这一个。我有一个子窗体,显示基于我的组合框选择的记录。这是这样完成的(代码是从组合框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; 

当执行上层代码时,我得到了符合条件的子窗体中的结果,所以这工作正常。

现在,我想要的是有一个报告,这将显示确切地显示子窗体allready显示。这太复杂了,还是有任何简单的解决方案?

编辑:

我创建了一个新的查询(名为 “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“,以便我可以显示基于我的组合框的记录。这就是我试图打开的报告:

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

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

+0

你会使用相同的源报表作为子表单 –

+0

我做不到该子窗体不在任何可用记录源下列出。我相信,因为子窗体的记录源基于查询(来自JoinTable和Table1)。请看看我的编辑,我认为我在正确的道路上。 – LuckyLuke82

+0

try,DoCmd.OpenReport“SearchReport”,acViewPreview ,,“idy =”&Forms![MyForm]![CmbSearch]并移除WHERE JoinTable.IDy = 3;从查询 – nazark

回答

0

解决。我不得不选择查询记录,我张贴在Edit(对于命令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 
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 
+0

是的,子窗体显示正确的信息,但你的第一个建议不起作用(MyReport.RecordSource = MySubForm.RecordSource)。我在button_click事件中尝试过这种方法 - 错误“找不到方法或数据成员”。在report_Load事件中工作,但仍显示该子表单中的所有记录,而不仅仅是匹配的记录。现在我将测试你的第二个建议。 – LuckyLuke82

+0

_first建议_是一个广泛的例子,您显然已将其适配为Access将不会像这样接受它。真正的解决方案应该工作整齐,如果你完全复制我已经解释 –

+0

第二个建议做同样的事情,它显示该子窗体中的所有记录,而不是显示在我的窗体上。请看看我的编辑,我认为这更接近解决我的问题。 – LuckyLuke82