Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-10-2005
kikodelphi kikodelphi is offline
Miembro
 
Registrado: ene 2005
Posts: 23
Poder: 0
kikodelphi Va por buen camino
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?

Última edición por dec fecha: 06-10-2005 a las 16:09:29. Razón: ¡¡Encerrad el código fuente entre las etiquetas [SQL] ... [/SQL]!!
Responder Con Cita
  #2  
Antiguo 06-10-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 14
lucasarts_18 Va por buen camino
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...
__________________
No todo es como parece ser...
Responder Con Cita
  #3  
Antiguo 06-10-2005
Avatar de Chente(rMan)
Chente(rMan) Chente(rMan) is offline
Miembro
 
Registrado: ago 2005
Posts: 89
Poder: 12
Chente(rMan) Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 06-10-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 14
lucasarts_18 Va por buen camino
Hola:

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

Saludos...
__________________
No todo es como parece ser...
Responder Con Cita
  #5  
Antiguo 12-10-2005
kikodelphi kikodelphi is offline
Miembro
 
Registrado: ene 2005
Posts: 23
Poder: 0
kikodelphi Va por buen camino
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 ???
Responder Con Cita
  #6  
Antiguo 12-10-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 14
lucasarts_18 Va por buen camino
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.

__________________
No todo es como parece ser...
Responder Con Cita
  #7  
Antiguo 18-10-2005
kikodelphi kikodelphi is offline
Miembro
 
Registrado: ene 2005
Posts: 23
Poder: 0
kikodelphi Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 18-10-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 14
lucasarts_18 Va por buen camino
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..
__________________
No todo es como parece ser...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:33:27.


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