Office中国论坛/Access中国论坛
标题: 子窗体的记录数不断变化,用什么方法捕捉这个变化的记录集? [打印本页]
作者: wuaza 时间: 2006-4-12 18:37
标题: 子窗体的记录数不断变化,用什么方法捕捉这个变化的记录集?
我在主窗体上放了一个查询用的文本框,一个子窗体。
子窗体的记录源随着文本框中输入的值的不同而即时更新。而且有时候可能在子窗体上应用筛选命令进行筛选。
现在我想打印出子窗体上当前显示的所有记录,请问openreport方法的strwhere参数应该怎么写?或者说在vba中怎样调用当前子窗体的所有记录,如果不考虑筛选的情况,是不是可以用recordset或recordsource,那么如何有筛选的情况有该如何办呢?
(主题好,回复妙,加入精华——LucasLynn)
[此贴子已经被LucasLynn于2006-7-26 12:09:05编辑过]
作者: wuaza 时间: 2006-4-12 18:57
李寻欢的例子完全可以借用,还有更简单的吗?
Public Sub OutputSubForm(frmMainForm As Form, frmSubFormName As String)
'*****************************************************
'使用示例:OutputSubForm Me, Me.订单子窗体.Name
'[url=http://www.accfans.net/]http://www.accfans.net 李寻欢[/url]
'2005-08-16
'******************************************************
Dim strSql As String
Dim strRecordSource As String
Dim strLinkChildfields As String
Dim strLinkMasterFields As String
Dim strFilter As String
Dim blnFilterOn As Boolean
Dim strLinkSQL As String
Dim Rs As Recordset
Dim Qd As QueryDef
On Error GoTo Outputerr:
Set Rs = frmMainForm.Controls(frmSubFormName).Form.RecordsetClone
Set Qd = CurrentDb.CreateQueryDef("qryTemp")
strRecordSource = frmMainForm.Controls(frmSubFormName).Form.RecordSource
strLinkChildfields = frmMainForm.Controls(frmSubFormName).LinkChildFields
strLinkMasterFields = frmMainForm.Controls(frmSubFormName).LinkMasterFields
strFilter = frmMainForm.Controls(frmSubFormName).Form.Filter
blnFilterOn = frmMainForm.Controls(frmSubFormName).Form.FilterOn
If strLinkChildfields <> "" Then
Select Case Rs.Fields(strLinkChildfields)
Case dbChar
strLinkSQL = strLinkChildfields & "='" & frmMainForm.Controls(strLinkMasterFields) & "'"
Case Else
strLinkSQL = strLinkChildfields & "=" & frmMainForm.Controls(strLinkMasterFields)
End Select
End If
If blnFilterOn = True Then
If strLinkSQL <> "" Then
strLinkSQL = strLinkSQL & " and " & strFilter
Else
strLinkSQL = strFilter
End If
End If
If InStr(strRecordSource, "Select ") > 0 Then
strSql = Left(strRecordSource, Len(strRecordSource) - 2)
Else
strSql = "Select * From " & strRecordSource
End If
If InStr(strRecordSource, " where ") > 0 Then
If strLinkSQL <> "" Then
strSql = strSql & " and " & strLinkSQL
End If
Else
If strLinkSQL <> "" Then
strSql = strSql & " where " & strLinkSQL
End If
End If
Qd.SQL = strSql
DoCmd.OutputTo acOutputQuery, "qryTemp"
DoCmd.DeleteObject acQuery, "qryTemp"
Rs.Close
Set Rs = Nothing
Exit Sub
Outputerr:
Rs.Close
Set Rs = Nothing
If IsNull(DLookup("[Name]", "MSysObjects", "[Name] = 'qryTemp'")) = False Then
DoCmd.DeleteObject acQuery, "qryTemp"
End If
MsgBox Err.Description
End Sub
作者: zx994398 时间: 2006-4-12 20:02
当然有,从别人那儿偷师的。
DoCmd.OpenReport "报表名称", acViewPreview, , Me.子窗体名称.Form.Filter
对应的报表和子窗体的源文件应该要一样的,这样的方法还可用在菜单栏的上的“按窗体筛选”所形成的数据窗体。
不知明白否?
[此贴子已经被作者于2006-4-12 15:22:07编辑过]
作者: sgrshh29 时间: 2006-4-12 20:14
楼上讲的很好.用Me.Child.Form.RecordSource加上Me.Child.Form.Filter是最简洁的代码写法,适用于任何子窗体与报表之间的数据对应.
如果再加上少量代码,还可以实现未绑定报表的操作,使一个报表可以显示不同的数据源的筛选结果.
[此贴子已经被作者于2006-4-12 12:19:53编辑过]
作者: wuaza 时间: 2006-4-12 22:15
谢谢楼上两位。
DoCmd.OpenReport "报表名称", acViewPreview, , Me.Child.Form.RecordSource & Me.子窗体名称.Form.Filter
这样写我知道是错误的,Me.Child.Form.RecordSource 中应该只取where之后order by之前的字符,这个该怎么截取?
[此贴子已经被作者于2006-4-12 14:15:59编辑过]
作者: sgrshh29 时间: 2006-4-12 23:08
供wuaza大侠参考.个人认为要把窗体或者子窗体筛选后的结果传递到报表,这是最简洁最容易理解的代码了.[attach]17069[/attach]
作者: wuaza 时间: 2006-4-12 23:48
太感谢sgrshh29了,你真是个热心帮助人的高高手!!
我忘了可以在报表的打开事件中设置记录源了。
作者: me815 时间: 2006-7-26 04:14
不是很明白啊.
作者: wang1950317 时间: 2006-7-26 18:15
谢谢sgrshh29大侠共享,真是简洁的要命!
作者: heqing3000 时间: 2006-7-27 18:14
好东西顶上来大家看
作者: zyz218 时间: 2006-7-27 21:37
'多条件交叉查询
Private Sub cmderq_Click()
On Error GoTo Err_cmderq_Click
Dim strwhere As String
strwhere = ""
If Not IsNull(Me.Text1) Then
strwhere = strwhere & "([CodeNo] like '" & Me.Text1 & "') AND "
End If
If Not IsNull(Me.Text2) Then
strwhere = strwhere & "([Production] like '" & Me.Text2 & "') AND "
End If
If Not IsNull(Me.Text3) Then
strwhere = strwhere & "([LineName] like '" & Me.Text3 & "') AND "
End If
If Len(strwhere) > 0 Then
strwhere = Left(strwhere, Len(strwhere) - 5)
End If
Me.Production_Sub.Form.Filter = strwhere
Me.Production_Sub.Form.FilterOn = True
Exit_cmderq_Click:
Exit Sub
Err_cmderq_Click:
MsgBox Err.Description
Resume Exit_cmderq_Click
End Sub
'清除条件,回到原始状
Private Sub cmdcls_Click()
On Error GoTo Err_cmdcls_Click
For Each ctl In Me.Controls
Select Case ctl.ControlType
Case acTextBox
If ctl.Locked = False Then
ctl.Value = Null
Case acComboBox
ctl.Value = Null
Case acCheckBox
ctl.Value = Null
End Select
Next
Me.Production_Sub.Form.Filter = ""
Me.Production_Sub.Form.FilterOn = False
Exit_cmdcls_Click:
Exit Sub
Err_cmdcls_Click:
MsgBox Err.Description
Resume Exit_cmdcls_Click
End Sub
'预览特定的报表
Private Sub cmdrep_Click()
On Error GoTo Err_cmdrep_Click
Dim stDocName, strwhere As String
stDocName = "roduction"
strwhere = Me.Production_Sub.Form.Filter
DoCmd.OpenReport stDocName, acPreview, , strwhere
Exit_cmdrep_Click:
Exit Sub
Err_cmdrep_Click:
MsgBox Err.Description
Resume Exit_cmdrep_Click
End Sub
以上为刘小军做的东东,好像也适合楼主的例子,在下认为以上为一个精典的模板。
作者: nixi 时间: 2006-8-16 13:16
hao
作者: li0533 时间: 2006-8-16 16:39
学习了
作者: longrange 时间: 2006-11-1 23:29
练习中。。
作者: 白河寒秋 时间: 2007-9-18 16:46
在ADP中如何使用呢?ADP中一般将查询条件字符窜直接作为子窗体的数据源的,不涉及到窗体筛选,朋友,帮帮忙呀!
作者: rjacky 时间: 2007-9-18 19:05
6楼的例子早就能满足你要求,不涉及到窗体筛选不是更简单么?
将 DoCmd.OpenReport "rpt", acViewPreview, , Me.Child3.Form.Filter改成DoCmd.OpenReport "rpt", acViewPreview
作者: zoxj 时间: 2007-9-19 00:28
不是很明白啊.
作者: 白河寒秋 时间: 2007-9-20 16:41
rijacky朋友,按你的做法,预览的是全部记录,并不是子窗体中的记录!
作者: garyshang 时间: 2007-10-15 11:44
终于找到了答案
作者: nxjswt 时间: 2007-10-17 12:56
学习
作者: lycxiaolei 时间: 2007-10-27 08:41
嗯,学到很多东东了^^^^
作者: wangwang 时间: 2008-6-15 18:08
dddddddddddd
作者: tdhgj 时间: 2009-2-23 20:03
good
作者: 13555609005 时间: 2009-6-1 17:25
好东西顶上来大家看
作者: 坡芽歌书 时间: 2009-7-10 17:24
ddddddd
作者: 鱼儿游游 时间: 2009-9-6 19:36
作者: bjcompass 时间: 2011-8-29 14:21
zhengqanhua
作者: bjcompass 时间: 2011-8-29 14:22
怎莫传不
上去
作者: Lightsome 时间: 2012-2-1 21:55
thks a lot!
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |