Foxtable(狐表)用户栏目专家坐堂 → 怎么实现项目中的所有表 都可以按照上述规则写入操作日志表 便于数据记录查找呢?


  共有4321人关注过本帖树形打印复制链接

主题:怎么实现项目中的所有表 都可以按照上述规则写入操作日志表 便于数据记录查找呢?

帅哥哟,离线,有人找我吗?
cnsjroom
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
怎么实现项目中的所有表 都可以按照上述规则写入操作日志表 便于数据记录查找呢?  发帖心情 Post By:2022/2/10 16:39:00 [只看该作者]

为保证数据具有可溯源性,实现数据在新增、删除、编辑后,都对应写入操作日志表

 

操作日志表有:操作时间、操作内容、操作人

 

操作内容:记录当前表当前行所有列字段名及对应的值  最好是以josn格式记录 

 

后续如果需要进行数据恢复,再将这个josn数据格式转换成当前表当前行对应列字段和列值

 

怎么实现项目中的所有表  都可以按照上述规则写入操作日志表  便于数据记录查找呢?

 

 

 

 

参照论坛例子:【想把这个代码直接写成内部函数,用按钮事件进行使用,提示为申明”e“ 下述代码怎么进行修改呢?实现全部自动获取当前表的所列信息】

Dim dr As DataRow = DataTables("数据操作日志").AddNew
dr("uuid") = e.DataRow("uuid")
dr("用户") = User.Name
dr("涉及表") = e.DataTable.Name
dr("涉及列") = e.DataCol.Name
dr("操作类型")="设备新增"
dr("时间") = Date.Now
dr("操作内容") = """" & e.OldValue &  """ 改成了 """ & e.NewValue & """"
Dim str As String = ""
Dim str1 As String = ""
For Each c As DataCol In e.DataTable.DataCols
    str += c.Name & "=" & e.DataRow.OriginalValue(c.Name) & "|"
    str1 += c.Name & "=" & e.DataRow(c.Name) & "|"
Next
dr("原始数据") = str
dr("改后数据") = str1
dr.Save

[此贴子已经被作者于2022/2/10 17:00:57编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110570 积分:562740 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/2/10 17:02:00 [只看该作者]

参考:http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=110215

自己改改代码,和数据合并为符合自己要求的json数据存到日志表即可

 回到顶部
帅哥哟,离线,有人找我吗?
cnsjroom
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)参考:http://www.foxtable.com/bbs/...  发帖心情 Post By:2022/2/10 18:38:00 [只看该作者]

谢谢老师 !参照论坛例子   代码如下,

在项目中,直接修改对应表里面的数据,可以正常写入新增、修改、删除后操作数据日志

在窗体表中将代码写入对应的窗体表事件后,操作数据  可以正常写入新增、修改、删除后操作数据日志

 

 

下述三个表事件代码,

1、有没有办法直接封装在函数里呢?怎么解决提示未定义”e“的问题呢?

2、有没有办法直接对项目所有的表都能够起作用,包含项目表、窗体表、副本表……

 

项目事件afteropenproject代码如下:

For Each dt As DataTable In DataTables
    dt.GlobalHandler.DataColChanged = True
    dt.GlobalHandler.DataRowAdded = True

    dt.GlobalHandler.DataRowDeleting = True
Next

 

 

全局表datacolchanged代码如下:

If e.DataTable.Name <> "数据操作日志" Then
    If e.DataRow.RowState = 2 Then
        Return
    Else
        Dim dr As DataRow = DataTables("数据操作日志").AddNew
        dr("uuid") = e.DataRow("uuid")
        dr("用户") = User.Name
        dr("涉及表") = e.DataTable.Name
        dr("涉及列") = e.DataCol.Name
        dr("涉及行") = e.DataRow("_Identify")
        dr("时间") = Date.Now
        dr("操作内容") = """" & e.OldValue &  """ 改成了 """ & e.NewValue & """"
        Dim str As String = ""
        Dim str1 As String = ""
        For Each c As DataCol In e.DataTable.DataCols
            str += "[" & c.Name & "]=" & e.DataRow.OriginalValue(c.Name) & "|"
            str1 += "[" & c.Name & "]=" & e.DataRow(c.Name) & "|"
        Next
        dr("原始数据") = str
        dr("改后数据") = str1
    End If
End If

 

全局表datarowadded代码如下:

If e.DataTable.Name <> "数据操作日志" Then
    Dim dr As DataRow = DataTables("数据操作日志").AddNew
    dr("uuid") = e.DataRow("uuid")
    dr("用户") = User.Name
    dr("涉及表") = e.DataTable.Name
    dr("涉及列") = Nothing
    dr("涉及行") = e.DataRow("_Identify")
    dr("时间") = Date.Now
    dr("操作内容") = "增加了一行"
    Dim str As String = ""
    For Each c As DataCol In e.DataTable.DataCols
        str +=  "[" & c.Name & "]=" & e.DataRow(c.Name) & "|"
    Next
    dr("原始数据") = str
End If

 

全局表datarowdeleting代码如下:

If e.DataTable.Name <> "数据操作日志" Then
    Dim dr As DataRow = DataTables("数据操作日志").AddNew
    dr("uuid") = e.DataRow("uuid")
    dr("用户") = User.Name
    dr("涉及表") = e.DataTable.Name
    dr("涉及列") = Nothing
    dr("涉及行") = e.DataRow("_Identify")
    dr("时间") = Date.Now
    dr("操作内容") = "删除了一行"
    Dim str As String = ""
    For Each c As DataCol In e.DataTable.DataCols
        str +=  "[" & c.Name & "]=" & e.DataRow(c.Name) & "|"
    Next
    dr("原始数据") = str
End If

 

[此贴子已经被作者于2022/2/10 18:43:30编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110570 积分:562740 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/2/10 20:32:00 [只看该作者]

1、全局表事件本来就已经是共用的。代码也不多,没有必要再放函数。如果要放,把e作为参数传入即可

2、没有办法。

启用全局表事件的代码需要看情况使用:已加载的表放到afteropenproject;窗口sqltable放到窗口afterload;动态加载的表放到加载之后

 回到顶部
帅哥哟,离线,有人找我吗?
cnsjroom
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)1、全局表事件本来就已经是共用的。代...  发帖心情 Post By:2022/2/11 9:53:00 [只看该作者]

因项目表类型比较多 为了便于引用方便,还是想采用内部函数的方式,经过老师的指点学习,现在代码如下:

 

如果采用当前表的方式写入内部函数

 

修改后数据写入日志【运行后红色部分出错,麻烦老师帮忙修正一下  谢谢!】

Dim e As  String = CurrentTable.name
Dim bb As  DataTable =DataTables(e)
If e <> "数据操作日志" Then
    If bb.RowState = 2 Then
        Return
    Else
        Dim dr As DataRow = DataTables("数据操作日志").AddNew
        dr("uuid") = Tables(e).Current("uuid")
        dr("用户") = User.Name
        dr("涉及表") = e
        dr("涉及列") = Nothing
        dr("涉及行") = Tables(e).Current("_Identify")
        dr("时间") = Date.Now
        dr("操作内容") = """" & e.OldValue &  """ 改成了 """ & e.NewValue & """"
        Dim str1 As String = ""
        Dim str As String = ""
        For Each c As DataCol In bb.DataCols
            str += "[" & c.Name & "]=" & Tables(e).Current.OriginalValue(c.Name) & "|"
            str1 += "[" & c.Name & "]=" & Tables(e).Current(c.Name) & "|"
        Next
        dr("原始数据") = str
        dr("改后数据") = str1
        dr.save
    End If
End If

 

新增数据后写入日志【运行正常

Dim e As  String = CurrentTable.name
Dim bb As  DataTable =DataTables(e)
If e <> "数据操作日志" Then
    Dim dr As DataRow = DataTables("数据操作日志").AddNew
    dr("uuid") = Tables(e).Current("uuid")
    dr("用户") = User.Name
    dr("涉及表") = e
    dr("涉及列") = Nothing
    dr("涉及行") = Tables(e).Current("_Identify")
    dr("时间") = Date.Now
    dr("操作内容") = "增加了一行"
    Dim str As String = ""
    For Each c As DataCol In bb.DataCols
        str +=  "[" & c.Name & "]=" & Tables(e).Current(c.Name) & "|"
    Next
    dr("原始数据") = str
    dr.save
End If

 

 

删除数据后写入日志【运行正常

Dim e As  String = CurrentTable.name
Dim bb As  DataTable =DataTables(e)
If e <> "数据操作日志" Then
    Dim dr As DataRow = DataTables("数据操作日志").AddNew
    dr("uuid") = Tables(e).Current("uuid")
    dr("用户") = User.Name
    dr("涉及表") = e
    dr("涉及列") = Nothing
    dr("涉及行") = Tables(e).Current("_Identify")
    dr("时间") = Date.Now
    dr("操作内容") = "删除了一行"
    Dim str As String = ""
    For Each c As DataCol In bb.DataCols
        str +=  "[" & c.Name & "]=" & Tables(e).Current(c.Name) & "|"
    Next
    dr("原始数据") = str
    dr.save
End If


 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110570 积分:562740 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/2/11 10:13:00 [只看该作者]

Dim e = args(0)
If e.DataTable.Name <> "数据操作日志" Then
    If e.DataRow.RowState = 2 Then
        Return
    Else
        Dim dr As DataRow = DataTables("数据操作日志").AddNew
        dr("uuid") = e.DataRow("uuid")
        dr("用户") = User.Name
        dr("涉及表") = e.DataTable.Name
        dr("涉及列") = e.DataCol.Name
        dr("涉及行") = e.DataRow("_Identify")
        dr("时间") = Date.Now
        dr("操作内容") = """" & e.OldValue &  """ 改成了 """ & e.NewValue & """"
        Dim str As String = ""
        Dim str1 As String = ""
        For Each c As DataCol In e.DataTable.DataCols
            str += "[" & c.Name & "]=" & e.DataRow.OriginalValue(c.Name) & "|"
            str1 += "[" & c.Name & "]=" & e.DataRow(c.Name) & "|"
        Next
        dr("原始数据") = str
        dr("改后数据") = str1
    End If
End If

全局表datacolchanged代码
Functions.Execute("xx函数",e)

 回到顶部