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 03-11-2004
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
Borrar Registros relacionados

Hola amigos...

Mi pregunta es la siguiente....es posible borrar con una sentencia SQL un registro y sus relaciones con otras tablas esclavas, es decir si borramos por ejemplo el registro que hace referencia a una factura, podemos dentro de la misma sentencia SQL borrar tambien el detalle que tenga esta factura en otras tablas (obviamente enlazadas por el campo clave de la tabla maestra). Algo asi como hacer un join entre las tablas relacionadas con el registro a borrar dentro de una sola sentencia detele de SQL.
Y si es posible efectuarlo, se puede implementar dicha sentencia SQL dentro
de la propiedad DeleteSQL de un DataSet.

Gracias por cualquier ayuda

Saludos....
Responder Con Cita
  #2  
Antiguo 03-11-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Esa información que tú comentas se debe definir en las relaciones entre tablas (CONSTRAINTS), no en la sentencia SQL; No comentas qué Base de Datos utilizas, pero por lo general es así (no se si habrá alguna excepción, pero yo no la conozco).

En el ejemplo que tú comentas, cuando defines el constraint entre la tabla factura y sus relacionadas deberás decir si deseas borrados en cascada (también puedes hacerlo con los UPDATES), de forma que cuando borras una factura se borrarán sus relacionadas, pero no es una cosa que se define en cada sentencia SQL, sino que es un comportamiento para todos los registros de esa tabla.

En SQLServer, por ejemplo, al definir el constaint podrías añadir lo siguiente:

(extraído de la ayuda...)
Código SQL [-]
FOREIGN KEY REFERENCES ref_table ref_column
            [ ON DELETE { CASCADE | NO ACTION } ] 
            [ ON UPDATE { CASCADE | NO ACTION } ]
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 03-11-2004
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
Gracias amigo Neftali por tu respuesta, efectivamente en los CONSTRAINTS de las tablas relacionadas tengo definidos el borrado y actualizado en cascada, para cuando uno de los registros maestros sufre algun cambio (delete,edit). Mi pregunta iva enfocada a si en la sentencia delete (previamente informada la propiedad DeleteSQL) de un dataset, se podia incluir el borrado de registos de mas de una tabla (cuando existen relaciones entre estas).
Por cierto que en teoria, es el sevidor el que se encarga de borrar en cascada cuando se elimina un registro maestro que tenga relaciones en otras tablas. Pero aqui me asalta otra duda, como saber si efectivamente ese borrado en cascada se efectuo exitosamente, o es que si ocurre algun error o inconveniente durante el borrado en cascada, se cancela la eliminacion completa arrojando una excepcion.....
Como Base de datos utilizo Interbase 6.0 y componentes IBX para el acceso a datos, mas explicitamente Dataset
Responder Con Cita
  #4  
Antiguo 04-11-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por senpiterno
... a si en la sentencia delete (previamente informada la propiedad DeleteSQL) de un dataset, se podia incluir el borrado de registos de mas de una tabla (cuando existen relaciones entre estas).
Creeo que en la sentencioa SQL no vas a poder hacerlo (en una única).

Cita:
Empezado por senpiterno
......como saber si efectivamente ese borrado en cascada se efectuo exitosamente, o es que si ocurre algun error o inconveniente durante el borrado en cascada, se cancela la eliminacion completa arrojando una excepcion...
Bueno, supongo que ese borrado en cascada se efectua utilizando transacciones y "quiero creer" que si por alguna razón el borrado falla no se dejan cosas a medias, si alguien lo sabe seguro que lo confirme (ésto es una suposición); Si no es así yo realizaría el borrado en cascada manualmente utilizando una transacción de forma que el proceso se realize completo o no se haga.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
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


La franja horaria es GMT +2. Ahora son las 08:43:07.


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