各位大佬:
小弟是个新手,做一个前台销售程序,用二台机器连网,一台安装数据库,另一个与之相连,用ODBC连接数据库是相通的,现发
现如下问题:
单独用一台进行(安装数据库的一台同时可作为前台)操作,如每销售一件货品,库存中扣除数量,数据正确,但当二台同时销售
相同的货品(同时按确认键),库存数据出错(多减数据),这是为何?因为小弟是新手第一次接触网络数据库的操作,请各位大佬
赐教,万分感谢!!!

解决方案 »

  1.   

    如果你这样做到最后这个程序的数据进出库都对不起来我估计要,你不应该这样做.出库时不要去减进货的剩余数量,就单独保存一条出库记录,这样最后通过group by ID 得出这个出库的总数
      

  2.   

    delphi在进行数据操作是自动对数据表加锁,不过你可以用事务操作或者直接申明锁来调节。
    Update   Table1   Set   fieldname= 'abc '   with   RowLock
      

  3.   

    各位大佬:
    小弟又做如下测试:
    1.二台机器同时对同样的商品(二个)销售时
    A。同时按确认键,库存数量不对(多减),B不同时按确认键,库存数量正确。
    2.1.二台机器同时对不同种的商品(二个)销售时
    A。同时按确认键,库存数量不对(多减),B不同时按确认键,库存数量正确。
    总之,同时按确认键,库存数量就不对。小弟在想,是否在一台机器操作库存表时需要独占,运行完毕后解除,再给另一台机器运行,这样就可以?
    可小弟只是听说过这些概念,从来没有运用过,这是在DELPHI中实现还是在SQL数据库中实现,如何实现,请各位大佬详解,万分感谢
      

  4.   

    以下是商品销售后在库存表中的操作
          begin
          query7.Close;
          query7.SQL.Clear;
          query7.sql.Add('select * from price where spmc=:sp3 and daile=:da1');//price为库存表
          query7.ParamByName('sp3').AsString:=b11_spmc;商品名
          query7.ParamByName('da1').AsString:=b11_dalei;商品大类名
          query7.Open;
          //Query5.FetchAll;
          query7.Edit;
            query7.FieldByName('kc_sl').AsFloat:= query7.FieldByName('kc_sl').AsFloat-b11_sl;
            query7.Post;
          end;
      

  5.   

    问题:
    (1)没有使用事务
    (2)不要用数据结修改库存,应该用SQL语句
    sql='update price kc_sl=kc_sl-'+floattostr(b11_sl)+' where spmc='''
    +b11_spmc+''' and daile='''+b11_dalei+'''';
    用一个query执行SQL
      

  6.   

    wsz1997:
    如果只用SQL语句是否还需要使用事务,我对事务不太了解,是SQL范畴还是DELPHI
      

  7.   

    是你的Delphi代码写的不太好;  query7.SQL.Text:='update price set kc_sl=kc_sl - FloatToStr(b11_s1) where sp3='''+bll_spmc+''' and da1='''+b11_dalei+''' ';
      query7.ExecSQL;
      

  8.   

    估計是代碼有BUG,認真檢查一下代碼: query7.SQL.Text:='update price set kc_sl=kc_sl - FloatToStr(b11_s1) where sp3='''+bll_spmc+''' and da1='''+b11_dalei+''' ';
      query7.ExecSQL;
      

  9.   

    加不加锁是数据库的事,跟DELPHI无关
      

  10.   

    数据库支持处理事务的话,在Delphi代码中用ADOConnection1.BeginTrans;
    ADOConnection1.CommitTrans;也是一样加锁;