PDA

Ver la Versión Completa : Devolver código de error de una transacción


kikodelphi
06-10-2005, 15:23:41
Hola
No puedo capturar el código de retorno si ocurre un error en la ejecución del Procedimiento Almacenado. El parámetro está definido en la aplicación, pero aún cuando falla la Transacción me entrega un valor Null = nada y la Transacción se aborta.
¿Como puedo leer ese código de error?
El objetivo es disparar un mensaje sobre la no grabación.


CREATE PROCEDURE GrabaComprVta @IDCliente Int, .... , @Er int output AS
///////////////
////////////
///////
BEGIN TRANSACTION
Select @IDCompr = MAX(IDComprobante) from Comprobante
///////////
/////// insert .......
///////
IF (@@ERROR<>0) GOTO TratarError

COMMIT TRAN

TratarError: -- // etiqueta
--Si ha ocurrido algún error llegamos hasta aquí
If @@Error<>0
BEGIN
set @Er = @@ERROR
ROLLBACK TRAN
END
GO

¿Está mal confeccionada la lógica de la transacción?

lucasarts_18
06-10-2005, 15:48:12
Hola.

Te dejo un ejemplo que puede ayudarte en algo:

ç
/****** Object: Stored Procedure dbo.SP_InsertarCliente Script Date: 27-01-2000 01:55:05 ******/
CREATE PROCEDURE SP_InsertarCliente

@nrrut int,
@dvrut char(1),
@nmcliente varchar(60),
@nmdireccion varchar(40),
@nmcomuna varchar(20),
@nmciudad varchar(20),
@nmgiro varchar(20),
@nrfono varchar(15),
@nrfax varchar(15),
@nmemail varchar(30),
@nrcredito float,
@nrsaldo float,
/*AGA 22/4/08/2005*/
@nrplazo integer,
@nrdescuento float,
@nrfiador varchar(60)
/*AGA 22/08/2005*/

AS
BEGIN

IF EXISTS (SELECT * FROM CLIENTE WHERE nrrut=@nrrut)
RETURN(1)

ELSE
BEGIN
BEGIN TRANSACTION InsertarCliente
INSERT INTO CLIENTE
VALUES (@nrrut,
@dvrut,
@nmcliente,
@nmdireccion,
@nmcomuna,
@nmciudad,
@nmgiro,
@nrfono,
@nrfax,
@nmemail,
@nrcredito,
@nrsaldo,
/*AGA 24/08/2005*/
@nrplazo,
@nrdescuento,
@nrfiador)
/*AGA 24/08/2005*/
IF @@ERROR !=0
BEGIN

ROLLBACK TRANSACTION InsertarCliente
RETURN(90)

END

ELSE
BEGIN
COMMIT TRANSACTION InsertarCliente
RETURN(0)
END
END
END


Espero que te sirva...:rolleyes:

Chente(rMan)
06-10-2005, 15:52:02
Que tal kikodelphi, y que te parece si lo haces de esta manera.


CREATE PROCEDURE GrabaComprVta @IDCliente Int, .... , @Er int output AS
BEGIN TRAN
declare @error int
Select @IDCompr = MAX(IDComprobante) from Comprobante
///////////
/////// insert .......
///////

set @error = @@error

IF @ERROR = 0
begin
COMMIT
select 'Correcto' as description
end
else
begin
rollback
select description from master.dbo.sysmessages where error = @error
end
GO



Espero te sea de utilidad.



Saludos.

Vicente López.

lucasarts_18
06-10-2005, 16:34:10
Hola:

No sé si entiendo bien lo que propones, pero a mi parecer los errores quedan guardados en la tabla Master, es así ?.

Saludos...

kikodelphi
12-10-2005, 13:21:48
gracias a ambos por las respuestas.
¿cuales son las diferencias que ven ustedes a mi forma de plantearlo?
Yo a simple vista veo que hace exactamente lo mismo.
¿porque return(1) o return(90)? Para capturar desde el programa ? con un valor de función ???

lucasarts_18
12-10-2005, 15:35:27
¿porque return(1) o return(90)? Para capturar desde el programa ? con un valor de función ???
Claro...con esto controlas del programa si todo se ha ejecutado correctamente.

;)

kikodelphi
18-10-2005, 13:51:02
Para provocar un error en la transacción, no se me ocurre más que colocar un número demasiado grande para un campo entero. Pero esto me dá un error de desbordamiento de pila (memoria), por lo que no solo fracasa la transacción sino que se cuelga todo y no puedo hacer un seguimiento adecuado.

¿Alguien sabe como provocar un fallo en una transacción y que siga funcionando el sistema, para poder verificar el error?

Saludos y gracias por la colaboración

lucasarts_18
18-10-2005, 14:41:49
Hola:

Para controlar un error cualquier valor distinto a 0 es un error.


if @@error != 0


Para ver el mensaje de error puedes consultar la tabla System el sysmessage.

Para más ayuda y especificación te recomiendo que veas la ayuda en línea de SQL Server..

Hasta Luego..