以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  麻烦老师看下这个逻辑怎么  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=142326)

--  作者:初心不改再说未来
--  发布时间:2019/10/24 10:00:00
--  麻烦老师看下这个逻辑怎么
表里有个DataColChanged事件,其中有代码:
If e.DataCol.Name = "操作" Then \'如果是已结帐列的内容变动
    \'   If e.NewValue = True Then \'而且变动后的值是True(已勾选)
    If e.NewValue = "已销售" Then
        e.DataRow("销售人") = User.Name
        e.DataRow.Locked = True \'那么锁定此行
    End If
    DataTables("ask_add").Save()
End If

这样就可以自动添加当前用户为销售人了。

但是,当另外一个用户也想变更此列的时候,我设置了PrepareEdit事件的:
Tables("ask_add").Current.Load()

意图是当其他用户想编辑此行时,先加载最新的数据。


问题是:
现在加载进来的时候, e.DataRow("销售人") = User.Name  会覆盖掉之前的员工数据,把销售人变成了后来刷新此行数据的员工,这个逻辑是哪里出问题了啊

--  作者:初心不改再说未来
--  发布时间:2019/10/24 10:09:00
--  
If e.DataCol.Name = "操作" Then 
    If e.NewValue Is Nothing Then       
        If e.NewValue = "已销售" Then
            e.DataRow("销售人") = User.Name
            e.DataRow.Locked = True \'那么锁定此行
        End If
        DataTables("ask_add").Save()
    End If
Else
    e.Cancel = True
End If
End If


这样加个判断行不行?如果加载后操作列已经有值了就撤销编辑,如果是空值就判断是不是已销售

--  作者:有点蓝
--  发布时间:2019/10/24 10:17:00
--  
参考:http://www.foxtable.com/webhelp/topics/3007.htm
--  作者:初心不改再说未来
--  发布时间:2019/10/24 11:12:00
--  
独占式编辑已经做好了,现在当前用户在编辑时其他用户是不能编辑的
问题是:当前用户编辑成功后,我设置的代码会自动锁定当前行。如果其他用户刷新了表,就没问题,但是当没刷新表时,其他用户的界面里表还是未锁定状态,仍然可以编辑。

--  作者:有点蓝
--  发布时间:2019/10/24 11:14:00
--  
那就再加上即时同步:http://www.foxtable.com/webhelp/topics/3006.htm
--  作者:初心不改再说未来
--  发布时间:2019/10/24 11:15:00
--  
1212
[此贴子已经被作者于2019/10/24 11:26:57编辑过]

--  作者:有点蓝
--  发布时间:2019/10/24 11:23:00
--  
或者datacolchanging事件

Dim dr As DataRow = e.DataTable.sqlfind("[_Identify]= " & e.DataRow("_Identify") & " and [_Locked] = true")
msgbox(dr Is Nothing)
If dr IsNot Nothing Then
    e.Cancel = True
    e.DataRow.Load
End If

--  作者:初心不改再说未来
--  发布时间:2019/10/24 11:29:00
--  
If e.DataCol.Name = "操作" Then \'如果内容发生变动的是产品列
    If e.NewValue IsNot Nothing Then \'如果新值不是空白,也就是产品列的内容不为空
        e.Cancel = True

    ElseIf e.DataCol.Name = "操作" AndAlso e.DataRow("操作") = "单"
       
        Dim nma() As String = {"姓名","日期","编号","人"} \'A表数据来源列
        Dim nmb() As String = {"姓名","日期","编号","姓名"} \'B表数据接收列
        Dim dr As DataRow = DataTables("kefu").AddNew
        e.DataRow("抢单人") = User.Name
        For i As Integer = 0 To nma.Length - 1
            dr(nmb(i)) = e.DataRow(nma(i))
        Next
     
        
        e.DataRow.Locked = True \'那么锁定此行
        
   
    End If
End If


老师这个elseif为啥不执行呢?
[此贴子已经被作者于2019/10/24 11:32:03编辑过]

--  作者:有点蓝
--  发布时间:2019/10/24 11:32:00
--  
没看懂这代码需要实现什么判断逻辑,用文字描述一下
--  作者:初心不改再说未来
--  发布时间:2019/10/24 11:54:00
--  
多人编辑背景下,某列的值可能已经被其他人编辑,但我本地的数据并未刷新,显示的可能是仍然可编辑的状态,
所以在PrepareEdit事件里写了:Tables("add").Current.Load() 编辑之前先加载最新数据。

所以这里的if是判断此行数据在我之前是不是有人已经编辑过了,如果编辑过了就不要更改别人的数据:
If e.DataCol.Name = "操作" Then \'如果内容发生变动的是操作列
    If e.NewValue IsNot Nothing Then \'如果操作列已经有内容,
        e.Cancel = True  ‘则撤销编辑’

如果反之没有被人编辑过,则按照正常流程开始编辑:
所以现在的情况是:如果别人编辑过了,我这边点击“操作列的时候都可以正常看到别人编辑的记录,
但是别人没有编辑过的,我把列更改为“单”的时候,下面的所有操作都不执行了,

    ElseIf e.DataCol.Name = "操作" AndAlso e.DataRow("操作") = "单" ‘如果操作列没有内容,操作后内容变成了字符 单 ’
       
        Dim nma() As String = {"姓名","日期","编号","人"} \'A表数据来源列
        Dim nmb() As String = {"姓名","日期","编号","姓名"} \'B表数据接收列
        Dim dr As DataRow = DataTables("kefu").AddNew
        e.DataRow("抢单人") = User.Name
        For i As Integer = 0 To nma.Length - 1
            dr(nmb(i)) = e.DataRow(nma(i))
        Next
     
        
        e.DataRow.Locked = True \'那么锁定此行
        
   
    End If
End If