SQL Server - Duplicacion de registros al insertar

   
Vista:

Duplicacion de registros al insertar

Publicado por Victor Sanchez (4 intervenciones) el 19/08/2008 00:55:15
Alguien sabe pq se duplican 4 registros al insertar en sql server 2000, al ejecutar el sp me inserta 4 registros, lo mas raro es q solo lo hace en algunas ocasiones.

Aqui les dejo el codigo de sp, para ver si alguien puede ayudarme.

CREATE PROCEDURE spMovtoCteFrecuente
@IdCteFrecuente as int OUTPUT,
@Opcion as int,
@Nombre as varchar(50),
@ApellidoPaterno as varchar(50),
@ApellidoMaterno as varchar(50),
@TipoCalle as varchar(50),
@Calle as varchar(100),
@NoOficial as varchar(50),
@NoInterior as varchar(50),
@Orientacion as varchar(50),
@CodigoPostal as varchar(50),
@TipoColonia as varchar(50),
@Telefono as varchar(50),
@TelefonoEmpresa as varchar(50),
@Estado as varchar(50),
@Ciudad as varchar(50),
@Email as varchar(50) = null,
@Empresa as varchar(50),
@FechaNacimiento as varchar(20),
@Suspender as tinyint,
@Colonia as varchar(50),
@IdUser as int,
@Error as int OUTPUT,
@ErrorText as varchar(100) OUTPUT,
@Tarjeta as varchar(12) = NULL OUTPUT
AS

SET NOCOUNT ON

BEGIN TRAN

DECLARE @IdOrientacion as int
DECLARE @IdTipoCalle as int
DECLARE @IdCiudad as int
DECLARE @IdEstado as int
DECLARE @IdTipoColonia as int
DECLARE @IdEmpresaCliente as int
DECLARE @IdColonia as int

SET @Error=0
SET @ErrorText=''

--VALIDACIONES
IF @Opcion<>1 AND @Opcion<>2
BEGIN
SET @Error=-1
SET @ErrorText='La opcion es incorrecta'
GOTO Error
END
IF @Estado=''
BEGIN
SET @Error=-2
SET @ErrorText='El campo del estado esta vacio'
GOTO Error
END

SET @IdEstado=(SELECT IdEstado FROM TCEstados WHERE Nombre like @Estado)
IF @IdEstado IS NULL
BEGIN
SET @Error=-4
SET @ErrorText='El estado no existe'
GOTO Error
END

IF @Ciudad=''
BEGIN
SET @Error=-5
SET @ErrorText='El campo de la ciudad esta vacio'
GOTO Error
END

SET @IdCiudad=(SELECT IdCiudad FROM TCCiudades WHERE Nombre like @Ciudad AND IdEstado=@IdEstado)
IF @IdCiudad IS NULL
BEGIN
SET @Error=-6
SET @ErrorText='La ciudad no existe'
GOTO Error
END

IF @Nombre=''
BEGIN
SET @Error=-7
SET @ErrorText='El nombre esta vacio'
GOTO Error
END

IF @ApellidoPaterno=''
BEGIN
SET @Error=-8
SET @ErrorText='El Apellido Paterno esta vacio'
GOTO Error
END

IF @ApellidoMaterno=''
BEGIN
SET @Error=-9
SET @ErrorText='El Apellido Materno esta vacio'
GOTO Error
END

IF @Calle=''
BEGIN
SET @Error=-10
SET @ErrorText='La Calle esta vacia'
GOTO Error
END

IF @NoOficial=''
BEGIN
SET @Error=-11
SET @ErrorText='El NoOficial esta vacio'
GOTO Error
END

IF @NoInterior=''
BEGIN
SET @Error=-12
SET @ErrorText='El NoInterior esta vacio'
GOTO Error
END

IF @Telefono=''
BEGIN
SET @Error=-13
SET @ErrorText='El Telefono esta vacio'
GOTO Error
END

IF @TelefonoEmpresa=''
BEGIN
SET @Error=-14
SET @ErrorText='El Telefono de la Empresa esta vacio'
GOTO Error
END

IF @FechaNacimiento=''
BEGIN
SET @Error=-15
SET @ErrorText='La Fecha de Nacimiento esta vacia'
GOTO Error
END

IF @TipoCalle=''
BEGIN
SET @Error=-16
SET @ErrorText='El Tipo de Calle esta vacio'
GOTO Error
END
SET @IdTipoCalle=(SELECT IdTipoCalle FROM TCTipoCalle WHERE Descripcion like @TipoCalle)
IF @IdTipoCalle IS NULL
BEGIN
SET @Error=-17
SET @ErrorText='El Tipo de Calle no existe'
GOTO Error
END

IF @Orientacion=''
BEGIN
SET @Error=-18
SET @ErrorText='El campo orientacion esta vacio'
GOTO Error
END
SET @IdOrientacion=(SELECT IdOrientacion FROM TCOrientaciones WHERE Descripcion like @Orientacion)
IF @IdOrientacion IS NULL
BEGIN
SET @Error=-19
SET @ErrorText='La orientacion no existe'
GOTO Error
END

IF @TipoColonia=''
BEGIN
SET @Error=-20
SET @ErrorText='El campo tipo colonia esta vacio'
GOTO Error
END
SET @IdTipoColonia=(SELECT IdTipoColonia FROM TCTipoColonia WHERE Descripcion like @TipoColonia)
IF @IdTipoColonia IS NULL
BEGIN
SET @Error=-21
SET @ErrorText='El tipo de colonia no existe'
GOTO Error
END

IF @Empresa=''
BEGIN
SET @Error=-22
SET @ErrorText='El campo empresa del cliente esta vacio'
GOTO Error
END
SET @IdEmpresaCliente=(SELECT IdEmpresaCliente FROM TblEmpresaCliente WHERE NombreComercial like @Empresa)
IF @IdEmpresaCliente IS NULL
BEGIN
SET @Error=-23
SET @ErrorText='La empresa del cliente no existe'
GOTO Error
END

IF @Colonia=''
BEGIN
SET @Error=-24
SET @ErrorText='El campo de la colonia esta vacio'
GOTO Error
END
SET @IdColonia=(SELECT IdColonia FROM TCColonias WHERE Nombre like @Colonia)
IF @IdColonia IS NULL
BEGIN
SET @Error=-25
SET @ErrorText='La colonia no existe'
GOTO Error
END

IF @CodigoPostal=''
BEGIN
SET @Error=-26
SET @ErrorText='El Codigo Postal esta vacio'
GOTO Error
END

--NUEVO
IF @Opcion=1
BEGIN

INSERT INTO TblClienteFrecuente
VALUES (
@Nombre,
@ApellidoPaterno,
@ApellidoMaterno,
@IdTipoCalle,
@Calle,
@NoOficial,
@NoInterior,
@IdOrientacion,
@CodigoPostal,
@IdTipoColonia,
@IdColonia,
@IdCiudad,
@IdEstado,
@Telefono,
@TelefonoEmpresa,
@FechaNacimiento,
Getdate(),
@IdUser,
0,
0,
0,
@IdEmpresaCliente,
@Email,
''
)

set @IdCteFrecuente=@@identity

SET @Error=@@error

IF @Error<>0
BEGIN
SET @ErrorText='Error al crear los datos'
GOTO Error
END

DECLARE @Grupo1 as varchar(3)
DECLARE @Grupo2 as varchar(6)
DECLARE @Grupo3 as varchar(3)

set @Grupo1=dbo.AgregarCeros(ABS(CAST(NEWID() as binary(6)) % 1000) + 1,3)
set @Grupo2= dbo.AgregarCeros(cast(@IdCteFrecuente as varchar(6)),6)
set @Grupo3=dbo.AgregarCeros(ABS(CAST(NEWID() as binary(6)) % 1000) + 1,3)

set @Tarjeta=@Grupo1+@Grupo2+@Grupo3

UPDATE TblClienteFrecuente SET NoTarjeta=@Tarjeta WHERE IdCteFrecuente=@IdCteFrecuente

SET @Error=@@error
IF @Error<>0
BEGIN
SET @ErrorText='Error al crear la tarjeta'
GOTO Error
END

END

--MODIFICAR
IF @Opcion=2
BEGIN

UPDATE TblClienteFrecuente
SET
Nombre=@Nombre,
ApellidoPaterno=@ApellidoPaterno,
ApellidoMaterno=@ApellidoMaterno,
IdTipoCalle=@IdTipoCalle,
Calle=@Calle,
NoOficial=@NoOficial,
NoInterior=@NoInterior,
IdOrientacion=@IdOrientacion,
CodigoPostal=@CodigoPostal,
IdTipoColonia=@IdTipoColonia,
Telefono=@Telefono,
TelefonoEmpresa=@TelefonoEmpresa,
IdEstado=@IdEstado,
IdCiudad=@IdCiudad,
Email=@Email,
IdEmpresaCliente=@IdEmpresaCliente,
FechaNacimiento=@FechaNacimiento,
Suspender=@Suspender,
IdUsuarioSuspende=@IdUser,
FechaSuspende=Getdate()
WHERE IdCteFrecuente=@IdCteFrecuente

SET @Error=@@error

IF @Error<>0
BEGIN
SET @ErrorText='Error al actualizar los datos'
GOTO Error
END
END

SET NOCOUNT OFF

Error:
IF @Error <> 0
ROLLBACK TRAN
ELSE
COMMIT TRAN
GO
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Duplicacion de registros al insertar

Publicado por Isaias (3308 intervenciones) el 19/08/2008 15:07:38
Por principio de cuentas, la metodologia del desarrollo en 3 capas (front-transaccional-base, comunmente llamado CLIENTE-SERVIDOR), nos indica que el 99.99% de las validaciones la debe hacer la capa FRONT, por lo visto, tu no confias en esta base.

Segundo, no veo donde se esten duplicando tus registros, a menos, claro esta, que desde el front (tal vez una pagina WEB) le den varias veces "click" al boton de guardar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duplicacion de registros al insertar

Publicado por Victor Sanchez (4 intervenciones) el 19/08/2008 22:09:53
Lo que mencionas es correcto, no confio en el front, pero no por que no confie en quien lo hace, si no por que yo aplico lo de las tres capas de esa manera, el front es la primera murallla, despues vienen las traccciones y despues triggers, constraints, etc de esta manera te aseguras de cuidar tu base.

Trato de hacer sistemas mas dinamicos tratando de no depender de un front, y se que el procedimiento no esta mal, pero me ha pasado en otras ocasiones que al insertar desde el front o desde un stored procedure se inserta el mismo registro hasta cuatro veces, el boton no se presiona 4 veces, esto me ha sucedido raras veces pero me ha llamado la atencion por que no le he encontrado explicacion, ya he buscado si alguien mas le ha pasado en internet pero nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duplicacion de registros al insertar

Publicado por Isaias (3308 intervenciones) el 20/08/2008 17:57:17
Bueno, si no confias en la parte de FRONT, entonces crea PRIMARY KEY o bien INDICES UNIQUE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar