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

显示附加信息 >>>

如何利用 OldValue 属性为窗体操作添加日志功能?

作者:cg1  摘自:access911.net  :cg1  更新日期:2006-4-24  浏览人次:

 

问题:


Access 中是否存在日志功能?
Access通过链接表、文件共享、工作组文件可以实现多用户操作同时操作一个数据库。但是添加、修改操作却没有留下日志,事后不知道是谁在什么时候更改了什么数据。这个问题该如何解决?

 

回答:


Access 的确没有内建(built-in)日志功能。但是我们可以通过在窗体(formM)上的 BeforeUpdate | Delete 事中编程,保留用户的修改内容、修改时间、用户名等信息作为日志。


'===========================================================
' 过程及函数名:  FormLog
' 版本号      :  2.0
' 说明        :  这里只提供了思路,证明可以通过编写通用的函数来记录用户
'                 在窗体上做的添加、修改、删除。使本函数在窗体的 
'                 BeforeUpdate 和 delete 事件中运行
' 引用        :  --
' 输入参数    :  f             form 对象,按地址传递当前正在修改的窗体对象
'                 IDControl     Control 对象,唯一标识记录的字段所绑定的字段
'                 isDel         Boolean 值,true 表示当前操作为删除,
'                                            false 表示当前操作为添加、修改
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  FormLog Me, Me.产品ID, True
' 最后修改日期:  2006-4-24 23:22:58
' 示例地址    :  http://access911.net/?kbid;72FAB11E1ADCE8F3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Function FormLog(ByRef f As Form, _
                 ByRef IDControl As Control, _
                 Optional ByVal isDel As Boolean)

    Dim c As Control
    For Each c In f.Controls
        If c.ControlType = acTextBox Or _
            c.ControlType = acComboBox Or _
            c.ControlType = acListBox Or _
            c.ControlType = acCheckBox Then
        '假定该控件的来源是字段,如果是公式虽然也符合条件但是肯定不会有存储数据变更
        
            If c.ControlSource <> "" Then
                If isDel = False Then
                    If f.NewRecord = True Then
                        '如果要保存到数据库中去,就直接用 insert 语句添加数据即可
                        Debug.Print "add", f.Name, c.Name, c.OldValue, c.Value
                        AddLog "add", f.Name, c.Name, IDControl.Value, c.OldValue, c.Value
                    Else
                        If c.OldValue <> c.Value Then
                            '如果要保存到数据库中去,就直接用 insert 语句添加数据即可
                            Debug.Print "update", f.Name, c.Name, c.OldValue, c.Value
                            AddLog "update", f.Name, c.Name, IDControl.Value, c.OldValue, c.Value
                        End If
                    End If
                Else
                    AddLog "delete", f.Name, c.Name, IDControl.Value, c.OldValue, Null
                End If
            End If
        End If
    Next
End Function
    
'===========================================================
' 过程及函数名:  AddLog
' 版本号      :  2.0
' 说明        :  根据参数添加日志数据到日志表
'                 OldValue,NewValue 允许为 NULL,并且所有数据类型一律转为 TEXT,并取左 250 位
' 引用        :  --
' 输入参数    :  State         文本,表明当前操作的状态: delete|add|update
'                 FormName      文本,当前操作的窗体名称
'                 ControlName   文本,当前操作的控件名称
'                 IDValue       Variant,唯一标识的值
'                 OldValue      Variant,正在更改的某个控件的原始值
'                 NewValue      Variant,该控件更改后的值
' 输出值      :  --
' 返回值      :  Boolean,true说明添加日志成功,false说明添加日志失败
' 调用演示    :  AddLog "update", f.Name, c.Name, IDControl.Value, c.OldValue, c.Value
' 最后修改日期:  2006-4-24 23:22:58
' 示例地址    :  http://access911.net/?kbid;72FAB11E1ADCE8F3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Function AddLog(ByVal State As String, _
                ByVal FormName As String, _
                ByVal ControlName As String, _
                ByVal IDValue As Variant, _
                ByVal OldValue As Variant, _
                ByVal NewValue As Variant) As Boolean

                
    CheckLogTable
    Dim rs
    Set rs = CreateObject("adodb.recordset")
    rs.Open "cg_log", CurrentProject.Connection, 2, 3
    rs.AddNew
    rs("state") = State
    rs("FormName") = Left(FormName, 150)
    rs("controlname") = Left(ControlName, 150)
    If IsNull(IDValue) = False Then
        rs("recordid") = Left(CStr(IDValue), 150)
    End If
    If IsNull(OldValue) = False Then
        rs("oldvalue") = Left(CStr(OldValue), 250)
    End If
    If IsNull(NewValue) = False Then
        rs("NewValue") = Left(CStr(NewValue), 250)
    End If
    rs("username") = Application.CurrentUser
    rs.Update
    rs.Close
    Set rs = Nothing
    
    If Err.Number <> 0 Then
        AddLog = False
    Else
        AddLog = True
    End If
    
End Function

'===========================================================
' 过程及函数名:  CheckLogTable
' 版本号      :  2.0
' 说明        :  本过程创建名为 cg_log  的日志表
'                 直接用错误陷阱来完成,不会主动去判断某个表存在与否
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  CheckLogTable
' 最后修改日期:  2006-4-24 23:22:58
' 示例地址    :  http://access911.net/?kbid;72FAB11E1ADCE8F3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Sub CheckLogTable()
 
    On Error Resume Next
    Dim strSql As String
    strSql = "create table cg_log (id AUTOINCREMENT(1,1),state text(20),RecordID text(150),FormName text(150),ControlName text(150),OldValue text(255),NewValue text(255),CreateDate date default now(),UserName text(150))"
    CurrentProject.Connection.Execute strSql
    If Err <> 0 Then
        Debug.Print Err.Number, Err.Description
        Err.Clear
    End If
End Sub


图片如下:
按此在新窗口浏览图片
图片如下:
按此在新窗口浏览图片


示例下载:http://access911.net/down/eg/eg_formlog.rar
 (31KB)

如果使用了 ACCESS 的工作组信息文件 MDW 来定义权限的,要记录当前用户的用户名请用 Application.CurrentUser 来取得用户名后保存到日志表就可以了

 


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

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

 

 
相关文章
     没有手动相关文章
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利