Office中国论坛/Access中国论坛

标题: 【新手入门】之二十:“书与书签”——bookmark属性答疑 [打印本页]

作者: roych    时间: 2013-2-6 22:49
标题: 【新手入门】之二十:“书与书签”——bookmark属性答疑
      Recordset和Bookmark就像书与书签的关系,是为smilingkiss答疑而提出来的。这只是我的理解,不当之处,欢迎拍砖。不过,话又说回来,这信手拈来的类比,只为了更形象地说明问题,自然不可能无懈可击,如果非要咬文嚼字,——据闻,广东话有个更形象的说法:“捉字虱”,——揪住某一点不放的话,以我的辩才,大概只有甘拜下风了。^_^

       扯远了,现在回到主题。以下面代码为例:
  1. Private Sub 编号_Click()
  2. Dim MyNum As Long
  3. Dim rst As DAO.Recordset, rst2 As DAO.Recordset
  4. Set rst = Me.Form.Recordset
  5. Set rst2 = Me.Form.Parent.Form.frm_Tab_查档资料_sub1.Form.Recordset
  6. MyNum = rst("编号")
  7. rst2.FindFirst "编号=" & MyNum
  8. rst2.Bookmark = Me.Parent.Form.frm_Tab_查档资料_sub1.Form.Recordset.Bookmark
  9. End Sub
复制代码
先说说附件的要求(详见【新手入门】从“书与女友恕不外借”谈起——浅谈“Bookmark”的使用),rst记录集所对应的窗体为数据表子窗体(以下简称“数据表窗体”),rst2所对应的是同一层级别的另一个单个窗体(以下简称“单个窗体”)。现在是希望点击数据表窗体的编号,单个窗体的每个字段即显示该编号所对应的记录信息。

      好。现在开头的比方,我们先来理清楚这是一个怎么样的关系。

       按前面的说法,记录集相当于书。现在的问题是:哪本才是“书”?单个窗体还是数据表窗体?不清楚?没关系。我们再回到一个简单的问题:我们把一本书的目录和正文内容分开(真是读书“破”万卷啊),现在想找到某一节的内容,该肿么办?按常理,只能先从目录找出页码,然后再去正文里翻了,是不是?
       很好。问题来了:记录集rst(数据表窗体)是不是只起到目录的作用呢?显而易见,rst只是用来查找的工具。而我们的目的是在记录集rst2(单个窗体)中根据已有条件找到相关信息。——显然,“书”只能是单个窗体的记录集了。


       通过上面的讲解,相信大家对目录”已经了然,现在的问题只不过是按什么方式进行检索罢了。对于书籍,一般是根据页码来检索。换句话说,拿什么来作为我们的页码呢?在这里,“编号”字段就相当于页码了。——当然,你也可以设置别的字段为检索条件。就好比一些书可以按关键词或者开头字母来进行检索,但需要注意的是,可能检索出来不止一个结果。这个情况对窗体记录集同样适用。

       根据目录给出的页码,最后一步,便是去翻到书的那一页了。对于记录集来说,便是这一句:
       rst2.Bookmark = Me.Parent.Form.frm_Tab_查档资料_sub1.Form.Recordset.Bookmark
       为什么不是反过来呢:Me.Parent.Form.frm_Tab_查档资料_sub1.Form.Recordset.Bookmark= rst2.Bookmark
       我们对照前面“书”和“目录”的说法就会明白这一点了:我们要找的页码是在“书”(rst2)上而不是“目录”上呀。

       接下来解释几个疑问:
       问题1:bookmark是早已存在的了?
       准确点讲,书签依赖于书而存在。有了书,书签才有意义。类似地,只有窗体的记录集打开了,书签才有效。和现实意义的书签不一样的是,bookmark是不会随着窗体而保存的。也就是说,现在你跳转到某个bookmark后,再次打开窗体时不会跳到之前的那个bookmark去,而是在默认记录上。
       问题2:bookmark属性能否显示?
       事实上。这个问题我还真不知道该怎么回答。按smilingkiss的想法,我觉得他可能是想定量地去描述这个属性,就好比一块豆腐是什么形状的,长宽高各是多少。很遗憾,bookmark属性却像豆腐的柔软性一样,我只知道豆腐是软的,但是我无法告诉你它到底有多软。同样地,Msgbox Me.Parent.Form.frm_Tab_查档资料_sub1.Form.Recordset.Bookmark无法弹出正确信息来。

      不厌其烦讲了这么多,不知道大家的理解又是怎样呢?下面附上官方在帮助文档上的解释与说明:
[attach]51262[/attach]
【新手入门】之一:If分支语句
【新手入门】之二:分支语句总结
【新手入门】之三:循环语句For
【新手入门】之四:循环语句Do和死循环
【新手入门】之五:公共变量与传址过程、传值过程
【新手入门】之六:“悲欢离合总无情”——浅谈Split和Join
【新手入门】之七:嵌套与并列——再谈If流程问题
【新手入门】之八:“连就连”——浅谈“&”和“+”连接符的区别

【新手入门】之九:从百钱百鸡谈起——浅谈“规划求解”兼答lingjiang问
【新手入门】之十:书到用时方恨少——自定义菜单(Access 2003)的制作
【新手入门】之十一:浅谈ADO之序言
【新手入门】之十二:浅谈ADO之Connection
【新手入门】之十三:浅谈ADO之Conmmand(上)
【新手入门】之十四:浅谈ADO之Command(下)
【新手入门】之十五:浅谈ADO之Recordset(上)
【新手入门】之十六:浅谈ADO之Recordset(下)
【新手入门】之十七:浅谈列表框的使用
【新手入门】之十八:双击列表框修改数据
【新手入门】之十九:从“书与女友恕不外借”谈起——浅谈“Bookmark”的使用
【新手入门】之二十:“书与书签”——bookmark属性答疑
【新手入门】之二十一:记录集的“凌迟”——逐条导出记录集

【新手进阶】之一:基础算法(一)
【新手进阶】之二:基础算法(二)
【新手进阶】之三:基础算法(三)
【新手进阶】之四:基础算法(四)
【新手进阶】之五:排序搜索(一)
【新手进阶】之六:排序搜索(二)
【新手进阶】之七:递归算法
【新手进阶】之八:冒泡排序
【新手进阶】之九:浅谈不绑定数据源操作记录
【新手进阶】之十:工作日的计算
【新手进阶】之十一:“庖丁解牛”和“纪昌学射”——浅谈表格式文本数据的导入
【新手进阶】之十二:从四脚腾空的奔马谈起——原来界面可以这样设计
【新手进阶】之十三:Outlook风格导航界面
【新手进阶】之十四:仓库管理系统
作者: tmtony    时间: 2013-2-6 23:13
坐到沙发
作者: smilingkiss    时间: 2013-2-7 10:24
有幸拜读,并且抢到板凳,谢谢,辛苦roy版主了
作者: smilingkiss    时间: 2013-2-7 10:43
Private Sub 编号_Click()
Dim MyNum As Long
Dim rst As DAO.Recordset, rst2 As DAO.Recordset
Set rst = Me.Form.Recordset
Set rst2 = Me.Form.Parent.Form.frm_Tab_查档资料_sub1.Form.Recordset
MyNum = rst("编号")
rst2.FindFirst "编号=" & MyNum

Me.Parent.Form.frm_Tab_查档资料_sub1.Form.Recordset.Bookmark = rst2.Bookmark

End Sub

版主,我把代码改成这样也可以正常运行喔,就是bookmark的赋值反过来了(倒数第二行代码)

作者: roych    时间: 2013-2-8 15:38
smilingkiss 发表于 2013-2-7 10:43
Private Sub 编号_Click()
Dim MyNum As Long
Dim rst As DAO.Recordset, rst2 As DAO.Recordset

从理论上来讲,这两个相同类型的变量,运行当然是没问题的,但是我们需要考虑到实际要求,因此不能反过来赋值。
作者: huangli0356    时间: 2013-2-16 17:31
学习了.谢谢分享..




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3