以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 新增行键值的确定? (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=119806) |
-- 作者:luodang2050 -- 发布时间:2018/6/1 10:47:00 -- 新增行键值的确定? 如题,新增一行,在“beforeSaveDaterow”事件中,需要确定其"_Identify",以便将该行日志通过键值关联写到日志表。 但经研究,该值未真正保存时是虚值,多人操作情况下容易造成冲突,请问处理这种情况?
|
-- 作者:有点甜 -- 发布时间:2018/6/1 11:20:00 -- 新增一行的时候,马上保存。
beforeSaveDataRow事件判断行状态,如果是新增行(不处理),如果不是新增行,就出你的逻辑处理。 |
-- 作者:luodang2050 -- 发布时间:2018/6/1 11:28:00 -- 这样子的话,适用性不强,部分表格列值是有约束的,默认空值,必须填入才能保存,还有一些必须填入规范数据才能保存。怎么才能确保新增一行,整行数据写入日志,不发生错位呢? [此贴子已经被作者于2018/6/1 11:31:19编辑过]
|
-- 作者:有点甜 -- 发布时间:2018/6/1 11:46:00 -- 以下是引用luodang2050在2018/6/1 11:28:00的发言:
这样子的话,适用性不强,部分表格列值是有约束的,默认空值,必须填入才能保存,还有一些必须填入规范数据才能保存。怎么才能确保新增一行,整行数据写入日志,不发生错位呢? [此贴子已经被作者于2018/6/1 11:31:19编辑过]
方法一:可以在数据库里面编写【触发器】,当新增数据、修改数据的时候,写入日志;
方法二:beforeSaveDataRow事件,写代码处理,合成sql语句,直接insert into 或者 update 新增、插入数据,最后写 e.cancel = true 即可。 |
-- 作者:luodang2050 -- 发布时间:2018/6/1 12:19:00 -- 方法一:触发器维护起来应该有点麻烦,而且不好记录操作者及客户端信息。 方法二:直接sql新增行,这个主键值怎么获取?没有主键值日志依然没法维护
[此贴子已经被作者于2018/6/1 12:22:10编辑过]
|
-- 作者:有点甜 -- 发布时间:2018/6/1 15:08:00 -- insert into 的时候可以返回主键值的。
https://www.baidu.com/baidu?wd=sqlserver+insert+output
或者
https://www.baidu.com/baidu?wd=sqlserver+%40%40_Identify
|
-- 作者:luodang2050 -- 发布时间:2018/6/1 16:35:00 -- 这个可行,谢谢,现又出现如下问题 datatable表有5行数据,其中2行为刚新增的行,通过sql后台方式直接更新了,现需要将后台更新的两行数据替换到新增的2行。 因事件必须写在全局事件“BeforeSaveDataRow”,只能一行一行更新,代码应该怎么写,让新增的2行看起来像直接保存的一样? 现目前的做法为先移除新增行,再追载对应行,但追载时的保存参数如设置为false,则后面行数据会丢失,如设为true,则会因重复保存造成死循环。 edr.Remove edr = edt.AppendLoad("_Identify=" & id0,False)(0) [此贴子已经被作者于2018/6/1 16:48:42编辑过]
|
-- 作者:有点甜 -- 发布时间:2018/6/1 16:58:00 -- 这个没办法。那就不能整体处理吧。
在save之前记录行信息,在你save之后,读取行信息,写日志。 |
-- 作者:luodang2050 -- 发布时间:2018/6/1 18:32:00 -- 终于研究了处理方案了,谢谢版主提醒的思路,不过感觉这样用户体验还是差了,看来还是需要自定义网络编号,进行数据处理更加可靠,目前不知推荐哪种网络编号方案更稳定可靠? 1、全局事件“BeforeSaveDataRow”(标志行错误,且虚拟保存) Dim cmd0 As new SQLCommand cmd0.ConnectionName = edt.ConnectionName cmd0.CommandText = "Insert Into " & sqltn & "(" & cns0 & ") Values (" & vals0 & ")" & ";Select @@IDENTITY" Dim id0 As Integer = cmd0.ExecuteScalar \'插入后提取键值,便于下一步操作 Functions.Execute("表审计日志新增",sqltn,id0,"行新增",log,当前时间) edr.SetError("_Identify",id0) edr.Accept 2、全局事件“PrepareEdit”(查找所有标志错误行,进行批量刷新) If er.DataRow.GetError("_Identify") <> "" \'处理新增行异常 Dim ids As String = "" Dim ids0 As String = "" For Each r As Row In etb.Rows If r.DataRow.GetError("_Identify") <> "" ids0 &= "," & r("_Identify") ids &= "," & r.DataRow.GetError("_Identify") End If Next If ids <> "" ids = ids.TrimStart(",") ids0 = ids0.TrimStart(",") \'msgbox(ids) End If etb.StopRedraw etb.DataTable.RemoveFor("_Identify in (" & ids0 & ")") etb.DataTable.AppendLoad("_Identify in (" & ids & ")") etb.ResumeRedraw Return Nothing End If |
-- 作者:有点蓝 -- 发布时间:2018/6/1 20:00:00 -- 网络编号看:http://www.foxtable.com/webhelp/scr/3008.htm |