Access中连续窗体中的子窗体

来源:互联网 发布:手机接电话变声软件 编辑:程序博客网 时间:2024/05/17 01:00
   Access的单个窗体的好处是能够在其中安排比较多的元素,方便地显示和修改相关记录源每个记录中的多个元组。并且可以在单个窗体中安排子窗体以表示另外的更多的详细地记录。
    但单个窗体的缺点是从记录的方式讲不是列表式的,因此,要对记录源的多个记录浏览不那么直观。因此,在需要直观方便地浏览多个记录时,往往采取连续窗体的方式。
不过我们如果又需要直观方便地浏览记录,又需要以子窗体的方式察看与单个记录相关的更多的其它信息时,单个窗体一般是不允许在其中放置子窗体的。这样会为我们的使用带来不便。
    此时的解决方案之一是,将窗体设置为连续窗体,但将需要浏览的在一行中放不下的详细信息和子窗体都放在窗体页眉或者页脚上。这样构成的效果有些资源管理器浏览栏的效果。当我们在列表行上移动时,在页眉或页脚上的相关信息自然也就会随着当前记录的改变而变化。
    不过这样操作的结果,在具体程序编制中有几个问题值得注意。
    由于窗体的记录源是多个记录的集合,而浏览到的当前记录仅仅是一条特定的记录,并且我们往往需要对这条特定记录的信息进行操作。在Access中,要想访问窗体中的当前记录的信息只有一种方式,即窗体的CurrentRecord属性。这是一个只读的Variant型变量,其值其实就是通常窗体下方出现的记录浏览器栏中的数字,它是不能用在集合操作(如Sql,DAO的Recordset)中的。因此,应该采用其它的变通办法。
方案之一是直接访问和修改窗体的控件而不访问记录源集合。因为窗体的当前控件总是和记录源的当前记录关联的。比如窗体的记录源为“合同表”,表中有“合同编号”的项。而窗体上有对应的绑定控件“合同编号”,则访问Me!合同编号就是对合同表中当前选定项目的合同编号的访问,如:
Set tb = db.OpenRecordset("SELECT SUM(执行金额) AS 执行金额合计 FROM 招标查询 WHERE 合同编号='" + Me!合同编号 + "'")
    这里,采用Me!合同编号来访问当前记录的合同编号,从而解决不能通过集合操作来获得当前记录的合同编号的问题。
    采用该方法应注意的问题之一是记录源集合中的记录与窗体页面上的数据显示的同步问题。当我们通过窗体绑定控件修改记录源集合中的相应记录时,窗体控件更新后记录源记录通常能够及时更新。但当通过程序等方法在后台修改了记录源的记录后,如果不刷新窗体页面,控件与记录之间的同步也许不能及时发生,因此通常需要利用窗体的Me.Requry方法或重新指定窗体的Me.RecordSource来刷新窗体控件。
    不过当刷新窗体控件或者由于其它原因,某些操作后窗体记录源的当前选定记录会发生变化,这样,窗体控件与记录集中特定记录的对应关系也就发生了变化,这在程序编制中必须给予特别的关系,因此,常常需要在相应的记录操作前后记录并恢复当前记录,从而保证操作的正确性。如:
numRec = Me.CurrentRecord              ‘获得当前记录号
FkJs 2                                 ‘进行可能引起当前记录变化的操作
DoCmd.GoToRecord , , acGoTo, numRec    ‘恢复原来选定的记录
Me!第三期比例.SetFocus                 ‘对原有选定记录进行操作
    采用该方法另一个值得注意的问题是某些时候窗体记录源集合没有记录,此时,对于窗体控件的访问并不能确定窗体记录集合为空,那对于窗体控件的访问将会引发错误。所以,对于可能产生这种情况的操作前应该检测当前记录源记录集合是否为空。可以采用类似的操作:
Dim db as DataBase
Dim tb as RecordSet
Set db=CurrentDb
Set tb.OpenRecordSet(Me.RecordSource)  ‘打开当前窗体记录集合
If tb.RecordCount<1 then               ‘检测记录源是否为空
    ……                               ‘相应的操作
End If
db.Close
tb.Close
原创粉丝点击