我简单的说明一下问题: 
    有主从关系表两张,大致结构如下
    主表 (采购单)         A:  单号,药库代码,销售商,入库日期,操作员,审核员... ...
    从表 (采购明细表)     B:  单号,药品代码,进价,产地,有效期至,批准文号... ...   我想,能不能有一个比较好的办法,解决多用户操作的问题。
因为同一张单据,可能会被多个用户进行编辑,甚至可能会有审核操作出现,
被审核员审核的单据,是不能再被操作员编辑的。
   我现在采用的是行级锁定的办法,也就是,一旦有用户编辑该笔单据,就锁定
该单据和单据上的明细!一直到那个用户编辑成功或者放弃编辑!这样有个问题,
如果该用户在编辑过程中因为一些外界因素(死机....)没有给单据进行解锁
那就造成了死锁的情况!所以我有额外加入了解锁的功能。所以就变得很麻烦。
花各位高手一点点智慧帮我想想这个问题!

解决方案 »

  1.   

    你这个问题问得太多了点,一时讲不清。
    简单的说吧。一般开单都是主从表结构。在新开单的时候,或许此时你已经得到当前单号,这个单号是唯 一的。
    那么其它用户就不能用这个单号在开单了。 1.假设A先提交,那么B用此单号提交的时候应该提示 "此单号已被其它用户引用。"
    那么B应改为A单号+1 作为新单号提交。2.我在修改这张单的时候,其它用户也在修改。 其它用户是删除了。还是新增了。还是修改了某一个字段的内容。都是要考虑的。
    如果其它用户修改了,应该提醒当前用户其它用户修改了数据。 要不然当前用户修改的是无用的数据。3。 在分析上面的问题,可以采用几种方法来解决这个问题。
    1. 开单采用本地表,或者临时表。 (可以减少网络负担)。加快速度。
    提交时再作判断
    2. 采用事务控制,在提交的时候控制事务。(时间不要太长) 一般少用数据感知控件。3。最好的方法是用存储过程(速度快,减少网络负担),把所有的处理放在这里。在前台调用就是了。我只是提点思路。具体的写。那要看自己对所用的数据库产品的你用delphi的熟练程度了.
      

  2.   

    To: My_first(小@_@小) 
    谢谢回复,我表达的意思不是很清楚,
    的确,在新开单的时候,或许此时你已经得到当前单号,这个单号是唯 一的。
    用户甲在制作了一张单据(单据在主表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
          ........假设用户甲做录入到这时候,和她权限相同的乙用户上来了,找到这张单据,进行编辑,
    在同一时刻,某个审核员丙上来的,她来进行审核操作。
    我的意思是,这种多用户操作该怎么控制?
      

  3.   

    你可以这样控制。
    甲A
    乙B
    丙C
    当A用户调出明细编辑的时候, 这个时候B是不知道的。A在编辑,B也在编辑,或者C这个傻子也来编辑。他们都修改在修改。 
    这些明细记录你是不是通过where 单号='0001'过滤出来的。 还是主从设置的因为你在读取的时候没有锁定这些记录,所以其它用户修改是可以的。 (我的做法是)用一个本地表,(把这张单据的明细读到本地,),a,b,c都一样, 只要在保存的时候去检测是不是已经有人修改过,如果有人修改过,就把那张修改过后的明细调出来, 再供修改。在程序里用事务控件。+缓存更新。
    这样写try
    adoconnection.beginstran; 
      adoquery1.do....
     adoconnection.commitstran;
    except
    adoconneciton.rollback;
    end;具体做控制得好的话,也不是很简单,
      

  4.   

    我是通过Where查出来的!TO:谢谢My_first(小@_@小) 哥,你这种方法不失为一个好办法!
    小弟再次谢过,具体程序上的实现我会仔细考虑。
    谢谢!
      

  5.   

    这样做,仍不能避免用户在更新时候,因死机或者其他原因造成
    这个标志更新不到的情况!
    如果取道本地库来,冲突问题是可以解决,但
    又会应为但据记录数过大而变得缓慢!------------------------------------------------------------
    >>在表中设一个字段,记录修改标志。(如:修改次数)
    >>更新时把这个字段加入更新条件字段。
    >>用异常处理取得。
      

  6.   

    设置标志是一种做法, 我在大富翁看到有人这么做,在服务器端设置一个标记,如果多长时间断开,就表示有问题,再置标志为0.但这不是好的办法。 最好的方法是用事务+缓存更新。你找一下 csdn,以前的贴子
    查事务+缓存更新。
      

  7.   

    使用事务处理方法,完全可以解决你的问题。
    例如:
    try
      if ADOConnection.InTransaction then
        ADOConnection.RollbackTrans;
      ADOConnection.BeginTrans;    ADOConnection.CommitTrans;
      except
        ADOConnection.RollbackTrans;
      end;
      

  8.   

    那不是要建好多临时表(我有好多中业务有这样的情况!!)
    兄弟这么用的时候性能如何?能不能更我透露一二?
    我的审核只是在表中有一个审核操作员的字段,没有另外用表
    我用的数据库是Oracle,利用了他字段的NULL性质!
    ------------------------------------
    >>我是这个实现:
    >>采用临时表向保存数据表或审核表提交,临时表放在数据库服务器端,命名原则采用"计算>>机名"+"临时表名"生成唯一表,就不会重复了。提交时程序自动处理单据编号。
      

  9.   

    一般1-100台电脑,我用MS SQL Server数据库。
    数据就直接提交到保存表中,审核通过就给审核字段填上审核员名。
      

  10.   

    事务处理啦!!!
    多用户用吧,没必要改表,只要改一下ADOTABLE的TYPE属性就可以了,好像是选第一个吧,然后提交时用:updatabatch(arall)就可以了啦!
    还不明白就联系我吧:[email protected]
      

  11.   

    另有一种方法:
    把用户的输入表添加一个计算机名字段名或IP字段名,ADOQuery加上条件就OK了。
      

  12.   

    这种情况我也碰到过
     当时我的解决方法是: 表中添加一个当前正在操作机器的IP字段名
         程序中首先添加ping代码检测 操作机器IP是否在线,在线则不能对此处理,不在线则重新对此处理。 操作完成后此字段清空解锁。       
      

  13.   


    to: twlx_0(流星)这个办法倒是挺好!
    ------------------------------------
    >>这种情况我也碰到过
    >> 当时我的解决方法是: 表中添加一个当前正在操作机器的IP字段名
    >>     程序中首先添加ping代码检测 操作机器IP是否在线,在线则不能对此处理,不在线则>>重新对此处理。 操作完成后此字段清空解锁。
      

  14.   

    所有的大型的C/S或B/S都是使用事务处理,为什么你们非得可将问题复杂化???
      

  15.   

    to: Wally_wu(不想再写代码) 
      这不是当时不懂吗(看我名字就知道了 : )   )?所以现在来向大家请教啊!
      希望兄弟不要嫌我烦!
      我当时作的时候把所有的DML写在了后台存储过程里!
      前台用的数据库连接是  DOA
      我写程序没有多久,好多概念还需要各位帮我修正!
      
    ------------------------------------------------------------------------  >>所有的大型的C/S或B/S都是使用事务处理,为什么你们非得可将问题复杂化???
      

  16.   

    To: xiaocuo_zrf(刀未锋)
    呵呵,挺谦虚的你!