Hola foreros!!
tengo un problema con un trigger que se ejecuta al hacer un insert en una tabla.
Lo que pasa es que para hacer el insert llamo a un porcedimiento almacenado, éste hace una serie de validaciones, si esta todo OK hace el INSERT lo que ocasiona que se dispare el trigger pero algo pasa que me sale este mensaje:
Msg 3609, Level 16, State 1, Procedure sp_insDetallePago, Line 31
The transaction ended in the trigger. The batch has been aborted.
Lo más extrano es que se hace el insert correctamente en la tabla.
Cómo puedo solucionar esto?
Les paso el procedimiento y el trigger:
Código:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_insDetallePago]
@pago int,
@monto decimal(18,2),
@boleta nchar(10),
@msg nchar(100)=null OUTPUT
AS
BEGIN TRANSACTION
SET NOCOUNT ON;
IF dbo.validarBoleta(@boleta)=1
SET @msg='Boleta válida'
else
BEGIN
SET @msg='Boleta no válida'
RAISERROR ('Boleta no válida',
8, -- Severidad
1 -- Estado
)
GOTO error
END
Declare @deuda decimal(18,2)
SET @deuda=(Select (Monto-Cancelado) From vw_pagos where ID_Pago=@pago)
IF @@ERROR<>0
GOTO error
IF @monto>@deuda
BEGIN
SET @msg='El monto a cancelar es mayor al adeudado'
GOTO error
END
INSERT INTO DetallePago values(@pago, @monto, GETDATE(),@boleta)
IF @@ERROR<>0
GOTO error
COMMIT TRANSACTION
return(0)
error:
ROLLBACK TRANSACTION
print 'Error'
return(1)
El trigger
Código:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[trg_INS_DetallePago] on [dbo].[DetallePago] AFTER INSERT AS
Declare @deuda decimal(18,2)
Declare @monto decimal(18,2)
Declare @boleta nchar(10)
SET @boleta = (Select Boleta FROM INSERTED)
SET @monto = (Select Monto FROM INSERTED)
SET @deuda=(Select (Monto-Cancelado) From vw_pagos where ID_Pago=(SELECT ID_Pago FROM INSERTED))
IF @@ERROR<>0
GOTO error
IF @monto<=0
BEGIN
print 'El monto a cancelar debe ser mayor a 0'
GOTO error
END
--IF @monto>@deuda
IF @deuda<0
BEGIN
Declare @aux int
SET @aux=(SELECT ID_Pago FROM INSERTED)
print 'El monto a cancelar es mayor al adeudado'
GOTO error
END
-- IF dbo.validarBoleta(@boleta)=0
-- BEGIN
-- print 'Boleta no válida'
-- GOTO error
-- END
--IF @deuda-@monto=0
IF @deuda=0
UPDATE Pago set Estado ='t' Where ID=(SELECT ID_Pago FROM INSERTED)
ELSE
UPDATE Pago set Estado ='c' Where ID=(SELECT ID_Pago FROM INSERTED)
IF @@ERROR<>0
BEGIN
print 'No se pudo actualizar el estado del pago'
GOTO error
END
COMMIT TRAN
return
error:
ROLLBACK TRAN
print 'Error'
return
Saludos!!