Office中国论坛/Access中国论坛

标题: 多机操作,打开同一记录的冲突问题,如何解决好(高手看一下) [打印本页]

作者: tz-chf    时间: 2008-8-21 10:42
标题: 多机操作,打开同一记录的冲突问题,如何解决好(高手看一下)
(如附图)窗体数据输入“是”,原有记录通过查询窗体打开。出库表有一字段“审核”(是/否)。窗体按钮“审核”、“解除审核”处理相关表(如产品表库存字段、客户表的应付款字段),“审核”后窗体锁定,不能再改数据,“解除审核”后可恢复。所以还不是窗体属性“记录锁定”的问题。

多机操作,可能A、B两个前台同时打开一条记录,

A方式:
窗体数据操作(主表更改、删除,子表增、删、改)之前,先检测出库表的“审核”字段,决定是否能操作。处理好象蛮繁琐。

B方式:加一张AAA表,记录打开窗体记录的情况,防止A、B前台同时操作同一记录。

打开窗体(新记录还要多几句代码)
if AAA表里有记录 then
窗体功能按钮全部锁定
else
在AAA表里加记录,正常打开
end if

离开记录,或删除记录
if 本记录在AAA表里添加的 then
删除AAA表里的记录
end if

因为有可能窗体意外关闭,AAA表里的记录没有删除,还得给用户一个能手工删除的窗体,当然得做得象那么回事。

我想用B方式,还有其它的方式吗?

[ 本帖最后由 tz-chf 于 2008-8-21 10:46 编辑 ]
作者: su_xx    时间: 2008-8-21 11:24
哈哈,楼主的B方式就是你指点我的方式,原来你的问题和我基本一样
我的B方式是这样的
1.建一临时表temp,只有一字段ID,ID=0(表示未操作)
2.在操作窗体打开事件中判断ID
if id =0 then
窗体可操作
update temp 表,让ID=1(表示操作中)

else
窗体不可操作
end if

3.在操作窗体关闭事件中
update temp 表,让ID=0(恢复到原来状态)

如果有人指出有更好方法,我们也可以学习一下.
作者: ui    时间: 2008-8-21 11:56
但如果在同一时间有多人操作,也可能会有冲突
作者: 盗到稻    时间: 2008-8-21 11:57
这东西不错啊,虽然没有更好的思路,只好顶一下以示关注
作者: tz-chf    时间: 2008-8-21 12:37
原帖由 ui 于 2008-8-21 11:56 发表
但如果在同一时间有多人操作,也可能会有冲突


就是为了解决这种可能才这么麻烦,同一时间只能有一个人有可能操作数据。
作者: su_xx    时间: 2008-8-21 13:29
不会吧这么巧吧,都在同一时间打开,总有先后的
作者: WDLRCZT    时间: 2008-8-21 13:29
理论上应该不会出现同时操作的情况,什么事情总有个流程的,只要控制好流程即可
作者: hi-wzj    时间: 2008-8-21 13:52
没发现A方式有什么复杂之处呀?

五个事件:主表更新前、删除前,子表插入前、删除前、更新前 中写代码:
if dlookup("[审核]","出库表","[出库id]=" & me.出库id)=true then Cancel=true
作者: tz-chf    时间: 2008-8-21 13:55
原帖由 su_xx 于 2008-8-21 13:29 发表
不会吧这么巧吧,都在同一时间打开,总有先后的

不是同一时间点,是两个前台都打开。。。
作者: tz-chf    时间: 2008-8-21 14:07
原帖由 hi-wzj 于 2008-8-21 13:52 发表
没发现A方式有什么复杂之处呀?

五个事件:主表更新前、删除前,子表插入前、删除前、更新前 中写代码:
if dlookup("[审核]","出库表","[出库id]=" & me.出库id)=true then Cancel=true


更新前如果cancel=true,还得undo。如果另一前台删除了,或双方都更新数据,还会有点莫名其妙呢。

我用B吧,第一个打开的正常操作,后打开的功能都无效。
作者: hi-wzj    时间: 2008-8-21 14:19
1、更新前如果cancel=true的话并不需要undo,因为数据并未得到更新。
2、记录被共享式打开并有更新时系统会自动出现提示的。比如两前台都打开了某记录。当某前台要更新该记录等,系统自动会提示其他人已打开该记录,同时会问你扔保存还是等待对方关闭该记录还是放弃更改记录。您可以根据提示进行相应的操作。并不会出现莫名其妙的情况。这都是access自带的功能不需要您去操心的。
作者: su_xx    时间: 2008-8-21 14:20
2前台打开也有时间差,可以把程序写的更全面一些,比如一前台在修改数据了,哪么另一个可以查询什么的,不一定所有功能都无效.没有做不到,只有想不到.
作者: hi-wzj    时间: 2008-8-21 14:21
如果您是需要:第一个打开的正常操作,后打开的功能都无效 的话。
工具--选项--高级--默认记录锁定--编辑记录 选上即可。
不需要编制什么代码。
作者: tz-chf    时间: 2008-8-21 14:36
原帖由 hi-wzj 于 2008-8-21 14:19 发表
1、更新前如果cancel=true的话并不需要undo,因为数据并未得到更新。
2、记录被共享式打开并有更新时系统会自动出现提示的。比如两前台都打开了某记录。当某前台要更新该记录等,系统自动会提示其他人已打开该记录, ...


1\不undo,数据是未更新,但进退不得了,离不开这条记录了
2\系统的三个提示,用户不一定明白,不让操作用户倒是能明白

这玩意不是我自己用的,也不是给特定的某个人用的,所以尽量做得能理解一些.

[ 本帖最后由 tz-chf 于 2008-8-21 14:42 编辑 ]
作者: tz-chf    时间: 2008-8-21 14:38
原帖由 hi-wzj 于 2008-8-21 14:21 发表
如果您是需要:第一个打开的正常操作,后打开的功能都无效 的话。
工具--选项--高级--默认记录锁定--编辑记录 选上即可。
不需要编制什么代码。


我不但要锁定记录的操作功能,还要锁定按钮
作者: hi-wzj    时间: 2008-8-21 14:46
1\不undo,数据是未更新,但进退不得了,离不开这条记录了
undo一下不也就一个命令而已吗?
作者: andymark    时间: 2008-8-21 15:05
已审核与和未审核单据我是分开窗体来处理的
未审核窗体的数据源设置为: "select * from 表 wrher 审核字段=fase"
已审核窗体的数据源设置为: "select * from 表 wrher 审核字段=true"
对业务流程进分规范一下,基本不会出现同时修改同一记录的问题
作者: tz-chf    时间: 2008-8-21 15:12
原帖由 hi-wzj 于 2008-8-21 14:46 发表
1\不undo,数据是未更新,但进退不得了,离不开这条记录了
undo一下不也就一个命令而已吗?


对呀!就是需要undo呀
作者: tz-chf    时间: 2008-8-21 15:14
原帖由 andymark 于 2008-8-21 15:05 发表
已审核与和未审核单据我是分开窗体来处理的
未审核窗体的数据源设置为: "select * from 表 wrher 审核字段=fase"
已审核窗体的数据源设置为: "select * from 表 wrher 审核字段=true"
对业务流程进分规范一下,基本 ...


不是已审核、未审核的问题,是可能两台电脑都打开同一记录的问题。
作者: keaibaobao    时间: 2008-9-1 14:53
真好的解释。不错![:32]
作者: arkbnmac    时间: 2008-9-17 11:23
没发现A方式有什么复杂之处呀?

五个事件:主表更新前、删除前,子表插入前、删除前、更新前 中写代码:
if dlookup("[审核]","出库表","[出库id]=" & me.出库id)=true then Cancel=true
这个好~~~




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3