3

複数の場所で在庫品目を更新するストアド プロシージャがあります。私が主にやろうとしているのは、場所間の在庫移動の適切な記録管理を可能にすることです.

私が直面している問題は、これらの場所のいくつかにはほとんどの種類の在庫品目の記録がないため、数量を更新しようとすると (開始場所から -1、新しい場所に +1) 記録がないことです。アップデート。

これが私のストアドプロシージャです:

 CREATE  procedure dbo.Inv_Transfer (@p_hStock numeric,
 @p_sFProp varchar(20), @p_hTProp numeric,
 @p_dQuan numeric,  @p_Date datetime,
 @p_sUser1 varchar(1000),@p_sUser2 varchar(1000))
 as
 declare
    @v_FInvhMy numeric,
    @v_TInvhMy numeric,
    @v_sStockCode varchar(10),
    @v_hFProp numeric,
    @v_ibegin int,
    @v_iend int
 begin

     set @v_ibegin  = charindex('(', @p_sFProp  ) 
    if @v_ibegin <= 0 
    begin 
       raiserror('From property string not readable',16,1, @p_sFProp ) 
        return(0)
    end
    else
    begin
       set @v_iend  = charindex (')',@p_sFProp) 
       set @v_hFProp  = substring(@p_sFProp,@v_ibegin + 1,@v_iend - @v_ibegin -1) 
    end  

    select @v_sStockCode = sCode  from mm2stock where hMy = @p_hStock 
    if @@ERROR<> 0
    begin
        raiserror('Stock read failed ',16,1)
        return(0)
    end
     select @v_FInvhMy = hMy from mm2inventory where hStock = @p_hStock and hStoreProp = @v_hFprop 
    if @@ERROR<> 0
    begin
        raiserror('From inventory read failed ',16,1)
        return(0)
    end
     select @v_TInvhMy = hMy from mm2inventory where hstock = @p_hStock and hStoreProp = @p_hTProp 
    if @@ERROR<> 0
    begin
        raiserror('To inventory read failed ',16,1)
        return(0)
    end 
    update mm2inventory set iQtyonHand = iQtyonHand - @p_dquan where hmy = @v_FInvhMy
    if @@ERROR<> 0
    begin
        raiserror('Update from inventory failed ',16,1)
        return(0)
    end         
     update mm2inventory set iQtyonHand = iQtyonHand + @p_dquan where hmy = @v_TInvhMy
    if @@ERROR<> 0
    begin
        raiserror('Update to inventory failed ',16,1)
        return(0)
    end     
    else
    begin
        INSERT INTO mm2inventory (scode, hstock, hstoreprop, dcosteach, dbillprice, ireorderlevel, ireorderqty, iqtyonorder, iqtyonhand, suser1, suser2, suser3, suser4, snotes)
        SELECT (SELECT hmy + 1 where hmy in (select max(hmy) from mm2inventory)),@p_hStock,@p_hTProp,(SELECT dcosteach from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT dbillprice from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT ireorderlevel from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT ireorderqty from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),0,0,'','','','','' FROM mm2inventory

        update mm2inventory set iQtyonHand = iQtyonHand + @p_dquan where hmy = @v_TInvhMy
    end  
     insert into mm2InvXfer( sStock,hinvfrom,hinvto,dquant,dtdate,sUser1,sUser2)
        values (@v_sStockCode,@v_FinvhMy, @v_TInvhMy, @p_dquan,
         isnull(@p_Date,getdate()), @p_sUser1, @p_sUser2) 
    if @@ERROR<> 0
    begin
        raiserror('Insert into inventoryxfer table  failed ',16,1)
        return(0)
    end
 end

私が取り組んでいることの抜粋:

update mm2inventory set iQtyonHand = iQtyonHand - @p_dquan where hmy = @v_FInvhMy
    if @@ERROR<> 0
    begin
        raiserror('Update from inventory failed ',16,1)
        return(0)
    end         
     update mm2inventory set iQtyonHand = iQtyonHand + @p_dquan where hmy = @v_TInvhMy
    if @@ERROR<> 0
    begin
        raiserror('Update to inventory failed ',16,1)
        return(0)
    end     
    else
    begin
        INSERT INTO mm2inventory (scode, hstock, hstoreprop, dcosteach, dbillprice, ireorderlevel, ireorderqty, iqtyonorder, iqtyonhand, suser1, suser2, suser3, suser4, snotes)
        SELECT (SELECT hmy + 1 where hmy in (select max(hmy) from mm2inventory)),@p_hStock,@p_hTProp,(SELECT dcosteach from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT dbillprice from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT ireorderlevel from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT ireorderqty from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),0,0,'','','','','' FROM mm2inventory

        update mm2inventory set iQtyonHand = iQtyonHand + @p_dquan where hmy = @v_TInvhMy
    end  

上記のように、更新しようとしています (両方の保管場所の在庫品目のレコードが存在する場合は正常に機能します) が、エラーが発生した場合は、その特定の在庫品目に新しい行を挿入してから、新しい数量値で更新しますが、間違ったことをしています。

誰が私が間違っているのか教えてもらえますか? ありがとう

4

1 に答える 1

1

これは、実行できることの簡単なサンプルであり、エラー処理はほとんど必要ありません ( に一意の制約があると想定していますproduct_code)。

--Make sure the inventory record exists:

INSERT INTO inventory (product_code, product_name)
SELECT product_code, product_name FROM source s
WHERE NOT EXISTS (
    SELECT product_code 
    FROM inventory i
    WHERE i.product_code = s.product_code)

--Updates the inventory record because you now know it exists:

UPDATE i
SET i.qty = i.qty + s.qty --obviously change sign where appropriate
FROM inventory i
JOIN source s ON s.product_code = i.product_code

INSERTこれが行うことは毎回試行されますが、既存のものはすべて自然に除外されます。に何もなければINSERT、何も起こりません。その後、簡単に追跡できますUPDATE

于 2013-05-06T18:10:00.737 に答える