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 14-12-2005
kikodelphi kikodelphi is offline
Miembro
 
Registrado: ene 2005
Posts: 23
Poder: 0
kikodelphi Va por buen camino
controlar error en transacción

Tengo el siguiente proceso almacenado, que cuando falla en su grabación igual arroja ÉXITO (@@ERROR=0) y hace COMMIT, aunque no graba nada.

La preguntonta es: ¿Por qué @@ERROR no refleja la realidad?

Según entendí en la ayuda dice que @@ERROR es global, ¿esto es realmente así?

¿Alguien conoce otro método de controlar los errores de los procedimientos almacenados?

Desde ya agradezco la ayuda que me puedan dar.






declare @IDCompr int,@TipoCompr varchar(4),@er int

Set @IDCompr = 144

Set @TipoCompr = 'FC'

set @er = 0

begin transaction

Exec Detalle @IDCompr, @TipoCompr

set @er = @@ERROR

IF (@er<>0)

begin

rollback

print 'falló'

print @er

end

else

begin

commit

print 'exito'

print @er

end




Servidor: mensaje 515, nivel 16, estado 2, procedimiento Detalle, línea 13

No se puede insertar el valor NULL en la columna 'Codigo', tabla 'LASEGUNDA.dbo.Factura'.

La columna no admite valores NULL. INSERT falla.



Se terminó la instrucción.

exito

0






CREATE PROCEDURE Detalle @IdComprobante int , @tipoDetalle char(4) AS



DECLARE @Cantidad int , @Detalle varchar(50) , @PrecioUnit real , @Descuento real , @Importe real



DECLARE HacerDetalle cursor for

select Cantidad, Detalle , PrecioUnit ,Descuento, Importe

from TemporalItems

Open HacerDetalle

fetch next from HacerDetalle INTO @Cantidad , @Detalle , @PrecioUnit, @Descuento , @Importe

While (@@Fetch_status = 0)

begin

if @tipoDetalle = 'FC' insert into Factura (idComprobante , Cantidad , Detalle , PrecioUnit , Bonif , total )

values ( @idComprobante , @Cantidad , @Detalle , @PrecioUnit, @Descuento , @Importe )



if @tipoDetalle = 'NC' insert into NCredito (idComprobante , Cantidad , Detalle , PrecioUnit , Bonif , total )

values (@idComprobante ,@Cantidad , @Detalle , @PrecioUnit, @Descuento , @Importe )



if @tipoDetalle = 'ND' insert into NDebito (idComprobante , Cantidad , Detalle , PrecioUnit , Bonif , total )

values (@idComprobante , @Cantidad , @Detalle , @PrecioUnit, @Descuento , @Importe )





fetch next from HacerDetalle INTO @Cantidad , @Detalle , @PrecioUnit, @Descuento , @Importe



end

Close HacerDetalle

Deallocate HacerDetalle

GO

Responder Con Cita
  #2  
Antiguo 14-12-2005
Avatar de Xianto
Xianto Xianto is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nací en Neuquén (ARG), desde 2001 Spain
Posts: 151
Poder: 13
Xianto Va por buen camino
Buenas... primero que nada, deberias mirar la guia de estilo para postear en condiciones...

Es muy simple el problema, lo tienes en el procedimiento Detalle, ya que el @@ERROR sera distinto de 0, en el caso que el procedimiento actual tenga algun fallo, pero es que el procedimiento Detalle, no contiene ningun manejo de errores por lo cual te sugiero que hagas algo como
Código:
 
if @@error=0
	 guardar
else
	 fallar
en el procedimiento Detalle, porque sino siempre tendras este problema, cuando algo falle...

Saludos.
__________________
El diseño dira si tiene futuro...
Responder Con Cita
  #3  
Antiguo 12-05-2006
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 13
droguerman Va por buen camino
porque @@error devuelve un valor diferente de cero cuando una instruccion falla, si la siguiente se ejecuta normalmente @@error vuelve a ser cero
__________________
self.free;
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 12:36:42.


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