我是用ACCESS的VBA编程,VBA的内核和VB6基本一致。有个绑定数据表的子窗体,改了其中一个字段(该字段绑定到一个文本框)的值之后,希望同一记录的另外一个字段的值做相应变化,另外也引起其他表和控件的一系列变化。这所有相关变化我事先写了个函数,因为还有好几处别的地方要用它。我在该文本框的afterupdate事件过程里调用了这个函数,导致写入冲突。原因我也明白,因为子窗体上改动了这个记录,还没彻底改完,我又在所调用的函数里通过ADO又改动了同一记录。我试了下面两种方式处理这个写入冲突,都不太好使。第一种思路是来自http://www.accessoft.com/bbs/showtopic.asp?ID=7001.用VBA断开与窗体的绑定application.echo =false'此行解决操作员看不见画面的变化me.recordsource =""2.再执行表中记录的操作3.用VBA实现与窗体的绑定me.recordsource ="SQL语句"application.echo =True这个思路的缺点在于,执行之后,我的子窗体不再能正确地显示主窗体的内容,好像失去了和主窗体的联系。
第二个思路是,不在afterupdate事件过程里调用我的函数,而在afterupdate事件之后的事件过程里调用我的函数。可是这个也行不通,因为我无法确定,afterupdate事件之后必然发生的有什么事件。因为这是个子窗体,当我改变了子窗体的数据,然后点击主窗体里的控件后,子窗体控件的exit lostfocus事件均不发生。最后,我只好把我调用的那个函数加了个布尔参数,如果是来自子窗体的调用,则不执行那段改动字段值的代码,而把这段代码直接放到文本框的afterupdate事件过程里做。虽然问题算凑合解决了,可还是挺不爽的。有没有什么更好的解决写入冲突的办法啊?比如我有没有可能在afterupdate事件过程里强制更新数据,然后之后我再用ADO改同一记录就不会产生写入冲突了?还有我上面失败的两个思路,是不是真的就不行还是我的具体操作有问题?

解决方案 »

  1.   

    将“另外一个字段”也在窗体中绑定,可以在 beforeupdate 或第一个字段的 change 事件中修改,这样就能一次性自动更新。
      

  2.   


    A)需要的修改很复杂,涉及许多其他表,改“另外一个字段”只是其中一小步。所以,必须调用“多处调用的复杂函数”
    B)这个“复杂函数”,不是同一个数据库连接。我的函数用的是ADO。而窗体好像缺省用的都是DAO.
      

  3.   

    应该改成同一个连接。
    要么函数用 DAO;要么窗体不绑定,一律用 ADO。