以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  多人直接操作表,如何防冲突  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=75037)

--  作者:lake163
--  发布时间:2015/9/25 9:08:00
--  多人直接操作表,如何防冲突
    看了帮助,里面对于工作流和并发冲突有详细的介绍,但要求锁定表,然后设计窗口进行操作。

    如果不设计窗口,直接在表中设置一标志列,当某人开始编辑该行时,判断标志列情况,如为1,则提示无法修改;否则将标志改为1,并进行修改,修改结束后,再将标志改为0。

   请教各位老师,这一思路是否可行,具体事件代码设置在哪里、如何编写?

--  作者:大红袍
--  发布时间:2015/9/25 10:03:00
--  

可以,参考独占编辑

 

http://www.foxtable.com/help/topics/2295.htm

 


--  作者:lake163
--  发布时间:2015/9/25 15:06:00
--  
谢谢老师!
移植到自己的系统中,在添加了关于数据源的设置后,测试基本可用。当一人正在编辑时,另一人如再编辑会得到提示。

但在A、B两人基本同时打开项目的情况下,也有一些小问题(包括示例也存在):
1、A编辑过某行,且执行了保存,这时datatable中数据已修改过,但B的table中仍是原数据,如果其仍进行修改,然后保存,A的修改就无效,最张结果以B的为准。    
    这种情况,有的时候会导致数据的混乱,能否在A修改且保存后,使得B的显示数据自动更新呢?

2、原示例,缺少删除行的判断,在锁定情况下,别人仍可删除。当然,同样存在谁后保存的问题。 
   在BeforeDeletDatarow中写入以下代码,基本能起到作用。

If  e.DataRow("编辑者") <> User.Name Then    \'如果编辑者不是当前用户
    If e.DataRow("编辑者") Is Nothing    \'这句实际无效,但倒可以起到防误删作用   可能需要用NULL能判别
        messagebox.Show("无人锁定仍可删除")     
    Else 
        e.Cancel = True \'取消编辑
        messagebox.Show("他人锁定,不可删除") 
    End If
End If

[此贴子已经被作者于2015/9/25 15:07:04编辑过]

--  作者:大红袍
--  发布时间:2015/9/25 15:12:00
--  

可以加一列,最后修改时间列,修改后,保存为当前时间。

 

当旧数据修改的时候,先判断时间列是不是晚于数据库的时间,然后load此行

 

http://www.foxtable.com/help/topics/2955.htm

 

http://www.foxtable.com/help/topics/0430.htm

 


--  作者:lake163
--  发布时间:2015/9/26 12:11:00
--  
在DataChanged 事件中保存修改的最后时间
在BeforeSelChange 中执行换行时保存数据的操作。(未放在DataChanged中,主要是想减少保存次数)

然后在CurrentChanged (当前行变化后)中执行更新所在行数据的操作
使用 e.Table.Current().load()    速度很慢, 好象更新整个表一样
如果想加入与原有时间的对比:
    If e.Table.Current("修改时间") <> val  提示数据转换有误码

请教老师如何解决,以上思路是否合理?
   

[此贴子已经被作者于2015/9/26 14:01:50编辑过]

--  作者:狐狸爸爸
--  发布时间:2015/9/28 8:33:00
--  
 这个问题,等10月份的更新,会很方便地解决。
--  作者:lake163
--  发布时间:2015/10/4 12:19:00
--  
期盼中。