Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]Access 2010新功能介绍:TableEvents介绍

小龙女  发表于:2009-10-19 01:02:11  
复制

Access 2007以及以前版本都不支持触发器,如果要实现类似功能只能在窗体中编程解决。但是如果用户直接通过编程或者其他方式更改数据表,则无法触发我们在窗体中定义的事件,这对 ACCESS 开发者来说是一个欠缺。
现在Access 2010 (Access 14)弥补了这一点,提供了一个新的功能“Table Events”,下面就来介绍一下该功能。

第一步,先新建一个空的数据库
图片如下:


大家可以看到,Access 2010的数据库格式仍然是Access 2007的accdb格式,并没有做升级。
第二步,显示系统表USysApplicationLog,这个表在后面我们会用到。
然后再建立本次示例用的“员工表”和“员工变更日志”表。
图片如下:




第三步,就可以建立Table Events了
TableEvents与触发器很类似,分:添加后触发(AfterInsert);更新后触发(AfterUpdate);删除后触发(AfterDelete);删除前的有效性验证(Validate Delete);更改前的有效性验证(Validate Change)
而TableEvents具体执行的是一段特殊的宏,称为DataMacro。
这里我只介绍了用AfterUpdate来实现日志的功能,有兴趣的大家可以参考一下我的示例,用其他几种触发事件还可以实现其他的一些功能。
图片如下:




顺便提一下,大家可以看到,在ACCESS 2010中宏的编辑界面也有所更改,比原先更傻瓜化了。

第四步,当编写完一段宏后,通过左侧的收缩图标可以收缩一个代码段,而且代码段可以进行复制、粘贴。
图片如下:


第五步,默认情况下,DataMacro执行时如果出现错误并不会提示,调试的一种方法就是直接查看USysApplicationLog表。
图片如下:


第六步,我测试了在不使用 ACCESS 界面,直接用 ADO 编程方式编辑accdb数据库时是否能触发TableEvents呢?目前测试结果如下:很遗憾,TableEvents的确被触发了,但是仍然有问题,至于是测试代码的语法问题还是微软的BUG就不得而知了,因为毕竟微软连正式的测试版本还没有发布。
另外,如果直接在当前数据库中创建查询来执行操作则没有问题,大家可以看一下示例文件中的TestUpdateEventsWithQuery查询和TestInsertEventsWithQuery查询

'===========================================================
' 过程及函数名:  TestTableEventsByAdo
' 版本号      :  --
' 说明        :  本过程只用于演示TableEvents在编程操作时是否会
'                 被触发。
'                 结果是:会被触发,但是目前仍然有问题,可能是bug
'                 因为微软并未正式公布测试版,所以暂时不清楚。
'                 本次测试的 ACCESS 的版本号为:14.0.4006.1008
' 引用        :  Micrsoft ActiveX Data Ojbects 2.8 Library
'                 以上版本
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  TestTableEventsByAdo
'                 在Access2010中按ALT+F11键转到VBE界面,菜单,
'                 插入,模块,将本段代码复制进代码编辑界面,
'                 将光标点击到Public Function处,按F5键运行,
'                 在立即窗口可以看到打印结果。

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
    '遗憾的是上述代码在执行时会出现如下错误:Extra ) in query expression ''34')'.
    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

 

Top
BruceLee 发表于:2009-10-19 16:43:50
强悍  我2003还没有玩会  2007刚瞅瞅  现在2010都出来了  看来跟不上时代步伐了  嘿嘿

亮亮 发表于:2009-12-26 22:26:35

界面非常漂亮,就是感到有些陌生.有时间试用一下.



总记录:2篇  页次:1/1 9 1 :