Pruebas en SQL

12/04/2007 - 18:50 por Franko | Informe spam
Franko

Hola estoy haciendo una prueba final a mi procedimiento, la prueba consiste
en que al momento de ejecutar un store desde Asp me salgo del sistema sin
cerrar la sesion de ASP por motivos de si se cae el sistema y cosas asi
como puedo validar ese tipo de cuestiones el detalle es que cuando quiero
checar manualmente si se realizao el ROLLBACK no me deja checar las posibles
tablas afectadas. el store es el siguiente

ALTER PROCEDURE dbo.spTrasladoRecepcion 140286, 11, 898
@IdTras int,
@IdSuc int,
@IdUsua int


AS
/*
Nombre de Store Procedure: Recepcion de Traslados
Tablas involucradas: PeticionTraslado , ArticulosTraslados , AlmacenT ,
AlmacenC , MovProductos , AlmacenS
Autor: Juan Francisco Vargas Moreno
Fecha: 10/04/2007
*/

transacciones
Declare
@NomUsua varchar (100),
@error int

SET @NomUsua = (SELECT NomUsua FROM Usuarios WHERE IdUsua = 898)



SET NOCOUNT ON

BEGIN TRAN


existen diferencias
los cuales se encuentran en la tabla "ArticulosTraslados"
UPDATE PeticionTraslado SET ExisteDif = 1
FROM PeticionTraslado PT, ArticulosTraslados AT WHERE PT.IdTras = AT.IdTras
AND EstatusRT = 0 AND CanEnv <> CanRec AND AT.IdTras = @IdTras
SET @error = @@error
IF (@error<>0) GOTO TratarError


productos de "AlmacenT" Vs "ArticulosTraslados"
UPDATE AlmacenT SET CantAlmaT = CantAlmaT - AT.CanRec
FROM AlmacenT ALT, ArticulosTraslados AT WHERE ALT.IdProd = AT.IdProd
AND EstatusRT = 0
AND IdTras = @IdTras
SET @error = @@error
IF (@error<>0) GOTO TratarError


IF @IdSuc = 1
BEGIN

recibida
UPDATE AlmacenC SET CantAlmaC = CantAlmaC + CanRec
FROM AlmacenC AC, ArticulosTraslados AT
WHERE AT.IdTras = @IdTras
AND AT.IdProd IN (SELECT AC.IdProd FROM AlmacenC )
SET @error = @@error
IF (@error<>0) GOTO TratarError

INSERT INTO AlmacenC (IdAlmaC,CantAlmaC,IdProd,FechaAlmaC)
SELECT 1,ISNULL(CanRec, 0), IdProd, convert(nvarchar,GETDATE(),101)
FROM ArticulosTraslados
WHERE IdTras = @IdTras
AND IdProd NOT IN (SELECT Idprod FROM AlmacenC)
SET @error = @@error
IF (@error<>0) GOTO TratarError

tabla "MovProductos"
"MovProductos"
sucursal indicada
'IdTras'
INSERT INTO MovProductos(IdMov, TipoMp, DescTipo, IdProd, FechaMp,
EntradaMp, SalidaMp, AExistencia, DExistencia, IdSuc, IdUsua, Precioprod)
SELECT DISTINCT @IdTras, 'T', 'Traslados', AT.IdProd,
convert(nvarchar,GETDATE(),101), AT.CanRec,0, ISNULL(Dexistencia, 0),
(ISNULL(Dexistencia, 0) + AT.CanRec), 1, @IdUsua, 0
FROM ArticulosTraslados AT LEFT OUTER join MovProductos mp on at.idprod =
mp.idprod
AND MP.idmp IN ( SELECT MAX(Idmp) FROM MovProductos where idsuc = 1
AND idprod IN (select idprod from ArticulosTraslados where idtras =
@IdTras) group by IdProd)
WHERE AT.IdTras = @IdTras AND EstatusRT = 0
SET @error = @@error
IF (@error<>0) GOTO TratarError

END

ELSE

BEGIN

UPDATE AlmacenS SET CantAlmaS = CantAlmaS + CanRec
FROM AlmacenS ALS, ArticulosTraslados AT
WHERE AT.IdTras = @IdTras
AND IdAlmaS = @IdSuc
AND AT.IdProd IN (SELECT ALS.IdProd FROM AlmacenS)
SET @error = @@error
IF (@error<>0) GOTO TratarError

INSERT INTO AlmacenS (IdAlmas,CantAlmas,IdProd,FechaAlmas)
SELECT @IdSuc, ISNULL(CanRec, 0),IdProd,CONVERT(nvarchar,getdate(),101)
FROM ArticulosTraslados
WHERE IdTras = @IdTras
AND IdProd NOT IN (SELECT IdProd FROM AlmacenS)
SET @error = @@error
IF (@error<>0) GOTO TratarError

INSERT INTO MovProductos(IdMov, TipoMp, DescTipo, IdProd, FechaMp,
EntradaMp, SalidaMp, AExistencia, DExistencia, IdSuc, IdUsua, Precioprod)
SELECT @IdTras, 'T', 'Traslados', AT.IdProd,
convert(nvarchar,GETDATE(),101), AT.CanRec,0,ISNULL(Dexistencia, 0),
(ISNULL(Dexistencia, 0) + AT.CanRec), @IdSuc, @IdUsua, 0
FROM ArticulosTraslados AT LEFT OUTER join MovProductos mp on at.idprod =
mp.idprod
AND MP.idmp IN ( SELECT MAX(Idmp) FROM MovProductos where idsuc = @IdSuc
AND idprod IN (select idprod from ArticulosTraslados where idtras =
@IdTras) group by IdProd)
WHERE AT.IdTras = @IdTras AND AT.EstatusRT = 0
SET @error = @@error
IF (@error<>0) GOTO TratarError

END

Identificador de traslado(IdTras)
UPDATE ArticulosTraslados SET EstatusRT = 1,DifProd = ABS(DifProd)
WHERE IdTras = @IdTras
AND CanEnv <> 0
SET @error = @@error
IF (@error<>0) GOTO TratarError

OpRecibo , OpcionTras , EstatusRec
traslado(IdTras)
UPDATE PeticionTraslado
SET EntDes = @NomUsua, OpRecibo = 1, OpcionTras = 1, Estatusrec = 1
WHERE IdTras = @IdTras
SET @error = @@error
IF (@error<>0) GOTO TratarError

existirla se realiza un 'ROLLBACK'
TratarError:
If @@Error<>0
BEGIN
PRINT 'Ha ecorrido un error. Abortamos la transacción'
ROLLBACK TRAN
END

COMMIT TRAN


SET NOCOUNT OFF

GO


Alguna Recomendacion.

Preguntas similare

Leer las respuestas

#1 Manuel Etcheto
12/04/2007 - 20:26 | Informe spam
Franko:
Hay un par de cosas que deberías cambiar.
Actualmente el commit está dentro de la etiqueta TratarError, por lo que no
se ejcutará si no hay error.
Por otro lado, y a la inversa, si hay error no se va a hacer el rollback
porque estás preguntanto de nuevo IF @@error que va a estar "limpia" porque
en todo caso aunque fuera redundante deberías preguntar IF @error (tu
variable)
Si ahora preguntas por @error, al no hacer RETURN trataría de hacer commit
despues del rollback...

prueba
..
UPDATE PeticionTraslado
SET EntDes = @NomUsua, OpRecibo = 1, OpcionTras = 1, Estatusrec = 1
WHERE IdTras = @IdTras
SET @error = @@error
IF (@error<>0) GOTO TratarError

COMMIT TRAN -- si llegó aquí es porque no hubo error

TratarError:
PRINT 'Ha ecorrido un error. Abortamos la transacción' -- quitale para
producción este print...
ROLLBACK TRAN
return

GO

Suerte
Manuel

"Franko" escribió en el mensaje
news:
Franko

Hola estoy haciendo una prueba final a mi procedimiento, la prueba
consiste
en que al momento de ejecutar un store desde Asp me salgo del sistema sin
cerrar la sesion de ASP por motivos de si se cae el sistema y cosas
asi
como puedo validar ese tipo de cuestiones el detalle es que cuando quiero
checar manualmente si se realizao el ROLLBACK no me deja checar las
posibles
tablas afectadas. el store es el siguiente

ALTER PROCEDURE dbo.spTrasladoRecepcion 140286, 11, 898
@IdTras int,
@IdSuc int,
@IdUsua int


AS
/*
Nombre de Store Procedure: Recepcion de Traslados
Tablas involucradas: PeticionTraslado , ArticulosTraslados , AlmacenT ,
AlmacenC , MovProductos , AlmacenS
Autor: Juan Francisco Vargas Moreno
Fecha: 10/04/2007
*/

transacciones
Declare
@NomUsua varchar (100),
@error int

SET @NomUsua = (SELECT NomUsua FROM Usuarios WHERE IdUsua = 898)



SET NOCOUNT ON

BEGIN TRAN


si
existen diferencias
0
los cuales se encuentran en la tabla "ArticulosTraslados"
UPDATE PeticionTraslado SET ExisteDif = 1
FROM PeticionTraslado PT, ArticulosTraslados AT WHERE PT.IdTras =
AT.IdTras
AND EstatusRT = 0 AND CanEnv <> CanRec AND AT.IdTras = @IdTras
SET @error = @@error
IF (@error<>0) GOTO TratarError


productos de "AlmacenT" Vs "ArticulosTraslados"
UPDATE AlmacenT SET CantAlmaT = CantAlmaT - AT.CanRec
FROM AlmacenT ALT, ArticulosTraslados AT WHERE ALT.IdProd = AT.IdProd
AND EstatusRT = 0
AND IdTras = @IdTras
SET @error = @@error
IF (@error<>0) GOTO TratarError


IF @IdSuc = 1
BEGIN

cantidad
recibida
UPDATE AlmacenC SET CantAlmaC = CantAlmaC + CanRec
FROM AlmacenC AC, ArticulosTraslados AT
WHERE AT.IdTras = @IdTras
AND AT.IdProd IN (SELECT AC.IdProd FROM AlmacenC )
SET @error = @@error
IF (@error<>0) GOTO TratarError

INSERT INTO AlmacenC (IdAlmaC,CantAlmaC,IdProd,FechaAlmaC)
SELECT 1,ISNULL(CanRec, 0), IdProd, convert(nvarchar,GETDATE(),101)
FROM ArticulosTraslados
WHERE IdTras = @IdTras
AND IdProd NOT IN (SELECT Idprod FROM AlmacenC)
SET @error = @@error
IF (@error<>0) GOTO TratarError

tabla "MovProductos"
"MovProductos"
sucursal indicada
'IdTras'
INSERT INTO MovProductos(IdMov, TipoMp, DescTipo, IdProd, FechaMp,
EntradaMp, SalidaMp, AExistencia, DExistencia, IdSuc, IdUsua, Precioprod)
SELECT DISTINCT @IdTras, 'T', 'Traslados', AT.IdProd,
convert(nvarchar,GETDATE(),101), AT.CanRec,0, ISNULL(Dexistencia, 0),
(ISNULL(Dexistencia, 0) + AT.CanRec), 1, @IdUsua, 0
FROM ArticulosTraslados AT LEFT OUTER join MovProductos mp on at.idprod > mp.idprod
AND MP.idmp IN ( SELECT MAX(Idmp) FROM MovProductos where idsuc = 1
AND idprod IN (select idprod from ArticulosTraslados where idtras > @IdTras) group by IdProd)
WHERE AT.IdTras = @IdTras AND EstatusRT = 0
SET @error = @@error
IF (@error<>0) GOTO TratarError

END

ELSE

BEGIN

UPDATE AlmacenS SET CantAlmaS = CantAlmaS + CanRec
FROM AlmacenS ALS, ArticulosTraslados AT
WHERE AT.IdTras = @IdTras
AND IdAlmaS = @IdSuc
AND AT.IdProd IN (SELECT ALS.IdProd FROM AlmacenS)
SET @error = @@error
IF (@error<>0) GOTO TratarError

INSERT INTO AlmacenS (IdAlmas,CantAlmas,IdProd,FechaAlmas)
SELECT @IdSuc, ISNULL(CanRec, 0),IdProd,CONVERT(nvarchar,getdate(),101)
FROM ArticulosTraslados
WHERE IdTras = @IdTras
AND IdProd NOT IN (SELECT IdProd FROM AlmacenS)
SET @error = @@error
IF (@error<>0) GOTO TratarError

INSERT INTO MovProductos(IdMov, TipoMp, DescTipo, IdProd, FechaMp,
EntradaMp, SalidaMp, AExistencia, DExistencia, IdSuc, IdUsua, Precioprod)
SELECT @IdTras, 'T', 'Traslados', AT.IdProd,
convert(nvarchar,GETDATE(),101), AT.CanRec,0,ISNULL(Dexistencia, 0),
(ISNULL(Dexistencia, 0) + AT.CanRec), @IdSuc, @IdUsua, 0
FROM ArticulosTraslados AT LEFT OUTER join MovProductos mp on at.idprod > mp.idprod
AND MP.idmp IN ( SELECT MAX(Idmp) FROM MovProductos where idsuc = @IdSuc
AND idprod IN (select idprod from ArticulosTraslados where idtras > @IdTras) group by IdProd)
WHERE AT.IdTras = @IdTras AND AT.EstatusRT = 0
SET @error = @@error
IF (@error<>0) GOTO TratarError

END

Identificador de traslado(IdTras)
UPDATE ArticulosTraslados SET EstatusRT = 1,DifProd = ABS(DifProd)
WHERE IdTras = @IdTras
AND CanEnv <> 0
SET @error = @@error
IF (@error<>0) GOTO TratarError

OpRecibo , OpcionTras , EstatusRec
traslado(IdTras)
UPDATE PeticionTraslado
SET EntDes = @NomUsua, OpRecibo = 1, OpcionTras = 1, Estatusrec = 1
WHERE IdTras = @IdTras
SET @error = @@error
IF (@error<>0) GOTO TratarError

existirla se realiza un 'ROLLBACK'
TratarError:
If @@Error<>0
BEGIN
PRINT 'Ha ecorrido un error. Abortamos la transacción'
ROLLBACK TRAN
END

COMMIT TRAN


SET NOCOUNT OFF

GO


Alguna Recomendacion.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida