更新库存SQL算法1.0版

本文介绍了如何使用SQL进行库存更新,涉及INSERT语句、JOIN操作以及处理NULL值的方法,为库存管理系统提供有效的数据操作策略。
摘要由CSDN通过智能技术生成

更新库存SQL算法版

  • 页面布局
    请选择仓库(下拉选择)
    填写设备 填写出库数量 
    填写设备 填写出库数量 
    填写设备 填写出库数量 
    填写设备 填写出库数量 
    需求描述:首先选择仓库,然后依客户需要,填写要出库的设备并填写出库数量。如右图所示。
  • 功能描述:批量出库时,对于库存不够的设备要提示该设备库存不够,并撤消本次出库操作,对于库存中没有的设备也要提示该设备中不存在,否则提交。注意客户可以选择一样的设备。
  • 技术难点:在库存不够时给出提示并撤消;对于多个相同的设备怎么样快速汇总。
  • 关键词:存储过程,函数,游标,事务。
  • 数据库设计
  1.  库房表 
    库房表tb_Storeroom
    P_StoreroomId(库房ID)

    StoreroomName(库房名称)

    1库房1
    2库房2
  2. 设备表 
      设备表tb_Equipment  

    P_EquipmentId(设备id)

    EquipmentName(设备名称)
    1飞毛腿导弹
    2爱国者导弹
  3. 库存表

库存表tb_Stock
P_StockId(库存ID)F_EquipmentId(设备ID)Mount(库存数量)F_StoreroomId(所属库房)
11 10 1
21 15

 1

存储过程实现(内有详细注释,不再另外说明了)

 

  Create   Procedure  sp_ComputeStock
  
@StoreroomId   INT   =   NULL , -- 库房编号
   @EquipmentIds   VARCHAR ( 1000 ), -- 设备编号,各设备编号间用逗号隔开,例如:1,2,3,4
   @EquipmentMount   VARCHAR ( 1000 ) -- 设备数量,各设备数量间用逗号隔开,例如:11,15,20,5
  AS

  
SET  NOCOUNT  ON
  
SET  CURSOR_CLOSE_ON_COMMIT  OFF      -- 设置手动关闭游标,使事务不会影响到游标的打开和关闭

  
DECLARE  
     
@tb_EquipmentIds   TABLE ( [ Id ]   INT   IDENTITY  ( 1 , 1 ),EquipmentId  INT ) -- 表变量,设备编号表
   DECLARE  
     
@tb_EquipmentMount   TABLE ( [ Id ]   INT   IDENTITY  ( 1 , 1 ),EquipmentMount  INT ) -- 表变量,设备数量表

  
INSERT   INTO   @tb_EquipmentIds   SELECT   *   FROM  dbo.f_splitSTR( @EquipmentIds , ' , ' ) -- 拆分设备编号,并将结果插入到设备编号表(表变量)中
   INSERT   INTO   @tb_EquipmentMount   SELECT   *   FROM  dbo.f_splitSTR( @EquipmentMount , ' , ' ) -- 拆分设备数量,并将结果插入到设备数量表(表变量)中

  
  
DECLARE   @au_equipmentId   INT -- 设备编号
           @au_equipmentMount   INT , -- 设备数量
           @var_Mount   INT -- 库存数量

  
DECLARE  stockBill_cursor  CURSOR  LOCAL FAST_FORWARD  FOR   -- 声明并定义快速只进的本地游标
   SELECT                                                   -- 将设备编号表和设备数量表关联,按设备编号分组统计出各设备的出库数量
    EquipmentId,
    
SUM (EquipmentMount)  AS  Mount
  
FROM  
    
@tb_EquipmentIds   AS  a
  
INNER   JOIN   
    
@tb_EquipmentMount   AS  b
  
ON  
    a.
[ ID ]   =  b. [ ID ]
  
GROUP   BY  EquipmentId
  
  
OPEN  stockBill_cursor

  
FETCH   NEXT   FROM  stockBill_cursor 
  
INTO   @au_equipmentId @au_equipmentMount -- 将当前设备编号保存到@au_equipmentId中,将当前设备数量保存到@au_equipmentMount中

  
BEGIN   TRANSACTION

  
WHILE   @@FETCH_STATUS   =   0
  
BEGIN
    
SET   @var_Mount   =   NULL
    
SELECT  
      
@var_Mount   =  Mount           -- 根据库房号和设备编号从库存表中找出该设备的存库数量,并保存到@var_Mount中
     FROM  
       tb_Stock 
    
WHERE  
      F_StoreroomId 
=   @StoreroomId  
    
AND  
     F_EquipmentId 
=   @au_equipmentId

    
IF  ( @au_equipmentMount   <=   @var_Mount AND  ( @var_Mount   IS   NOT   NULL ) -- 所取数量与库存数量比较,若小于等于库存数量,更新库存表。
       UPDATE  
        tb_Stock
      
SET  
        Mount 
=  Mount  -   @au_equipmentMount
      
WHERE  
        F_StoreroomId 
=   @StoreroomId  
      
AND  
        F_EquipmentId 
=   @au_equipmentId
     
ELSE
     
BEGIN                               -- 否则,不更新库存表,并回滚,关闭游标,返回该设备编号(库存不够)
         ROLLBACK   TRANSACTION
        
CLOSE  stockBill_cursor
        
DEALLOCATE  stockBill_cursor
        
IF   @var_Mount   IS   NULL
        
BEGIN
          
PRINT   ' 库房 ' + LTRIM ( STR ( @StoreroomId )) + ' 中不存在设备编号为 ' + LTRIM ( STR ( @au_equipmentId )) + ' 设备 '
          
SET   @au_equipmentId   =   - 1   -- '返回-1表明有不存在的设备'
         END
        
ELSE
     
PRINT ( ' 库房编号为 ' + LTRIM ( STR ( @StoreroomId )) + ' 设备编号为 ' + LTRIM ( STR ( @au_equipmentId )) + ' 的设备库存不够 ' )
       
RETURN   @au_equipmentId
     
END
      
--  
      FETCH   NEXT   FROM  stockBill_cursor 
     
INTO   @au_equipmentId @au_equipmentMount
   
END
   
COMMIT   TRANSACTION         -- 提交事务
    CLOSE  stockBill_cursor     -- 关闭游标
    DEALLOCATE  stockBill_cursor 
   
RETURN   0                 -- 成功返回

 

函数
Create   FUNCTION  f_splitSTR 
    (
@s   varchar ( 8000 ), -- 待分拆的字符串 
      @split   varchar ( 10 )) -- 数据分隔符
RETURNS   @re   TABLE (col  varchar ( 100 )) 
AS
 
BEGIN
   
Declare   @splitlen   int

   
SET   @splitlen   =   LEN ( @split + ' a ' ) - 2

   
WHILE   CHARINDEX ( @split , @s ) > 0

   
BEGIN

     
Insert   @re   VALUES ( LEFT ( @s , CHARINDEX ( @split , @s ) - 1 ))

     
SET   @s   =   STUFF ( @s , 1 , CHARINDEX ( @split , @s ) + @splitlen , '' )

   
END
   
   
INSERT   @re   Values ( @s )
   
RETURN  
 
END

库存视图

Create   VIEW   V_Stock
AS
SELECT  
   P_EquipmentID 
AS  EquipmentID,
   EquipmentName,
   Mount,
   F_StoreroomId 
AS  StoreroomId,
   StoreroomName
  
from  tb_Stock 
 
INNER   JOIN  
   tb_Equipment 
 
ON  
  tb_Stock.F_EquipmentId 
=  tb_Equipment.P_EquipmentId
 
INNER   JOIN
  tb_Storeroom
 
ON
  tb_Stock.F_StoreroomId 
=  tb_Storeroom.P_StoreroomId

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值