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)
-   -   Tablas Maestro-Detalle (https://www.clubdelphi.com/foros/showthread.php?t=11147)

silviodp 07-06-2004 16:04:00

Tablas Maestro-Detalle
 
Como se hace para eliminar un registro en una Tabla Maestro-Detalle, ya que cuando elimino, uno en la tabla Maestro me sigue dejando los que estaban relaciondos con éste en la tabla Detalle, y por su puesto lo que quiero es que me elimine, tanto el registro de la tabla Maestro como los que estan relacionados con éste en la Detalle.
Yo escribi el siguiente código para hacerlo pero no funciona:
Código:

procedure TForm3.eliminarClick(Sender: TObject);  //ELIMINAR Registros, si tabla
var
 n,m:Variant;
begin
 n:=Modulodatos.TblConsumos.FieldValues['IDCONSUMO'];
 ModuloDatos.TblConsumos.Delete;
 ModuloDatos.TblDetproducto.Active:=True;
 ModuloDatos.TblDetproducto.First;
 While Not ModuloDatos.TblDetproducto.Eof Do
  begin
    m:=ModuloDatos.TblDetproducto.FieldValues['CONSUMO'];
    If n=m Then
      ModuloDatos.TblDetproducto.Locate('IDCONSUMO',m,[]);
      ModuloDatos.TblDetproducto.Delete;
    end;
  Next;
 If Modulodatos.TblConsumos.IsEmpty Then
  begin
  Modificar.Enabled:=False;                  //es vacía desactiva botones.-
  Eliminar.Enabled:=False;
  end;
end;

Gracias.

Silvio.-

cbrrr 07-06-2004 16:14:43

Hola silviodp

Si usas un motro de base de datos relacional te aconsejo usar Claves foráneas con borrado en cascada

sería algo así:

Código SQL [-]
 alter table MiTabla
 add constraint MiConstraint
 foreign key (campos)
 references TablaReferencia (campos)
 on delete cascade on update cascade

Espero que te sirva

__marcsc 07-06-2004 16:18:05

Hola,

Suponiendo que no puedas (ya sea porqué tu BD no lo permite o pq simplemente no tienes permisos para hacerlo) establecer algún tipo de regla de integridad a nivel de base de datos como te comenta cbrrr, lo que se suele hacer es programar un código para borrar los registros del detalle en el evento BeforeDelete del maestro. De este modo, con solo eliminar el registro del maestro ya se eliminan automáticamente los registros del detalle.

Un saludo.

silviodp 07-06-2004 16:39:17

Tablas Maestro-Detalle
 
Si yo utilizo el codigo que escribi antes en el evento BeforeDelete de la tabla Maestra, Uds. creen que puede hacer lo que quiero?, o el codigo no esta bien??
Gracias, saludos.

Silvio.-

__marcsc 07-06-2004 16:44:28

En el BeforePost solo tendrías que hacer

Código Delphi [-]
while not Detalle.Eof do
  Detalle.Delete

Saludos!

jachguate 07-06-2004 17:36:57

Cita:

Empezado por marcsc
En el BeforePost solo tendrías que hacer

Supongo, Marc, que has querido decir en el BeforeDelete...

Hasta luego.

;)

__marcsc 07-06-2004 17:51:53

Ups!! Por supuesto!! :eek:

En qué estaría yo pensando :rolleyes:

Gracias por la corrección!

cbrrr 07-06-2004 19:33:04

Anque sea correcta la forma de tratar el problema por parte de marcsc.....

sigo pensando que será más eficiente realizar esa tarea desde el propio motor de la base de datos si este lo permite que codificarlo desde Delphi

Saludos

__marcsc 07-06-2004 19:38:05

Hola,

quizás no me expresé bien en mi primer mensaje. Lo que quería decir es que a mi el método que me parece más correcto es el que tu propones, pero suponiendo que ésto no sea posible por el motivo que sea, hay la alternativa de hacerlo via eventos de DataSet.

Lo siento si no me expresé bien :)

Un saludo!

silviodp 07-06-2004 20:55:02

Tablas Maestro-Detalle
 
En el BeforePost?, no entiendo...

__marcsc 07-06-2004 20:58:08

Cita:

Empezado por silviodp
En el BeforePost?, no entiendo...

No no, lo siento, fue un despiste, el código que te he puesto sería para el BeforeDelete

:o

silviodp 07-06-2004 22:15:29

Tablas maestro-detalle
 
La verdad es que no se como hacerlo desde el motor de bases de datos, el que estoy usando es el BDE, con tablas Paradox 7, no sé si se puede hacer lo que Uds. dicen, si es así me podrian dar un ejemplo de como.
Gracias.

Silvio.-

cbrrr 07-06-2004 22:36:06

Lamentablemente, Paradox no soporta los deletes en cascada, solo las actualizaciones (que puedes definirlas desde el propio DatabaseDesktop)

roman 07-06-2004 22:55:22

Cita:

Empezado por silviodp
no sé si se puede hacer lo que Uds. dicen, si es así me podrian dar un ejemplo de como.

El ejemplo es de hecho el que te da marcsc en el mensaje #5. Lo único que debes tener en cuenta es que ese código debes ponerlo en el evento BeforeDelete de la tabla maestra (TblConsumos en tu caso) y que la tabla detalle (TblDetProducto en tu caso) debe estar enlazada a la maestra precisamente en una relación maestro-detalle mediante las propiedades MasterSource y MasterFields.

La idea es de hecho la misma que tenías tú originalmente pero simplificada.

// Saludos


La franja horaria es GMT +2. Ahora son las 03:47:37.

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