Foxtable(狐表)用户栏目专家坐堂 → 新增行键值的确定?


  共有2077人关注过本帖树形打印复制链接

主题:新增行键值的确定?

帅哥哟,离线,有人找我吗?
luodang2050
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:586 积分:5685 威望:0 精华:0 注册:2014/5/21 10:30:00
新增行键值的确定?  发帖心情 Post By:2018/6/1 10:47:00 [显示全部帖子]

如题,新增一行,在“beforeSaveDaterow”事件中,需要确定其"_Identify",以便将该行日志通过键值关联写到日志表。
但经研究,该值未真正保存时是虚值,多人操作情况下容易造成冲突,请问处理这种情况?

 回到顶部
帅哥哟,离线,有人找我吗?
luodang2050
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:586 积分:5685 威望:0 精华:0 注册:2014/5/21 10:30:00
  发帖心情 Post By:2018/6/1 11:28:00 [显示全部帖子]

这样子的话,适用性不强,部分表格列值是有约束的,默认空值,必须填入才能保存,还有一些必须填入规范数据才能保存。怎么才能确保新增一行,整行数据写入日志,不发生错位呢?
[此贴子已经被作者于2018/6/1 11:31:19编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
luodang2050
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:586 积分:5685 威望:0 精华:0 注册:2014/5/21 10:30:00
  发帖心情 Post By:2018/6/1 12:19:00 [显示全部帖子]

方法一:触发器维护起来应该有点麻烦,而且不好记录操作者及客户端信息。
方法二:直接sql新增行,这个主键值怎么获取?没有主键值日志依然没法维护
[此贴子已经被作者于2018/6/1 12:22:10编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
luodang2050
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:586 积分:5685 威望:0 精华:0 注册:2014/5/21 10:30:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
luodang2050
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:586 积分:5685 威望:0 精华:0 注册:2014/5/21 10:30:00
  发帖心情 Post By: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  

 回到顶部