以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  怎么实现项目中的所有表 都可以按照上述规则写入操作日志表 便于数据记录查找呢?  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=174888)

--  作者:cnsjroom
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2022/2/10 17:02:00
--  
参考:http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=110215

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

--  作者:cnsjroom
--  发布时间:2022/2/10 18:38:00
--  回复:(有点蓝)参考:http://www.foxtable.com/bbs/...

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

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

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

 

 

下述三个表事件代码,

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编辑过]

--  作者:有点蓝
--  发布时间:2022/2/10 20:32:00
--  
1、全局表事件本来就已经是共用的。代码也不多,没有必要再放函数。如果要放,把e作为参数传入即可

2、没有办法。

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

--  作者:cnsjroom
--  发布时间:2022/2/11 9:53:00
--  回复:(有点蓝)1、全局表事件本来就已经是共用的。代...

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

 

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

 

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

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


--  作者:有点蓝
--  发布时间: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)