以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  独占式编辑在普通表中如何运用?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=23180)

--  作者:zpx_2012
--  发布时间:2012/9/4 21:10:00
--  独占式编辑在普通表中如何运用?

各位老师,

 

看了一下工作流中的独占式编辑方法二,此方法是用在双击时打开一个录入窗口录入的情况下,如下代码

Dim cmd As New SQLCommand
Dim
exp As String  = "(编辑者 Is Null Or 编辑者 = \'" & User.Name  & "\') And [_Identify] = " & e.Row("_Identify")
cmd
.CommandText = "Update {员工} Set 编辑者 = \'" & User.Name & "\' Where " & exp
If
cmd.ExecuteNonQuery = 1 Then
   
Forms("编辑窗口").Open()
Else
   
cmd.CommandText = "Select 编辑者 From {员工} Where [_Identify] = " & e.Row("_Identify")
    Dim
nm As String = cmd.ExecuteScalar
    If
nm > "" Then
       
MessageBox.show(nm & "正在编辑此行!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Else
       
cmd.CommandText = "Select Count(*) From {员工} Where [_Identify] = " & e.Row("_Identify")
        If
cmd.ExecuteScalar =0 Then
           
MessageBox.show("此行已被他人删除!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
        End If
    End If
End If

如果没有使用弹出窗口录入数据,而只是在普通表中当鼠标进入某行单元格要输入内容时如何实现类似的功能?

代码要如何修改?

 

谢谢!


--  作者:狐狸爸爸
--  发布时间:2012/9/4 21:45:00
--  
 不可以
--  作者:zpx_2012
--  发布时间:2012/9/4 21:55:00
--  

谢谢狐爸,那很惨啊,你不是建议大家尽量不用窗口时就不要用,但其实系统中每一个表都会有独占式的要求啊,

那还有没有其他变通的方法(直接在表中录入或修改数据时),谢谢!


--  作者:程兴刚
--  发布时间:2012/9/5 1:39:00
--  

1、增加一个逻辑型标记列,PositionChanged进入该行前判断该列的值,如果该列的值为false,允许进入该行操作同时向该列写入值true,操作完成退出该行前向该列写入逻辑值false

2、如果判断该列的值为true,说明已经由用户在该列操作,用e.Cancel = True禁止进入该行操作并提示当前用户排队等候或进行其他与该行无关的操作;

 

        这样理论上也应该可以完成独占式编辑的设计。

 


--  作者:zpx_2012
--  发布时间:2012/9/5 7:12:00
--  

谢谢程版,真的很让人感动啊,快两点了还在回复,但能详细点吗?我在PositionChanged中用以下代码:

表中增加的逻辑列为“正在编辑” 

Dim r As Row = e.Table.Current("正在编辑")
If r("正在编辑") = False Then
    e.Cancel = False
    r("正在编辑") = True
Else
    MessageBox.Show("有人正在编辑此行!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    e.Cancel = True
End If

 

但提示出错


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

 

明天有空时再帮我看看好吗?

谢谢!


--  作者:狐狸爸爸
--  发布时间:2012/9/5 8:19:00
--  
下次更新,在帮助文件增加一个这样的例子。
--  作者:程兴刚
--  发布时间:2012/9/5 8:35:00
--  

由于PositionChanged中不能使用 e.Cancel,改用了禁止编辑列的做法,但比原来想象的更为灵活:

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目3.table

 

1、我用的内部表,正在编辑列打勾的行相当于其他用户正在编辑,大家可以改为外部表,多用户使用前,命令窗口清除正在编辑列的所有勾选;

2、当正在编辑时突然断电可能会导致该行不能再编辑,需要一个清除独占编辑的按钮,该按钮由您的超级管理员通过密码来操作;

 


--  作者:zpx_2012
--  发布时间:2012/9/5 16:11:00
--  
谢谢程版
--  作者:hawkerwin
--  发布时间:2012/9/5 17:14:00
--  
 增加一列   编辑人
StartEdit代码 :

e.Table.Current.DataRow.Load
If e.Row("编辑人")<>"" AndAlso e.Row("编辑人") <> User.Name
    MessageBox.Show("其他用户正在操作此订单,请稍后再进行操作","提示")
End If

BeforeSelChange代码:

If e.OldRange.RowSel <> e.NewRange.RowSel
    If e.OldRange.RowSel >= 0 AndAlso e.OldRange.Rowsel < e.Table.Rows.Count Then
        Dim r1 As Row = e.Table.Rows(e.OldRange.Rowsel)
        Dim r2 As Row = e.Table.Rows(e.NewRange.Rowsel)
        r1.DataRow.Load
        r2.DataRow.Load
        If r1.DataRow("编辑人")= User.Name Then
            r1.DataRow("编辑人")=""
            r1.Save
        End If
        If r2.DataRow("编辑人")="" Then
            r2.DataRow("编辑人")= User.Name
            r2.Save
        ElseIf r2.DataRow("编辑人")<>"" And r2.DataRow("编辑人")<>User.Name Then
            MessageBox.Show("其他用户已经在操作此订单,请稍后再操作","提示")
        End If
    End If
End If

--  作者:hawkerwin
--  发布时间:2012/9/5 17:16:00
--  
BeforeCloseObject代码:
 For Each r As DataRow In DataTables("表明").DataRows
    If r("编辑人")=User.Name Then
        r("编辑人")=""
    End If
Next