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