PDA

Ver la Versión Completa : No elimina el detalle, DBExpress - Master-Detail


Jere_84
14-03-2012, 22:17:36
Hola tengo un DBExpress - Master-Detail echo en Delphi 2010 con Datasnap
como Base de datos utilizo SQL Server 2008 Express

Del lado del servidor tengo:
- Un SQLDataset para el maestro y otro para el detalle
- Un DataSource enlazado con el DatasetMaestro
- El detalle se conecta con el Datasource por su propiedad Datasource
- Un DatasetProvider relacionado con el maestro

Del lado del cliente tengo:
- Un ClientDataset del maestro y su correspondiente DataSource
- Un ClientDataset del detalle y su correspondiente DataSource

Todo funciona muy bien, lo único al momento de eliminar solo elimina el registro de la cabecera y no los detalles. En el DataSetPrivider del lado servidor tilde la opción poCascadeDeletes pero nada.
¿Alguien tendrá alguna sugerencia?

Disculpa a el moderador en caso de que este post no este en el lugar correcto no encontré un lugar mejor! :D

Jere_84
15-03-2012, 21:41:52
No eh podido hacer la eliminación de los registro del detalle, hacer un "WHILE" quizás funcione pero que gracia tendría hacer un maestro-detalle!!

Por favor gente alguna sugerencia!

Jeremías.

TiammatMX
15-03-2012, 22:20:39
No eh podido hacer la eliminación de los registro del detalle, hacer un "WHILE" quizás funcione pero que gracia tendría hacer un maestro-detalle!!

Por favor gente alguna sugerencia!

Jeremías.
Creo que estás poniendo la carreta delante del caballo..., el orden de borrado es: Primero borras los detalles y solamente en caso que no exista alguna excepción o error procedes a borrar el encabezado, para conservar la integridad referencial de tu base de datos...

Jere_84
15-03-2012, 23:12:02
Gracias tiammat por tu respues hice esto: if not FormPrinc.SQLConnectionDatsnap.InTransaction then
begin
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
FormPrinc.SQLConnectionDatsnap.StartTransaction(TD);
try
DataModuleConsulta.ClientDataSetDetalle.First;
while not DataModuleConsulta.ClientDataSetDetalle.Eof do
begin
DataModuleConsulta.ClientDataSetDetalle.Delete;
Next;
end;
DataModuleConsulta.ClientDataSetCabecera.Delete;
DataModuleConsulta.ClientDataSetCabecera.ApplyUpdates(-1);
FormPrinc.SQLConnectionDatsnap.Commit(TD);
except
ShowMessage('No se puede eliminar. Intente luego');
FormPrinc.SQLConnectionDatsnap.Rollback(TD);
end;
end;

Y Funciona!! pero lo que yo tenia entendido es que hacer una conexion BBexpress Master-Detail con solo eliminar la cabecera aliminaba los detalles.. para que serviria la propiedad poCascadeDeletes del DSProvider del lado servidor.

Jere_84
17-03-2012, 13:33:25
Si alguien a echo una relación Master/Detail en datasnap con DBExpress
¿Utilizo la eliminación en cascada? en teoria al activar el poCascadeDeletes del DSProvider debe eliminar los detalle llamando el Delete de la cabecera.

Esta es una cita de La cara oculta de Delphi 6

"Si poCascadeDeletes , por ejemplo, no está activa, entonces no podemos borrar un cliente en el TClientDataSet si tiene pedidos asociados. Tendríamos que eliminar primero todos los detalles, y luego todos los pedidos para poder entonces borrar el registro del cliente. Es cierto que podemos programar el borrado automáticamente utilizando eventos del conjunto de datos cliente. Pero si activamos la opción mencionada, podríamos eliminar directamente un cliente aunque tenga detalles a su cargo; en tal caso, los registros de detalles desaparecen por arte de magia. Ahora bien, esto significa que el proveedor solamente emitirá una instrucción delete para el registro maestro. "

Yo active esta propiedad pero solamente me elimina el maestro y no sus detalle. ¿Que estaré haciendo mal?:(

Gracias por leerme.

Casimiro Notevi
17-03-2012, 13:45:52
Yo active esta propiedad pero solamente me elimina el maestro y no sus detalle. ¿Que estaré haciendo mal?

Casi no conozco dbexpress, pero sólo por dar alguna pista, no sé si será correcto: se supone que esas tablas maestro/detalle están relacionadas mediante algún campo.

Jere_84
20-03-2012, 14:16:54
Bueno ya encontre la solución a este problema.

Muchas gracias! :)

Casimiro Notevi
20-03-2012, 14:54:54
¿Y cuál fue la solución? :)

Jere_84
20-03-2012, 19:48:10
La solucion es que la propiedad poCascadeDeletes no elimina los detalles lo que hace es que habilitar a eliminar un maestro que tenga detalles, por lo tanto la eliminacion de los detalles queda a cargo del motor de base de datos.
Por ejemplo si esta opción poCascadeDeletes no esta habilitada no podrás eliminar una cabecera con detalles, tendrás que hacerlo de forma manual recorriendo con un bucle los detalles eliminando uno por uno y luego eliminar su cabecera (esto no es la eliminación en cascada).
Al habilir esta opcion se puede eliminar registros del maestro que posean detalles, y si en la base de datos declaraste claves foránea con solo hacer:

ClientDataSetMaestro.Delete

Se eliminaran los detalles.

Saludos. :D:D

pablonill
18-05-2012, 16:31:59
Probaste usando DataSetFields???

Jere_84
18-05-2012, 16:58:41
Probaste usando DataSetFields???
Hola pablonill, a que te referis DataSetFields?

pablonill
22-05-2012, 02:22:03
Hola, como estas?, no soy el gran programador!, pero estuve leyendo y utilizo DataSetFields, ya voy a armar un ejemplo y te lo subo!, un abrazo!