3 votes

Mise à jour de l'enregistrement, si échec, insertion de l'enregistrement puis mise à jour.

J'ai une procédure stockée qui met à jour les articles de l'inventaire sur plusieurs sites. Ce que j'essaie surtout de faire, c'est de permettre une bonne tenue des registres pour les transferts d'inventaire entre les sites.

Le problème que je rencontre est que certains de ces emplacements n'ont pas d'enregistrements pour la plupart des types d'articles en stock, donc lorsque j'essaie de mettre à jour les quantités (-1 pour l'emplacement initial, +1 pour le nouvel emplacement), il n'y a pas d'enregistrement à mettre à jour.

Voici ma procédure stockée :

 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

Un extrait sur lequel je travaille :

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  

Donc, comme vous pouvez le voir ci-dessus, j'essaie de mettre à jour (ce qui fonctionne bien si des enregistrements existent pour l'article d'inventaire pour les deux emplacements de stockage), mais s'il y a une erreur, je veux alors insérer ma nouvelle ligne pour cet article d'inventaire particulier et ensuite le mettre à jour avec la nouvelle valeur de quantité, mais je fais quelque chose d'incorrect.

Quelqu'un peut-il me dire ce que je fais mal ? Merci

1voto

coge.soft Points 1584

Voici un exemple simple de ce que vous pouvez faire et vous n'avez pas besoin d'autant de gestion d'erreurs (je suppose qu'il y a une contrainte unique sur les 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

Ce que cela va faire est d'essayer de INSERT à chaque fois, mais il filtre naturellement tout ce qui existe déjà. S'il n'y a rien à INSERT rien ne se passe. Alors vous pouvez facilement poursuivre le UPDATE .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X