以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  请教操作日志问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=176136)

--  作者:xnsiwei
--  发布时间:2022/4/1 4:32:00
--  请教操作日志问题
操作日志记录代码如下
1、项目事件切换:LoadUserSetting
For Each dt As DataTable In DataTables
    dt.GlobalHandler.DataColChanged = True \'全局表事件DataColChanged事件列数据变化对所有表有效
    dt.GlobalHandler.DataRowAdded = True \'全局表事件DataRowAdded事件增加行对所有表有效
   Next
2、项目事件加载:AfterOpenProject
For Each dt As DataTable In DataTables
    dt.GlobalHandler.DataColChanged = True \'全局表事件DataColChanged事件列数据变化对所有表有效
    dt.GlobalHandler.DataRowAdded = True \'全局表事件DataRowAdded事件增加行对所有表有效
Next

3、项目全局表事件数据变化:DataColChanged
If e.DataTable.Name <> "数据操作日志" Then
    If e.DataRow.RowState = 2 Then
        Return
    Else
        Dim dr As DataRow = DataTables("数据操作日志").AddNew
        dr("ID") = e.DataRow("_Identify")
        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 = ""
        For Each c As DataCol In e.DataTable.DataCols
            str += c.Name & "=" & e.DataRow(c.Name) & "|"
        Next
        dr("原行数据") = str
dr.save
    End If
End If
4、项目全局表事件增加行:DataRowAdded
If e.DataTable.Name <> "数据操作日志" Then
    Dim dr As DataRow = DataTables("数据操作日志").AddNew
    dr("ID") = e.DataRow("_Identify")
    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
dr.save
End If

出现问题如下:
1、直接以普通用户登录,操作相关表后无法记录日志
2、直接以普通用户登录,切换到开发者,再切换到普通用户,操作相关表后可以记录日志
3、以开发登录再切换到普通用户,操作相关表后可以记录日志
就是说普通用户直接登录不能记录操作日志

请教版主!!


--  作者:有点蓝
--  发布时间:2022/4/1 8:47:00
--  
我测试没有问题
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目18.zip



--  作者:xnsiwei
--  发布时间:2022/4/1 8:56:00
--  
我的表是动态加载的,有关系吗?


--  作者:有点蓝
--  发布时间:2022/4/1 8:59:00
--  
动态加载的,在加载后调用GlobalHandler.DataColChanged = True
--  作者:xnsiwei
--  发布时间:2022/4/1 9:17:00
--  
把全局代码放到:
3、项目事件加载BeforeLoadInnerTable,动态加载表情况下
For Each dt As DataTable In DataTables
    dt.GlobalHandler.DataColChanged = True \'全局表事件DataColChanged事件列数据变化对所有表有效
    dt.GlobalHandler.DataRowAdded = True \'全局表事件DataRowAdded事件增加行对所有表有效
Next
4、项目事件加载BeforeLoadOuterTable,动态加载表情况下
For Each dt As DataTable In DataTables
    dt.GlobalHandler.DataColChanged = True \'全局表事件DataColChanged事件列数据变化对所有表有效
    dt.GlobalHandler.DataRowAdded = True \'全局表事件DataRowAdded事件增加行对所有表有效
Next

动态加载表后,操作日志问题解决

--  作者:xnsiwei
--  发布时间:2022/4/2 9:33:00
--  

一、把全局代码放到下面事件的第一行后会使起初不加载表的代码失效,影响了项目的启动速度:
1、项目事件加载BeforeLoadInnerTable,动态加载表情况下
2、项目事件加载BeforeLoadOuterTable,动态加载表情况下
二、不放到事件的第一行,起初不加载表的代码有效,但记录不了操作日志
三、测试后解决办法:
按照版主的意见,动态加载的,在加载后调用GlobalHandler.DataColChanged = True, GlobalHandler.DataRowAdded = True 

再次谢谢版主!


[此贴子已经被作者于2022/4/3 4:55:36编辑过]

--  作者:yifan3429
--  发布时间:2022/4/2 9:44:00
--  
 在加载后调用怎么做
--  作者:xnsiwei
--  发布时间:2022/4/2 10:25:00
--  把调用代码放在加载代码后面就可

以下内容只有回复后才可以浏览

把调用代码放在加载代码后面就可
[此贴子已经被作者于2022/4/3 4:54:30编辑过]

--  作者:237756360
--  发布时间:2022/4/4 18:21:00
--  
学习


--  作者:xnsiwei
--  发布时间:2022/4/16 9:19:00
--  
谢谢