某大型软件的数据库表结构大体是这样的:
出入库单主表:
id(主键,单据的唯一索引值,该最大值保存在其他专门存放最大值的表中,每保存一张新单据自动加1),
单据号,
日期,
供应商或客户,
单据类型(出库或入库)
……
出入库单从表:
id(外键,)
货品编号,
数量,
价格,
……
库存表:
仓库编号(在这里实现分仓管理?)
货品编号,
库存量
……
存表的时候我是这样做的:先把单据号日期供应商等基础信息保存到主表,然后在从表中保存进销明细,最后一条一条修改库存量。
问题1:不出问题还好,如果保存了主表,在保存从表时失败了,那么在主表中残留了一条错误的信息,导致出现了一张只有表头的空表。
主表中这条错误信息怎样处理?
问题2:修改库存量时,是通过录入货品的数量直接加或是减库存表中的数量,还是通过从表中所有该货品进销的叠加来确定库存量?(比较头疼的问题,因为我发现如果该货品在库存表中没有记录的话,update语句根本没有作用,而且没有提示)
最头疼的问题3:怎样修改单据?我能想到的最本的办法是:先把原来单据中的货品库存量一行一行的退回到库存表、全部删除单据、再重新保存一遍新录入的单据。
先这么多问题吧,自己都晕了,我说得不乱吧?有兴趣的朋友指点一下。
出入库单主表:
id(主键,单据的唯一索引值,该最大值保存在其他专门存放最大值的表中,每保存一张新单据自动加1),
单据号,
日期,
供应商或客户,
单据类型(出库或入库)
……
出入库单从表:
id(外键,)
货品编号,
数量,
价格,
……
库存表:
仓库编号(在这里实现分仓管理?)
货品编号,
库存量
……
存表的时候我是这样做的:先把单据号日期供应商等基础信息保存到主表,然后在从表中保存进销明细,最后一条一条修改库存量。
问题1:不出问题还好,如果保存了主表,在保存从表时失败了,那么在主表中残留了一条错误的信息,导致出现了一张只有表头的空表。
主表中这条错误信息怎样处理?
问题2:修改库存量时,是通过录入货品的数量直接加或是减库存表中的数量,还是通过从表中所有该货品进销的叠加来确定库存量?(比较头疼的问题,因为我发现如果该货品在库存表中没有记录的话,update语句根本没有作用,而且没有提示)
最头疼的问题3:怎样修改单据?我能想到的最本的办法是:先把原来单据中的货品库存量一行一行的退回到库存表、全部删除单据、再重新保存一遍新录入的单据。
先这么多问题吧,自己都晕了,我说得不乱吧?有兴趣的朋友指点一下。
2、根据明细表中的数据去更新库存,库存中有的用UPDATE,没有的要INSERT一条负的;
3、修改的时候你的方法是可以的,当然仍要在一个事务中去完成。
ADODB.Connection.Execute([RecordsAffected], [Parameters], [Options As Long = -1]),第一个参数可以返回影响的纪录数,所以执行 UPDATE y 语句后看该返回参数就能知道该纪录是否存在,不存在就再执行 INSERT。
全部取消后再做新增是可行的,对于部分明细被删除的情况就不需要纪录修改前的状态。
datl.BeginTrans
.....许多SQL语句
datl.CommitTrans问题2:
在UPDATE之前 为什么不先SELECT 一下呢?
没有记录 就INSERT INTO
有记录就顺便返回ID号 UPDATE 问题3: 如果是我 我取消 库存表 这个表
需要了解库存的时候 再用
selet 规格,出入库标记,sum(数量) as QTY FROM 表 group by 规格,出入库标记
实时生成 库存表
'保存单据,用事务处理:
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