Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Devolver código de error de una transacción (https://www.clubdelphi.com/foros/showthread.php?t=25875)

kikodelphi 06-10-2005 15:23:41

Devolver código de error de una transacción
 
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.

Código SQL [-]
 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:

Código SQL [-]
ç
  /****** 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.

Código SQL [-]
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

Cita:

Empezado por kikodelphi
¿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.

Código SQL [-]
 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..


La franja horaria es GMT +2. Ahora son las 09:25:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi