以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 多人直接操作表,如何防冲突 (http://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 -- 期盼中。 |