以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]有关独占式编辑(已解决)  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=11083)

--  作者:dlovef
--  发布时间:2011/7/7 10:24:00
--  [求助]有关独占式编辑(已解决)
我设计了这样一个独占式编辑窗口

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

当执行如下操作时,
点击修改-》保存或撤消-》修改-》保存或撤消
 这个过程中,内容不做任何修改,
但是第一次点完保存或撤消按钮,后台的编辑者列并不能清空,第二次就可以清空,如此反复。

修改按钮代码如下:
Dim cmd As New SQLCommand
cmd.ConnectionName = _ConnectName
Dim exp As String  = "(sys_locked Is Null Or sys_locked = \'" & _UserName & "\') And [_Identify] = " & Tables("t_yg").Current("_Identify")
cmd.CommandText = "Update {t_yg} Set sys_locked = \'" & _UserName & "\' Where " & exp
If cmd.ExecuteNonQuery = 1 Then
    \'编辑者更新成功,输入框有效化
   此处省略

Else
    cmd.CommandText = "Select sys_locked From {t_yg} Where [_Identify] = " & Tables("t_yg").Current("_Identify")
    Dim nm As String = cmd.ExecuteScalar
    If nm > "" Then
        MessageBox.show(nm & "正在编辑此行!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Else
        cmd.CommandText = "Select Count(*) From {t_yg} Where [_Identify] = " & Tables("t_yg").Current("_Identify")
        If cmd.ExecuteScalar =0 Then
            MessageBox.show("此行已被他人删除!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
        End If
    End If
End If

保存按钮代码:
Tables("t_yg").Current("sys_locked") = Nothing
Tables("t_yg").Current("lastedit") = _UserName
Tables("t_yg").Current.Save()
Tables("t_yg").Current.DataRow.Load()

撤消按钮代码如下:
Tables("t_yg").Current.Reject() \'撤销编辑
Tables("t_yg").Current("sys_locked") = Nothing
Tables("t_yg").Current.Save()
DataTables("t_yg").Load

请帮忙看下是什么原因呢?

[此贴子已经被作者于2011-7-7 14:13:08编辑过]

--  作者:狐狸爸爸
--  发布时间:2011/7/7 10:36:00
--  

If cmd.ExecuteNonQuery = 1 Then
    Tables("t_yg").Current("sys_locked") = _UserName
    DataTables("t_yg").BaseTable.AcceptChanges()
    \'编辑者更新成功,输入框有效化
   \'此处省略


Else
    cmd.CommandText = "Select sys_locked From {t_yg} Where [_Identify] = " & Tables("t_yg").Current("_Identify")
    Dim nm As String = cmd.ExecuteScalar
    If nm > "" Then
        MessageBox.show(nm & "正在编辑此行!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Else
        cmd.CommandText = "Select Count(*) From {t_yg} Where [_Identify] = " & Tables("t_yg").Current("_Identify")
        If cmd.ExecuteScalar =0 Then
            MessageBox.show("此行已被他人删除!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
        End If
    End If
End If

[此贴子已经被作者于2011-7-7 10:40:16编辑过]

--  作者:dlovef
--  发布时间:2011/7/7 11:03:00
--  
狐爸太给力了,问题解决了,这是什么原理呢?帮助文件里都没有找到这样的用法啊?
--  作者:狐狸爸爸
--  发布时间:2011/7/7 11:06:00
--  

如果sys_locked本来就没有内容,那么下面的代码没有任何意义:
 
Tables("t_yg").Current("sys_locked") = Nothing
Tables("t_yg").Save()

 

因为狐表在保存前会比较列的内容是否发生变化,如果没有发生变化,就不会保存。


--  作者:dlovef
--  发布时间:2011/7/7 11:17:00
--  
噢,那是不是假如在改的那一块把datatable重新load一下也会有同样效果呢?
因为前面通过UPDATE把数据表已经更新了。
不知道这个理解对不对。

--  作者:狐狸爸爸
--  发布时间:2011/7/7 11:20:00
--  

你提醒了我,其实下面的代码:

Tables("t_yg").Current("sys_locked") = _UserName
DataTables("t_yg").BaseTable.AcceptChanges()

 

可以改为:

Tables("t_yg").Current.Load

 

这样更合理,也更好理解。