Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Duda con Delete

Estas en el tema de Duda con Delete en el foro de SQL Server en Foros del Web. Hola a tod@s Soy un novato en esto de Bases de Datos, y mi consulta es la siguiente: tengo la tabla a, donde tengo los ...
  #1 (permalink)  
Antiguo 14/02/2008, 14:39
 
Fecha de Ingreso: septiembre-2007
Mensajes: 3
Antigüedad: 16 años, 7 meses
Puntos: 0
Duda con Delete

Hola a tod@s
Soy un novato en esto de Bases de Datos, y mi consulta es la siguiente:

tengo la tabla a, donde tengo los campos cédula (PK) y cuenta (identity), y otra tabla b con los campos cuenta (PK,identity) y saldo. Lo que yo quiero hacer es borrar una cuenta y su saldo dependiendo de la cédula que le corresponde.
Por ejemplo: tengo la cédula 99 que le corresponde la cuenta x, quiero borrar la cuenta y saldo que le corresponde a la cédula 99.
Bueno, no sé si fuí claro
Espero me puedan ayudar, muchas gracias.
  #2 (permalink)  
Antiguo 14/02/2008, 17:29
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Duda con Delete

-- primero borras la cuenta
DELETE B WHERE cuenta = (SELECT cuenta FROM A WHERE CEDULA = 99)
-- Despues, borras la cedula
DELETE A WHERE CEDULA = 99
  #3 (permalink)  
Antiguo 14/02/2008, 21:12
 
Fecha de Ingreso: septiembre-2007
Mensajes: 3
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: Duda con Delete

Hola
Primero que nada, muchas gracias por responder y ayudarme.
Intente hacerlo como me dijiste pero no puedo eliminar la cuenta, debe ser que estoy haciendo algo mal o tengo mal el diseño de tablas.
Voy a ver si puedo explicarme mejor.
Tengo las siguientes tablas:
Personas (idCédula PK,nombre,direccion)
Clientes (idCédula FK)
Cuentas(idCuenta PK identity,saldo)
Titular (idCédula Fk, Cuenta identity FK)
Lo que yo quiero hacer es un procedimiento almacenado para eliminar un cliente y a su vez me elimine su cuenta.
Estoy intentando hacerlo de ésta manera:

CREATE PROCEDURE EliminarClientes @Ci int AS
BEGIN
DECLARE @Error int

if (NOT EXISTS (SELECT ci FROM clientes WHERE ci=@ci))
BEGIN
RETURN 0;
END
ELSE
BEGIN
BEGIN TRAN

delete clientes
where ci=@ci;
SET @Error=@@ERROR;

delete Titular
where ci=@ci;
set @Error=@@ERROR;

DELETE cuentas
WHERE cuenta = (SELECT cuenta FROM titular WHERE ci = @ci)
SET @Error=@@ERROR;

delete Personas
WHERE ci = @ci;
SET @Error=@@ERROR;

IF(@Error=0)
BEGIN
COMMIT TRAN;
RETURN 1;
END
ELSE
BEGIN
ROLLBACK TRAN;
RETURN 0;
END
END
END
go

El tema es que me elimina el cliente de todas las tablas menos de la tabla cuentas
es decir, no puedo borrar la cuenta que le corresponde a ese cliente.
Bueno, de nuevo muchas gracias por ayudarme y un saludo
  #4 (permalink)  
Antiguo 15/02/2008, 10:34
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Re: Duda con Delete

Como lo comento el compañero iislas, primero se debe borrar la cuenta ya que para cuando busca la cuenta del titular, ya habias eliminado el titular y no encuentra nada....

Adicional, el codigo de error @@Error se reemplaza cada vez que se ejecuta una operacion, es por eso que hay que manejarlo de forma acumulativa si es que se va a evaluar al final...



Código:
CREATE PROCEDURE dbo.EliminarClientes @Ci int 
AS
DECLARE @Error int, @cuenta int

If (SELECT count(1) FROM clientes WHERE ci=@ci) > 0
BEGIN
   RETURN 0;
END 
ELSE
BEGIN
   BEGIN TRAN
   
   Delete clientes where ci=@ci;
   SET @Error = @@ERROR;

   -- Primero se debe eliminar la cuenta, para que se busque la cuenta
   -- que tiene asignado el titular.
   if (SELECT cuenta FROM titular WHERE ci = @ci) > 0
   Begin
      DELETE cuentas 
      WHERE cuenta = (SELECT cuenta FROM titular WHERE ci = @ci)
      Set @Error = @Error + @@ERROR;
   End    
   
   If (Select count(1) from Titular Where ci = @ci) > 0
   Begin
      Delete Titular where ci=@ci;
      Set @Error = @Error + @@ERROR;
   Else 
   End
   
   If (Select count(1) from Personas Where ci = @ci) > 0
   Begin
      Delete Personas   WHERE ci = @ci;
      Set @Error = @Error + @@ERROR;
   End  
 
   IF(@Error = 0)
   BEGIN
      COMMIT TRAN;
      RETURN 0;
   END
   ELSE
   BEGIN
      ROLLBACK TRAN;
      RETURN 1;
   END 
END
GO
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #5 (permalink)  
Antiguo 15/02/2008, 10:35
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Duda con Delete

Primero, debes borrar las de CUENTAS y al final el CLIENTE, no puedes (debes) dejar "Hijos huerfanos"
  #6 (permalink)  
Antiguo 15/02/2008, 16:43
 
Fecha de Ingreso: septiembre-2007
Mensajes: 3
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: Duda con Delete

Hola
He intentado como tú dices Andres95 pero no me funciono (no me elimina de ninguna tabla). Pero he probado así:
Código:
CREATE      PROCEDURE EliminarClientes 	@Ci   int AS
BEGIN 
	DECLARE @Error int
	if (NOT EXISTS (SELECT ci FROM clientes WHERE ci=@ci))
	BEGIN
		RETURN 0;
	END	
	ELSE
	BEGIN
		BEGIN TRAN
		
		DELETE cuentas 
		WHERE cuenta = (SELECT cuenta FROM titular WHERE ci = @ci)
		SET @Error=@@ERROR;

		delete titular 
		where ci=@ci;
		set @Error=@@ERROR+@error;

	        delete clientes
		where ci=@ci;
		SET @Error=@@ERROR+@error;

		delete Personas
		WHERE ci =  @ci;
		SET @Error=@@ERROR+@error;

		IF(@Error=0)
		BEGIN
			COMMIT TRAN;
			RETURN 1;
		END
		ELSE
		BEGIN
			ROLLBACK TRAN;
			RETURN 0;
		END	
	END
END
go
y.. si me ha funcionado , me elimina de todas las tablas !!
Que les parece el codigo? podría optimizarlo?
El gran problema (creo yo) es que tenía la tabla titular de la siguiente manera:

create table Titular (
ci int not null primary key ,
cuenta int not null identity (1000,1),
foreign key (ci) references Personas (ci),
foreign key (cuenta) references Cuentas (cuenta)

al borrar la última linea me funciono!!
Bueno Muchas gracias a los dos por ayudarme , siempre es bueno contar con gente como ustedes !!!
Saludos
  #7 (permalink)  
Antiguo 15/02/2008, 18:19
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Duda con Delete

Se deberia y podria optimizar, siempre y cuando tus relaciones fueran las correctas y utilizaras el DELETE ON CASCADE
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:10.