Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 宏  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701887
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

Access 2010新功能介绍:TableEvents

作者:cg1  摘自:access911.net  :cg1  更新日期:2009-6-13  浏览人次:

 

问题:

Access是否支持触发器?如何对ACCESS表是否有修改日志功能?

在 SQL SERVER 中有日志功能,而且还可以通过新建触发器(trigger)来记录用户对表的操作,ACCESS 中是否有此功能?如果有该如何使用?

 

回答:

相信大家都读过我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

 


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     关于数据宏(DataMacro)的测试,TableEvents测试(二)
     ACCESS表是否支持触发器?
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利