日期:2014-05-18  浏览次数:20552 次

MsSql 多事务 处理
我碰到的问题是出库的, 
列有 “产品ID“,“出库数量”
一次出库会有上千个产品ID,
例如,产品ID为 A0001要出库1000,步骤是:
1、判断要出库的产品ID是否存在。
2、判断要出库的产品ID库存是否 足够 扣减
3、如果库存充足,要有出库记录、库存扣减

这样子该编程怎么实现啊,好复杂啊。

问题1:出库记录、库存扣减 怎么生成这个SQL脚本合理些呢?

求助大牛们!

------解决方案--------------------
所有内容不要程序中实现了,trigger中处理吧
1.存不存在,出库时判断下就可以了,不存在提示自定义错误,直接return,此步也可在程序中实现
2.够不够扣,其接扣,若余数小于0给出错误,回滚记录rollback;return;,此步最好trigger中实现
3.出库记录在trigger中记录到其他表,其实你的单据就应有出仓的那一层,本身就是个记录,何需另外记录
------解决方案--------------------
探讨
所有内容不要程序中实现了,trigger中处理吧
1.存不存在,出库时判断下就可以了,不存在提示自定义错误,直接return,此步也可在程序中实现
2.够不够扣,其接扣,若余数小于0给出错误,回滚记录rollback;return;,此步最好trigger中实现
3.出库记录在trigger中记录到其他表,其实你的单据就应有出仓的那一层,本身就是个记录,何需另外记录

------解决方案--------------------
只是update前的逻辑判断吧,不算多事务
------解决方案--------------------
写个存储过程,把逻辑封装进去,然后程序调用一下好了。
也可以程序中封装一个事物,然后把所有逻辑做完了,一起提交或回滚。
还好了,这个很简单的了。
------解决方案--------------------
这个没有涉及到价格的话很容易了呀!

1、判断:产品是否存在以及是否有足够的库存扣减
2、更新:更新库存表相应产品的库存量

SQL code

--存储过程创建语法...

begin tran
select a.listid,b.productid
from IM_Out a join IM_OutDetail b on a.id = b.out_id
where a.id = ?
  and not exists (select 1 from IM_Stock where warehouseid = a.warehouseid 
                              and product_id = b.product_id and quantity >= b.quantity)

if @@rowcount > 0
    begin
        commit tran
        return
    end
else
        begin
                --update  更新库存量
                update c
                set c.quantity = c.quantity - b.quantity
                from IM_Out a join IM_OutDetail b on a.id = b.out_id
                              join IM_Stock c on a.warehouseid = c.warehouseid and b.product_id = c.product_id
                where a.id = ?
                commit tran
        end

------解决方案--------------------
if (查找库存的数量)> 0
begin
if 查找库存的数量 >要出货的数量
begin
update 库存表
set 库存数量 = 库存数量 - 要出货的数量
where 出货单 = 传入参数

insert into 库存记录表 
select 出货单,要出货的数量,进出类型标记 
end
else
begin
RAISERROR('库存有,但是不足出货', 18, 1)
end
end
else
begin
RAISERROR('库存为0', 18, 1)
end