none
Cannot roll back throw RRS feed

  • Pregunta

  • Hola de antemano muchisimas gracias por todos los aportes que me puedan brindar. 

    La situacion es la siguiente: Estoy desarrollando un sistema para el control de inventario de la compania, en este momento me encuentro ejecutando las transacciones de los datos maestros y para eso estoy usando tres tablas una para las cantidades rack y storage, otras para el documento de creacion y una ultima para vincular los dos.

    Me encuentro usando VB.net y SqlServer

    El siguiente es el store procedure que estoy ejecutando: (adicionalmente esta la pantalla de error que me esta dando en VStudio.

    ******************************************************************************************************

    ******************************************************************************************************

    ******************************************************************************************************

    USE [Inventory]
    GO
    /****** Object:  StoredProcedure [dbo].[SP_InsertMasterV04]    Script Date: 8/30/2019 8:50:24 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER procedure [dbo].[SP_InsertMasterV04]

    @IDDocument nvarchar(50),
    @Status  as nvarchar(50),
    @IDStatus  as nvarchar(50),
    @fld_date as nvarchar(50),
    @Proveedor as nvarchar(50),
    @NroRefPro as nvarchar(50),
    @Fld_Rack as nvarchar(50),
    @Fld_IDRack as nvarchar(50),
    @Fld_Storage as nvarchar(50),
    @Fld_IDStorage as nvarchar(50),
    @Fld_IDProduct as nvarchar(50),
    @Fld_Quantity as nvarchar(50), 
    @Fld_Cost as nvarchar(50)

    as 
      set nocount    on

      begin try


      set @Fld_IDStorage =convert(nvarchar,(select IDStorage from Storage where Storage.Description = @Fld_Storage))
      set @Fld_IDRack =convert(nvarchar,(select IDRack from dbo.Rack where Rack.Description  = @Fld_Rack  )) 
      set @IDStatus = convert(nvarchar,(Select Fld_IDStatus from dbo.Tbl_Status where  Tbl_Status.Fld_Description = @Status))
      set @Proveedor =convert( int, @Proveedor)

        begin transaction

      if (select count(*) from Tbl_MasterMaterials where Tbl_MasterMaterials.Fld_IDProduct = @Fld_IDProduct and Fld_IDRack
      = convert(int, @Fld_IDRack) and Fld_IDStorage = convert(int, @Fld_IDStorage) and 
      Fld_IDStatus= convert(int,@IDStatus))>0  

    UPDATE Tbl_MasterMaterials
       SET Fld_quantity   = Fld_quantity  + convert(int, @Fld_Quantity) 
    WHERE Fld_IDRack = convert(int, @Fld_IDRack) and Fld_IDStorage = convert(int, @Fld_IDStorage) and Fld_IDStatus = convert(int, @IDStatus)    

    else

    insert into Tbl_MasterMaterials values ( @Fld_IDProduct, convert(int, @Fld_IDRack), convert(int,@Fld_IDStorage),convert(int, @IDStatus),convert(int,@Fld_Quantity),convert(money, @Fld_Cost))
    insert into Tbl_documentTransact values (convert(int, @Proveedor),@NroRefPro, convert(int, @Fld_IDRack),convert(int, @Fld_IDStorage),convert(int,@IDStatus), convert(date, @fld_date))  
    insert into Tbl_MasterDocument values ( @Fld_IDProduct,convert(int,@IDDocument),convert(int,@Fld_Quantity))

    commit transaction

      end try
      begin catch

        rollback transaction
        throw

      end catch

      return 0

    ******************************************************************************************************

    ******************************************************************************************************

    ******************************************************************************************************

    viernes, 30 de agosto de 2019 12:58

Respuestas

Todas las respuestas

  • El problema esta aqui:

        rollback transaction
        throw

    Para SQL Server, dado que los saltos de linea no son signaficativos, eso es equivalente a esto:

        rollback transaction throw

    Y lo interpreta comop si hubieras dicho "rollback transaction Pepe" que contestaria "no existe ninguna transaccion que se llame Pepe".

    Pra evitar estos errores conviene escribir expresamente el punto y coma, a pesar de que en la mayor parte de los casos es opcional:

        rollback transaction;
        throw;

    Si haces eso el "rollback transaction" funcionara. Si a continuacion te sale un error en el "throw", eso indicaria que tu version de SQl Server es excesivamente antigua y todavia no soporta "throw". De ser asi, sustituyelo por "raiseerror ...".

    viernes, 30 de agosto de 2019 13:41
  • Perfecto Hermano voy a chequear esta alternativa.

    Por ahora mil gracias te comentare mas adelante.


    MB

    • Marcado como respuesta Marcos Bolivar domingo, 1 de septiembre de 2019 19:32
    viernes, 30 de agosto de 2019 14:51
  • Eso era todo hermano mil gracias.

    MB

    domingo, 1 de septiembre de 2019 16:25