以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]关于表A修改事项记录到表B的问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=152948)

--  作者:忆似水流年
--  发布时间:2020/7/27 9:35:00
--  [求助]关于表A修改事项记录到表B的问题
表A的字段是 身份证,姓名,单位,学历,电话,年薪
现象想表A有变动的时候,在表B一次记录 修改者,修改时间,身份证,姓名,被修改字段,原值,限值

身份证,姓名就是原始记录的身份证和姓名,如果一条记录多个字段被修改就分开记录,请问下这个可以实现么图片点击可在新窗口打开查看


图片点击可在新窗口打开查看此主题相关图片如下:表a.jpg
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:表b.jpg
图片点击可在新窗口打开查看

先谢谢啦

 
--  作者:有点蓝
--  发布时间:2020/7/27 9:40:00
--  
参考:http://www.foxtable.com/webhelp/topics/1453.htm
--  作者:忆似水流年
--  发布时间:2020/7/27 10:24:00
--  
 蓝大好 我看了文档举例 但那个貌似需要记录的列都是一一对应的
但我想有下面这个效果,一条记录修改保存后,所有被修改的字段是纵向记录的,这里面还涉及到一个原值转字符型的问题 求教下这个怎么写 谢谢您啦

图片点击可在新窗口打开查看此主题相关图片如下:记录效果.jpg
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2020/7/27 10:25:00
--  
find改为select获取所有数据即可:http://www.foxtable.com/webhelp/topics/0400.htm
--  作者:忆似水流年
--  发布时间:2020/7/27 12:19:00
--  
 不好意思啊蓝大 我水平太菜 试着写了下 现在遇到的问题
1.没有等保存就记录了。想在保存后才记录修改内容。
2.不是一条条记录的,直接全改了
3.表B,后面3列怎么写,没看懂文档图片点击可在新窗口打开查看

还请蓝大帮一下 谢谢您啦


以下内容为程序代码:

1 Select Case e.DataCol.Name
2 Case "身份证","姓名","单位","学历","电话","年薪"
3 DataTables("表B").ReplaceFor("修改者", user.Name, True)
4 DataTables("表B").ReplaceFor("修改时间", Date.Now,True)
5 DataTables("表B").ReplaceFor("身份证", e.NewValue,True)
6 DataTables("表B").ReplaceFor("姓名", e.NewValue,True)
7 End Select



图片点击可在新窗口打开查看此主题相关图片如下:目前效果图.jpg
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2020/7/27 13:37:00
--  
麻烦以后发帖贴代码直接贴即可,不要使用代码模式添加什么乱七八糟的序号,增加了复制修改的麻烦

Select Case e.DataCol.Name
    Case "身份证","姓名","单位","学历","电话","年薪"
        Dim dr As DataRow = DataTables("表B").AddNew
        dr("修改者") = user.Name
        dr("修改时间") = Date.Now
        dr("身份证") = e.DataRow("身份证")
        dr("姓名") = e.DataRow("姓名")
        dr("被修改字段") = e.DataCol.name
        dr("原值") = e.oldvalue
        dr("现值") = e.newvalue
End Select

--  作者:忆似水流年
--  发布时间:2020/7/27 14:36:00
--  
收到 谢谢蓝大 这边还有最后一个问题
假设打开表的时候 单元格值是 20
中间修改该单元格三次 21、22、23后保存
请问可以原值记录20 现值记录23 ,忽略中间输错的21和22么

--  作者:有点蓝
--  发布时间:2020/7/27 14:50:00
--  
Select Case e.DataCol.Name
    Case "身份证","姓名","单位","学历","电话","年薪"
        Dim dr As DataRow =DataTables("表B").Find("修改者=\'" & user.Name & "\' and 身份证=\'" & e.DataRow("身份证") & "\'")
        If dr Is Nothing Then
            dr= DataTables("表B").AddNew
            dr("修改者") = user.Name
            dr("修改时间") = Date.Now
            dr("身份证") = e.DataRow("身份证")
            dr("姓名") = e.DataRow("姓名")
            dr("原值") = e.oldvalue
        End If
        dr("被修改字段") = e.DataCol.name
        dr("现值") = e.newvalue
End Select

--  作者:忆似水流年
--  发布时间:2020/7/28 1:11:00
--  

蓝大好!我试了好久,这样写的话,修改同一条记录的不同字段在表B里只会有一条记录,估计是修改者+身份证已经有了,就不再add。

改成

Dim dr As DataRow =DataTables("B").Find("修改者=\'" & user.Name & "\' and 修改字段=\'" & e.Datacol.name & "\'")

这个时候当所有字段都列出后也不会再新增行了

是我之前没表达清楚,我真正想要的是在点保存前,忽略同一个单元格的修改过程只记录原值和最后的值。但点击保存后,再改就是add一行新记录了。

我想象中是不是可以在表B里增加一列已保存,add后dr("已保存") = "否",当保存过该列值就清空,这样上面的判断就变成 修改者+修改字段+已保存 都为空的时候 再add

但我不知道怎么实现保存时自动清空已保存列的值,又或者根本不需要这么复:D

谢谢您啦



[此贴子已经被作者于2020/7/28 1:25:28编辑过]

--  作者:有点蓝
--  发布时间:2020/7/28 8:50:00
--  
代码放到datacolchanging事件
Select Case e.DataCol.Name
    Case "身份证","姓名","单位","学历","电话","年薪"
        Dim dr As DataRow
        If e.DataRow.Rowstate <> DataRowState.Unchanged
            dr = DataTables("表B").Find("修改者=\'" & user.Name & "\' and  被修改字段=\'" & e.DataCol.name & "\'")
        End If
        If dr Is Nothing Then
            dr= DataTables("表B").AddNew
            dr("修改者") = user.Name
            dr("修改时间") = Date.Now
            dr("身份证") = e.DataRow("身份证")
            dr("姓名") = e.DataRow("姓名")
            dr("原值") = e.oldvalue
            dr("被修改字段") = e.DataCol.name
        End If
        dr("现值") = e.newvalue
End Select