某大型软件的数据库表结构大体是这样的:
出入库单主表:
id(主键,单据的唯一索引值,该最大值保存在其他专门存放最大值的表中,每保存一张新单据自动加1),
单据号,
日期,
供应商或客户,
单据类型(出库或入库)
……
出入库单从表:
id(外键,)
货品编号,
数量,
价格,
……
库存表:
仓库编号(在这里实现分仓管理?)
货品编号,
库存量
……
存表的时候我是这样做的:先把单据号日期供应商等基础信息保存到主表,然后在从表中保存进销明细,最后一条一条修改库存量。
问题1:不出问题还好,如果保存了主表,在保存从表时失败了,那么在主表中残留了一条错误的信息,导致出现了一张只有表头的空表。
主表中这条错误信息怎样处理?
问题2:修改库存量时,是通过录入货品的数量直接加或是减库存表中的数量,还是通过从表中所有该货品进销的叠加来确定库存量?(比较头疼的问题,因为我发现如果该货品在库存表中没有记录的话,update语句根本没有作用,而且没有提示)
最头疼的问题3:怎样修改单据?我能想到的最本的办法是:先把原来单据中的货品库存量一行一行的退回到库存表、全部删除单据、再重新保存一遍新录入的单据。
先这么多问题吧,自己都晕了,我说得不乱吧?有兴趣的朋友指点一下。



解决方案 »

  1.   

    1、你应该将保存动作所涉及到的所有的新增、更新等操作,放在一个事务中来完成,以确保数据的安全性、完整性;
    2、根据明细表中的数据去更新库存,库存中有的用UPDATE,没有的要INSERT一条负的;
    3、修改的时候你的方法是可以的,当然仍要在一个事务中去完成。
      

  2.   

    成组数据的增删改必须用事务。
    ADODB.Connection.Execute([RecordsAffected], [Parameters], [Options As Long = -1]),第一个参数可以返回影响的纪录数,所以执行 UPDATE y 语句后看该返回参数就能知道该纪录是否存在,不存在就再执行 INSERT。
    全部取消后再做新增是可行的,对于部分明细被删除的情况就不需要纪录修改前的状态。
      

  3.   

    问题1:
    datl.BeginTrans
    .....许多SQL语句 
    datl.CommitTrans问题2:
    在UPDATE之前 为什么不先SELECT 一下呢? 
    没有记录 就INSERT INTO 
    有记录就顺便返回ID号  UPDATE   问题3: 如果是我  我取消 库存表  这个表  
    需要了解库存的时候  再用
    selet 规格,出入库标记,sum(数量) as QTY FROM 表 group by 规格,出入库标记   
    实时生成 库存表
      

  4.   

    selet 仓库,规格,出入库标记,sum(数量) as QTY FROM 表 group by 仓库,规格,出入库标记  
      

  5.   

    '个人思路,仅供参考:
    '保存单据,用事务处理:
       private sub command1()
       on error goto err_proc
       screen.mousepointer=vbhourglass
       conn.begintrans      '开启事务
           '保存主表
           conn.execute "insert into 主表名(...) values(...)"
          '循环保存从表并更新库存表
           with hflexgrid1
              for i=1 to .rows-1
                  '每行记录保存到从表
                  conn.execute "insert into 从表名(...) values(...)"
                  '更新库存表信息(有记录更新无记录则新增)
                    conn.execute " if (select count(*) where 仓库=.. and 货品编号=..)=0 insert into 库存表(...) values(...) else update 库存表 set ... where ..."
              next i
          end with
          conn.committrans    '提交事务
           screen.mousepointer=vbdefault
          msgbox "保存成功!",vbokonly,"提示"
          exit sub
       '保存失败,错误处理     
       Err_Proc:
          conn.rollbacktrans    '保存失败,回滚事务
           msgbox "保存失败!",48,"提示"
          screen.mousepointer=vbdefault
          exit sub
       end sub 
              
      

  6.   

    以上说得很详细了,不过我还是喜欢建库存表,免得每次去SELECT