相信大家都读过我2004年写的文章 ACCESS表是否支持触发器?《表》 http://access911.net/index.asp?u1=a&u2=72FAB21E11DCE7F3 Access 2007以及以前版本都不支持触发器,如果要实现类似功能只能在窗体中编程解决。但是如果用户直接通过编程或者其他方式更改数据表,则无法触发我们在窗体中定义的事件,这对 ACCESS 开发者来说是一个欠缺。 现在Access 2010 (Access 14)弥补了这一点,提供了一个新的功能“Table Events”,下面就来介绍一下该功能。 为了兼容更多的用户,以下示例都使用了GIF动画做演示,如果需要重放请按 F5 刷新页面即可。 示例数据库下载: http://access911.net/down/eg/eg.TableEvents.Access14.0.4006.1008.rar 注意!上述数据库必须用Access14打开。 第一步,先新建一个空的数据库 具体操作的请看动画: http://access911.net/pic/article/Access2010_TableEvents_CreateBlankDatabase.gif 打开 ACCESS 2010 后单击 Blank Database 图标,然后再单击右侧的 "Create" 按钮新建一个数据库。 大家可以看到,Access 2010的数据库格式仍然是与 Access 2007 相同的accdb格式,并没有做升级。 第二步,显示系统表USysApplicationLog,这个表在后面我们会用到。 然后再建立本次示例用的“员工表”和“员工变更日志”表。 具体操作的请看动画: http://access911.net/pic/article/Access2010_TableEvents_DisplaySystemTable.gif 第三步,就可以建立Table Events了 TableEvents与触发器很类似,分:添加后触发(AfterInsert);更新后触发(AfterUpdate);删除后触发(AfterDelete);删除前的有效性验证(Validate Delete);更改前的有效性验证(Validate Change) 而TableEvents具体执行的是一段特殊的宏,称为DataMacro。 这里我只介绍了用AfterUpdate来实现日志的功能,有兴趣的大家可以参考一下我的示例,用其他几种触发事件还可以实现其他的一些功能。 具体操作的请看动画: http://access911.net/pic/article/Access2010_TableEvents_AddTableEventsAfterUpdate.gif 顺便提一下,大家可以看到,在ACCESS 2010中宏的编辑界面也有所更改,比原先更傻瓜化了。 第四步,当编写完一段宏后,通过左侧的收缩图标可以收缩一个代码段,而且代码段可以进行复制、粘贴。 具体操作的请看动画: http://access911.net/pic/article/Access2010_TableEvents_CopyTableEventsAfterUpdate.gif 第五步,默认情况下,DataMacro执行时如果出现错误并不会提示,调试的一种方法就是直接查看USysApplicationLog表。 我在 SetField 宏中故意设置了一个错误的 Name 参数,大家可以看到当修改了“员工表”后,“员工变更日志”表并没有增加新的日志。而这时我们打开USysApplicationLog表后可以看到新增了一条记录,在Description字段中记录了刚才的错误。 具体操作的请看动画: http://access911.net/pic/article/Access2010_TableEvents_IntroduceUSysApplicationLog.gif 第六步,我测试了在不使用 ACCESS 界面,直接用 ADO 编程方式编辑accdb数据库时是否能触发TableEvents呢?目前测试结果是:可以正常运行。而且如果直接在当前数据库中创建查询来执行操作也没有问题,大家可以看一下示例文件中的TestUpdateEventsWithQuery查询和TestInsertEventsWithQuery查询 '=========================================================== ' 过程及函数名: TestTableEventsByAdo ' 版本号 : -- ' 说明 : 本过程只用于演示TableEvents在编程操作时是否会 ' 被触发。 ' 结果是:能够正常运行 ' 本次测试的 ACCESS 的版本号为:14.0.4006.1008 ' 引用 : Micrsoft ActiveX Data Ojbects 2.8 Library ' 以上版本 ' 输入参数 : -- ' 输出值 : -- ' 返回值 : -- ' 调用演示 : TestTableEventsByAdo ' 在Access2010中按ALT+F11键转到VBE界面,菜单, ' 插入,模块,将本段代码复制进代码编辑界面, ' 将光标点击到Public Function处,按F5键运行, ' 在立即窗口可以看到打印结果。 ' 最后修改日期: 2009-6-13 19:45:00 ' 示例地址 : http://access911.net/?kbid;72FABF1E12DCE6F3 ' 作者 : cg1 ' 网站 : http://access911.net ' 电子邮件 : access911@gmail.com ' 版权 : 作者保留一切权力, ' 请在公布本代码时将本段说明一起公布,谢谢! '=========================================================== Function TestTableEventsByAdo() On Error Resume Next Dim strConnection As String strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CurrentProject.Path & "\eg.TableEvents by access911.net.accdb;" Dim conn As New ADODB.Connection Dim strSql As String Dim lngRows As Long Dim rs As New ADODB.Recordset conn.Open strConnection Set rs = conn.Execute("select count(*) from 员工变更日志") Debug.Print "日志表在添加记录前的记录数", rs(0) '注意:以下代码修改了 员工表,而员工表上已经设置了TableEvents.AfterInsert strSql = "insert into 员工表(员工姓名,工号,部门) values('tt1','bbb','未知')" conn.Execute strSql If Err.Number <> 0 Then Debug.Print strSql, "时出现错误", Err.Description End If Set rs = conn.Execute("select count(*) from 员工变更日志") Debug.Print "日志表在添加记录后的记录数", rs(0) '注意:以下代码修改了 员工表,而员工表上已经设置了TableEvents.AfterUpdate strSql = "update 员工表 set 部门='34'" conn.Execute strSql If Err.Number <> 0 Then Debug.Print strSql, "时出现错误", Err.Description End If Set rs = conn.Execute("select count(*) from 员工变更日志") Debug.Print "日志表在添加记录后的记录数", rs(0) conn.Close End Function |
|