Error ROLLBACK

02/08/2009 - 01:05 por Hi | Informe spam
Hola comunidad, estoy usando este modelo de procedimiento que en mi logica
que cuando ocurre un error debe de usar el ROLLBACK TRANSACTION para
desacerce toda la operacion pero por declarar equivocadamente (Declare
@dsFecha smallmoney, @dsImporte datetime) que al final me ayudo bastante y
comprobar que no era asi, que todos los datos lo eliminaba y lo modificaba
que no era como yo lo deseo.
espero su respuesta gracias


CREATE PROCEDURE [dbo].[DeleteDetalleSalida]
@IdDetalleSalida smallint,
@sFecha smalldatetime,
@IdSalida smallint,
@IdMaterial nchar(7),
@dsCandidad decimal(9,2)
AS
BEGIN TRAN
SET NOCOUNT ON
IF @@ERROR != 0 GOTO ERROR_HANDLER
DELETE FROM [dbo].[DetalleSalida]
WHERE IdDetalleSalida=@IdDetalleSalida AND IdSalida=@IdSalida AND
sFecha=@sFecha
IF @@ERROR != 0 GOTO ERROR_HANDLER
UPDATE [dbo].[Salida] SET sTotal = 0
WHERE IdSalida=@IdSalida AND sFecha=@sFecha
IF @@ERROR != 0 GOTO ERROR_HANDLER
SELECT
dsFecha,IdMaterial,dsImporte,dsCantidad,dsImporteTotal,dsDetalle,dsNumVale
INTO #Orden
FROM DetalleSalida
WHERE sFecha= @sFecha AND IdSalida=@IdSalida
IF @@ERROR != 0 GOTO ERROR_HANDLER
DELETE FROM DetalleSalida
WHERE sFecha= @sFecha AND IdSalida=@IdSalida
IF @@ERROR != 0 GOTO ERROR_HANDLER
decimal(9,2), @dsImporteTotal smallmoney,
Declare @dsFecha smallmoney, @dsImporte datetime, @dsCantidad decimal(9,2),
@dsImporteTotal smallmoney,
@dsDetalle nvarchar(100), @dsNumVale nvarchar(20)
IF @@ERROR != 0 GOTO ERROR_HANDLER
DECLARE
cursord CURSOR FOR
SELECT dsFecha,dsImporte,dsCantidad,dsImporteTotal,dsDetalle,dsNumVale FROM
#Orden
OPEN cursord
FETCH NEXT FROM cursord
INTO @dsFecha,@dsImporte,@dsCantidad,@dsImporteTotal,@dsDetalle,@dsNumVale
WHILE @@FETCH_STATUS = 0
BEGIN
IF @@ERROR != 0 GOTO ERROR_HANDLER
EXEC @IdDetalleSalida=[NuevoIdDetalleSalida] @IdSalida, @sFecha
IF @@ERROR != 0 GOTO ERROR_HANDLER
INSERT INTO [dbo].[DetalleSalida]

([IdDetalleSalida],[dsFecha],[IdSalida],[sFecha],[IdMaterial],[dsImporte],[dsCantidad],[dsImporteTotal],[dsDetalle],[dsNumVale])
VALUES

(@IdDetalleSalida,@dsFecha,@IdSalida,@sFecha,@IdMaterial,@dsImporteTotal,@dsCantidad,@dsImporteTotal,@dsDetalle,@dsNumVale)
IF @@ERROR != 0 GOTO ERROR_HANDLER
UPDATE [dbo].[Salida] SET sTotal = sTotal + @dsImporteTotal
WHERE IdSalida=@IdSalida AND sFecha=@sFecha
IF @@ERROR != 0 GOTO ERROR_HANDLER
FETCH NEXT FROM cursord
INTO @dsFecha,@dsImporte,@dsCantidad,@dsImporteTotal,@dsDetalle,@dsNumVale
END
CLOSE cursord
DEALLOCATE cursord
IF @@ERROR != 0 GOTO ERROR_HANDLER
COMMIT TRANSACTION
RETURN 0
ERROR_HANDLER:
BEGIN
ROLLBACK TRANSACTION
RETURN @@ERROR
END

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
02/08/2009 - 19:24 | Informe spam
No entiendo bien tu pregunta, pero aqui van un par de consejos.

1 - Usa la sentencia "return" para devolver informacion sobre la ejecucion
de el procedimiento almacenado y usa parametros de salido para intercambiar
valores escalares entre procedimientos.

EXEC @IdDetalleSalida=[NuevoIdDetalleSalida] @IdSalida, @sFecha



declare @rv int;
declare @IdDetalleSalida int;

EXEC @rv = dbo.NuevoIdDetalleSalida @IdSalida, @sFecha, @IdDetalleSalida
output;

if @@error <> 0 or @rv <> 0
goto error_handler;
...

2 - Use "set xact_abort on" para forzar comportamiento similares cuando
ocurre un error y tienes una transaccion. Tambien chequea el valor de
@@trancount para estar seguro que estas dentro de una transaccion antes de
hacer un rollback.

set nocount on;
set xact_abort on;

begin transaction
...

error_handler:

if @@trancount > 0
rollback transaction;

return -1
go


Por ultimo, si estas usando SQL Server 2005 / 2008, entonces te recomiendo
el uso de el nuevo bloque para manejo de errores.

begin try
...
end try
begin catch
...
end catch

Ver BOL para mas info sobre este bloque.

Aca te adjunto lo links hacia un par de articulos bien interesantes sobre
manejo de errores en SQL Server.

Error Handling in SQL Server – a Background
http://www.sommarskog.se/error-handling-I.html

Implementing Error Handling with Stored Procedures
http://www.sommarskog.se/error-handling-II.html


AMB


"Hi" wrote:

Hola comunidad, estoy usando este modelo de procedimiento que en mi logica
que cuando ocurre un error debe de usar el ROLLBACK TRANSACTION para
desacerce toda la operacion pero por declarar equivocadamente (Declare
@dsFecha smallmoney, @dsImporte datetime) que al final me ayudo bastante y
comprobar que no era asi, que todos los datos lo eliminaba y lo modificaba
que no era como yo lo deseo.
espero su respuesta gracias


CREATE PROCEDURE [dbo].[DeleteDetalleSalida]
@IdDetalleSalida smallint,
@sFecha smalldatetime,
@IdSalida smallint,
@IdMaterial nchar(7),
@dsCandidad decimal(9,2)
AS
BEGIN TRAN
SET NOCOUNT ON
IF @@ERROR != 0 GOTO ERROR_HANDLER
DELETE FROM [dbo].[DetalleSalida]
WHERE IdDetalleSalida=@IdDetalleSalida AND IdSalida=@IdSalida AND
sFecha=@sFecha
IF @@ERROR != 0 GOTO ERROR_HANDLER
UPDATE [dbo].[Salida] SET sTotal = 0
WHERE IdSalida=@IdSalida AND sFecha=@sFecha
IF @@ERROR != 0 GOTO ERROR_HANDLER
SELECT
dsFecha,IdMaterial,dsImporte,dsCantidad,dsImporteTotal,dsDetalle,dsNumVale
INTO #Orden
FROM DetalleSalida
WHERE sFecha= @sFecha AND IdSalida=@IdSalida
IF @@ERROR != 0 GOTO ERROR_HANDLER
DELETE FROM DetalleSalida
WHERE sFecha= @sFecha AND IdSalida=@IdSalida
IF @@ERROR != 0 GOTO ERROR_HANDLER
decimal(9,2), @dsImporteTotal smallmoney,
Declare @dsFecha smallmoney, @dsImporte datetime, @dsCantidad decimal(9,2),
@dsImporteTotal smallmoney,
@dsDetalle nvarchar(100), @dsNumVale nvarchar(20)
IF @@ERROR != 0 GOTO ERROR_HANDLER
DECLARE
cursord CURSOR FOR
SELECT dsFecha,dsImporte,dsCantidad,dsImporteTotal,dsDetalle,dsNumVale FROM
#Orden
OPEN cursord
FETCH NEXT FROM cursord
INTO @dsFecha,@dsImporte,@dsCantidad,@dsImporteTotal,@dsDetalle,@dsNumVale
WHILE @@FETCH_STATUS = 0
BEGIN
IF @@ERROR != 0 GOTO ERROR_HANDLER
EXEC @IdDetalleSalida=[NuevoIdDetalleSalida] @IdSalida, @sFecha
IF @@ERROR != 0 GOTO ERROR_HANDLER
INSERT INTO [dbo].[DetalleSalida]

([IdDetalleSalida],[dsFecha],[IdSalida],[sFecha],[IdMaterial],[dsImporte],[dsCantidad],[dsImporteTotal],[dsDetalle],[dsNumVale])
VALUES

(@IdDetalleSalida,@dsFecha,@IdSalida,@sFecha,@IdMaterial,@dsImporteTotal,@dsCantidad,@dsImporteTotal,@dsDetalle,@dsNumVale)
IF @@ERROR != 0 GOTO ERROR_HANDLER
UPDATE [dbo].[Salida] SET sTotal = sTotal + @dsImporteTotal
WHERE IdSalida=@IdSalida AND sFecha=@sFecha
IF @@ERROR != 0 GOTO ERROR_HANDLER
FETCH NEXT FROM cursord
INTO @dsFecha,@dsImporte,@dsCantidad,@dsImporteTotal,@dsDetalle,@dsNumVale
END
CLOSE cursord
DEALLOCATE cursord
IF @@ERROR != 0 GOTO ERROR_HANDLER
COMMIT TRANSACTION
RETURN 0
ERROR_HANDLER:
BEGIN
ROLLBACK TRANSACTION
RETURN @@ERROR
END
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida