我简单的说明一下问题:
有主从关系表两张,大致结构如下
主表 (采购单) A: 单号,药库代码,销售商,入库日期,操作员,审核员... ...
从表 (采购明细表) B: 单号,药品代码,进价,产地,有效期至,批准文号... ... 我想,能不能有一个比较好的办法,解决多用户操作的问题。
因为同一张单据,可能会被多个用户进行编辑,甚至可能会有审核操作出现,
被审核员审核的单据,是不能再被操作员编辑的。
我现在采用的是行级锁定的办法,也就是,一旦有用户编辑该笔单据,就锁定
该单据和单据上的明细!一直到那个用户编辑成功或者放弃编辑!这样有个问题,
如果该用户在编辑过程中因为一些外界因素(死机....)没有给单据进行解锁
那就造成了死锁的情况!所以我有额外加入了解锁的功能。所以就变得很麻烦。
花各位高手一点点智慧帮我想想这个问题!
有主从关系表两张,大致结构如下
主表 (采购单) A: 单号,药库代码,销售商,入库日期,操作员,审核员... ...
从表 (采购明细表) B: 单号,药品代码,进价,产地,有效期至,批准文号... ... 我想,能不能有一个比较好的办法,解决多用户操作的问题。
因为同一张单据,可能会被多个用户进行编辑,甚至可能会有审核操作出现,
被审核员审核的单据,是不能再被操作员编辑的。
我现在采用的是行级锁定的办法,也就是,一旦有用户编辑该笔单据,就锁定
该单据和单据上的明细!一直到那个用户编辑成功或者放弃编辑!这样有个问题,
如果该用户在编辑过程中因为一些外界因素(死机....)没有给单据进行解锁
那就造成了死锁的情况!所以我有额外加入了解锁的功能。所以就变得很麻烦。
花各位高手一点点智慧帮我想想这个问题!
解决方案 »
- 请教高手们一个关于程序如何记住一些初始设置的问题,不用数据库,谢谢
- DELPHI一个小技巧,一个小算法
- 在C:\下有一a.bmp文件,我要在button.click时执行以系统默认的打开方式打开c:\a.bmp
- Delphi 2004-09专家榜
- 关于Delphi的默认资源的问题
- 老外的免费空间,国际域名同空间!!!!!
- TCPView是用来做什么的?
- delphi读写xml文件报错
- 大家好,我的一段关于ADO的代码出现了错误,请大家帮忙。谢谢!
- 请问哪有ADO的升级包下载? 谢谢
- 请参与 【征求多用户操作的完美解决办法!分不够可以在开帖子!(300分)】一贴的同志近来接分!!
- delphi调用VC写的dll问题
简单的说吧。一般开单都是主从表结构。在新开单的时候,或许此时你已经得到当前单号,这个单号是唯 一的。
那么其它用户就不能用这个单号在开单了。 1.假设A先提交,那么B用此单号提交的时候应该提示 "此单号已被其它用户引用。"
那么B应改为A单号+1 作为新单号提交。2.我在修改这张单的时候,其它用户也在修改。 其它用户是删除了。还是新增了。还是修改了某一个字段的内容。都是要考虑的。
如果其它用户修改了,应该提醒当前用户其它用户修改了数据。 要不然当前用户修改的是无用的数据。3。 在分析上面的问题,可以采用几种方法来解决这个问题。
1. 开单采用本地表,或者临时表。 (可以减少网络负担)。加快速度。
提交时再作判断
2. 采用事务控制,在提交的时候控制事务。(时间不要太长) 一般少用数据感知控件。3。最好的方法是用存储过程(速度快,减少网络负担),把所有的处理放在这里。在前台调用就是了。我只是提点思路。具体的写。那要看自己对所用的数据库产品的你用delphi的熟练程度了.
谢谢回复,我表达的意思不是很清楚,
的确,在新开单的时候,或许此时你已经得到当前单号,这个单号是唯 一的。
用户甲在制作了一张单据(单据在主表A中)
接着用户甲制作明细(所有记录在明细表B中)
结构应该是这样
A表: 单号, 药库代码,销售商,入库日期, 操作员,审核员
————————————————————————————————————
0001 , 313 , 001, 2003-1-1,002 nullB表: 单号,药品代码,进价,产地,有效期至,批准文号
————————————————————————————————————
0001,x0001 ,12.00, 江苏,2004-3-3,21212121212
0001,x0002 ,13.00, 江西,2005-4-7,31313131313
0001,x0003 ,14.20, 湖北,2006-7-5,41414141414
........假设用户甲做录入到这时候,和她权限相同的乙用户上来了,找到这张单据,进行编辑,
在同一时刻,某个审核员丙上来的,她来进行审核操作。
我的意思是,这种多用户操作该怎么控制?
甲A
乙B
丙C
当A用户调出明细编辑的时候, 这个时候B是不知道的。A在编辑,B也在编辑,或者C这个傻子也来编辑。他们都修改在修改。
这些明细记录你是不是通过where 单号='0001'过滤出来的。 还是主从设置的因为你在读取的时候没有锁定这些记录,所以其它用户修改是可以的。 (我的做法是)用一个本地表,(把这张单据的明细读到本地,),a,b,c都一样, 只要在保存的时候去检测是不是已经有人修改过,如果有人修改过,就把那张修改过后的明细调出来, 再供修改。在程序里用事务控件。+缓存更新。
这样写try
adoconnection.beginstran;
adoquery1.do....
adoconnection.commitstran;
except
adoconneciton.rollback;
end;具体做控制得好的话,也不是很简单,
小弟再次谢过,具体程序上的实现我会仔细考虑。
谢谢!
这个标志更新不到的情况!
如果取道本地库来,冲突问题是可以解决,但
又会应为但据记录数过大而变得缓慢!------------------------------------------------------------
>>在表中设一个字段,记录修改标志。(如:修改次数)
>>更新时把这个字段加入更新条件字段。
>>用异常处理取得。
查事务+缓存更新。
例如:
try
if ADOConnection.InTransaction then
ADOConnection.RollbackTrans;
ADOConnection.BeginTrans; ADOConnection.CommitTrans;
except
ADOConnection.RollbackTrans;
end;
兄弟这么用的时候性能如何?能不能更我透露一二?
我的审核只是在表中有一个审核操作员的字段,没有另外用表
我用的数据库是Oracle,利用了他字段的NULL性质!
------------------------------------
>>我是这个实现:
>>采用临时表向保存数据表或审核表提交,临时表放在数据库服务器端,命名原则采用"计算>>机名"+"临时表名"生成唯一表,就不会重复了。提交时程序自动处理单据编号。
数据就直接提交到保存表中,审核通过就给审核字段填上审核员名。
多用户用吧,没必要改表,只要改一下ADOTABLE的TYPE属性就可以了,好像是选第一个吧,然后提交时用:updatabatch(arall)就可以了啦!
还不明白就联系我吧:[email protected]
把用户的输入表添加一个计算机名字段名或IP字段名,ADOQuery加上条件就OK了。
当时我的解决方法是: 表中添加一个当前正在操作机器的IP字段名
程序中首先添加ping代码检测 操作机器IP是否在线,在线则不能对此处理,不在线则重新对此处理。 操作完成后此字段清空解锁。
to: twlx_0(流星)这个办法倒是挺好!
------------------------------------
>>这种情况我也碰到过
>> 当时我的解决方法是: 表中添加一个当前正在操作机器的IP字段名
>> 程序中首先添加ping代码检测 操作机器IP是否在线,在线则不能对此处理,不在线则>>重新对此处理。 操作完成后此字段清空解锁。
这不是当时不懂吗(看我名字就知道了 : ) )?所以现在来向大家请教啊!
希望兄弟不要嫌我烦!
我当时作的时候把所有的DML写在了后台存储过程里!
前台用的数据库连接是 DOA
我写程序没有多久,好多概念还需要各位帮我修正!
------------------------------------------------------------------------ >>所有的大型的C/S或B/S都是使用事务处理,为什么你们非得可将问题复杂化???
呵呵,挺谦虚的你!