Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-11-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Recorrer un registro al momento de borrar

Hola a todos. Tengo un problema con mi aplicacion.Tengo un sistema en el cual hay altas,bajas,modificaciones.Entonces tengo por ejemplo 3 titulos de revistas y cada uno tiene una clave.Lo que quiero lograr hacer es que cuando elimine un registro(un titulo)el registro que le seguia, tome la clave del registro que se borro.

Osea

1....fiesta
2....velada
3....romance

al momento de borrar el registro velada que me quede de la siguiente manera

1...fiesta
2...romance

lo que quiero es recorrer los registros al momento de borrarlos y que ocupe el lugar junto con su clave a el lugar donde estaba el registro pasado.
Responder Con Cita
  #2  
Antiguo 12-11-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola, yo creo que no es muy buena idea cambiarle el codigo que le asignas a cada registro de tu campo clave, si es tu campo clave es porque el codigo que le pongas nunca va cambiar, ademas si tuvieras tablas relacionadas también tendrías que cambiarle el codigo en el campo que hace de llave foranea.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #3  
Antiguo 12-11-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Si es clave, pienso que Caro tiene razón y no deberías modificarla.
De todos modos, no nos has dicho con qué motor de base de datos trabajas.
Si es con Firebird (o algun otro que tenga triggers) es muy fácil hacerlo.

Código SQL [-]
CREATE TRIGGER REVISTA_BD0 FOR REVISTA BEFORE DELETE 
AS 
BEGIN
   /* modifico la clave del siguiente con la que estoy borrando */
   update REVISTA
   set clave = old.clave
   where clave = old.clave + 1;
   /* hay que tener en cuenta que deberás modificar 
       todas las demas tablas que apunten a esta clave */
END
Responder Con Cita
  #4  
Antiguo 12-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola Elite237,
Como te han dicho, no es una práctica muy recomendable. Se supone que una clave es única. Además conlleva muchos peligros.

Si se elimina un registro, y hay otros registros relacionados a éste (es decir, existe una relación Maestro-Detalle) estos últimos registros apuntarán a un valor inexistente, por tanto se rompe el esquema de intregridad referencial.
Hay en forma breve dos alternativas:
1. O bien eliminas también los registros relacionados. Esto es conocido como efecto CASCADA.
2. O bien, en vez de eliminarlos, modificar la clave foránea de estos registros para que estén relacionados a otro registro maestro.

El segundo caso es sólo aplicable bajo ciertas circunstancias y depende fuertemente de las necesidades, requisitos.

¿Porqué deseas llevar a cabo ese extraño requisito? ¡Rompe los esquemas!
Ahora bien, si dicho campo no es en realidad una clave primaria o foránea, sino un campo cualquiera (una pseudo-clave) se puede implementar un triggers o algún procedimiento almacenado que se encargue de llevar a cabo toda la operación.

Existe, es algo habitual, una tercera opción que suele darse frente a los casos de borrados. En vez de hacer un borrado físico, se lo lleva a cabo a nivel lógico. ¿Cómo? Fácil, se añade un campo "booleano" llamado hipotéticamente Borrado. Por ejemplo si tiene el valor 0, significa que el campo no ha sido borrado, en otro caso, significa que se ha borrado. Dije "booleano" porque no todos los motores tienen un campo de tipo boolean (True, False).

Te comento todo esto porque son opciones, alternativas y cada una tiene sus pros y contras. Dependiendo de las circunstancias se puede llevar a cabo algunas o todas de las que te he comentado.

Mientras más sepamos sobre tu caso, mejor te podremos asesorar.
Espero que comprendas que lo que quieres hacer viola una de las reglas fundamentales de bases de datos.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 12-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Otra posibilidad: borrar el registro sin miramientos. Al dar de alta un nuevo registro, reutilizas ese hueco del código.

Para ello ya no puedes usar un generador, deberías usar procedimiento almacenado que se encargue de buscar esos huecos antes de dar de alta.

Por otro lado, no veo el por qué hacer lo que quieres. No es buena idea que una clave primaria tenga un valor para el usuario final, porque ese significado que tiene ahora, mañana puede cambiar y esto implica, remodelar toda la base de datos.

Lo normal es tener un generador como clave primaria, y ahora en un campo "codigoUsuario" es donde guardas el valor reutilizable, ese valor que tiene un significado especial para el usuario. Ahora ya puedes hacer uso de un SP que revisa los huecos posibles y hacer lo que sea, pero independientemente de la integridad referencial.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 12-11-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Gracias a todos por sus comentarios.Si es verdad que ese clave depende de otros campos que tengo en otras tablas, entonces lo que quiero es borrar todas los registros que dependan de este campo.Por ejemplo:

1...romance
2..velada
3..chistes

Tengo otra tabla donde vienen los tips para el titulo romance

1.1....noches(esto se relaciona con romance)
2.1....comida(esto se relaciona con velada)
3.1...borrachito(esto se relacion con chistes)

Ahora si yo borro 2-Velada...tambien que se borre 2.1-comida...y que se recorra la primer y segunda tabla y quede asi:
Código Delphi [-]
-----------+
Tabla1|
-----------+
1..romance|
2..chistes|
-----------+
 
------+ 
Tabla2|   
---------------+
1.1..noches|
2.1..borrachitos|
---------------+
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Borrar registro por codigo Alexandro Conexión con bases de datos 4 09-05-2008 13:29:25
Recorrer base de datos registro por registro Goyo SQL 3 06-09-2006 21:40:47
Borrar lineas detalle al borrar registro maestro akinom38 Conexión con bases de datos 3 11-01-2006 10:38:07
Recorrer Campos de Un Registro Jvilomar MS SQL Server 3 22-11-2005 09:06:14
Borrar registro .mdb con ADO Masu Conexión con bases de datos 3 23-02-2004 19:16:10


La franja horaria es GMT +2. Ahora son las 11:36:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi