Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Recorrer un registro al momento de borrar (https://www.clubdelphi.com/foros/showthread.php?t=61542)

Elite237 11-11-2008 23:53:31

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.

Caro 12-11-2008 01:10:20

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

duilioisola 12-11-2008 11:25:10

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

Delphius 12-11-2008 15:26:58

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,

Lepe 12-11-2008 15:37:34

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

Elite237 12-11-2008 16:46:36

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|
---------------+


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

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