设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123下一页
返回列表 发新帖
查看: 8539|回复: 28
打印 上一主题 下一主题

[窗体] 子窗体的记录数不断变化,用什么方法捕捉这个变化的记录集?

[复制链接]
跳转到指定楼层
1#
发表于 2006-4-12 18:37:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在主窗体上放了一个查询用的文本框,一个子窗体。

子窗体的记录源随着文本框中输入的值的不同而即时更新。而且有时候可能在子窗体上应用筛选命令进行筛选。

现在我想打印出子窗体上当前显示的所有记录,请问openreport方法的strwhere参数应该怎么写?或者说在vba中怎样调用当前子窗体的所有记录,如果不考虑筛选的情况,是不是可以用recordset或recordsource,那么如何有筛选的情况有该如何办呢?



(主题好,回复妙,加入精华——LucasLynn)

[此贴子已经被LucasLynn于2006-7-26 12:09:05编辑过]

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2006-4-12 18:57:00 | 只看该作者
李寻欢的例子完全可以借用,还有更简单的吗?

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
3#
发表于 2006-4-12 20:02:00 | 只看该作者
当然有,从别人那儿偷师的。

DoCmd.OpenReport "报表名称", acViewPreview, , Me.子窗体名称.Form.Filter

对应的报表和子窗体的源文件应该要一样的,这样的方法还可用在菜单栏的上的“按窗体筛选”所形成的数据窗体。

不知明白否?

[此贴子已经被作者于2006-4-12 15:22:07编辑过]

4#
发表于 2006-4-12 20:14:00 | 只看该作者
楼上讲的很好.用Me.Child.Form.RecordSource加上Me.Child.Form.Filter是最简洁的代码写法,适用于任何子窗体与报表之间的数据对应.

如果再加上少量代码,还可以实现未绑定报表的操作,使一个报表可以显示不同的数据源的筛选结果.

[此贴子已经被作者于2006-4-12 12:19:53编辑过]

5#
 楼主| 发表于 2006-4-12 22:15:00 | 只看该作者
谢谢楼上两位。

DoCmd.OpenReport "报表名称", acViewPreview, , Me.Child.Form.RecordSource & Me.子窗体名称.Form.Filter

这样写我知道是错误的,Me.Child.Form.RecordSource 中应该只取where之后order by之前的字符,这个该怎么截取?

[此贴子已经被作者于2006-4-12 14:15:59编辑过]

6#
发表于 2006-4-12 23:08:00 | 只看该作者
wuaza大侠参考.个人认为要把窗体或者子窗体筛选后的结果传递到报表,这是最简洁最容易理解的代码了.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
7#
 楼主| 发表于 2006-4-12 23:48:00 | 只看该作者
太感谢sgrshh29了,你真是个热心帮助人的高高手!!

我忘了可以在报表的打开事件中设置记录源了。
8#
发表于 2006-7-26 04:14:00 | 只看该作者
不是很明白啊.

点击这里给我发消息

9#
发表于 2006-7-26 18:15:00 | 只看该作者
谢谢sgrshh29大侠共享,真是简洁的要命!

点击这里给我发消息

10#
发表于 2006-7-27 18:14:00 | 只看该作者
好东西顶上来大家看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-2 09:48 , Processed in 0.123072 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表