以文本方式查看主题

-  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