![]() |
FireDAC - Problema con relación Maestro/detalle y columna AutoInc
Hola...
Estoy presentando un inconveniente con los componentes FireDAC. Tengo una tabla maestra y una tabla de detalles. La tabla maestra tiene un campo AutoInc que es el campo clave y sirve para relacionar con la tabla de detalles. En estos momentos puedo hacer inserciones y modificaciones de registros. Adicionalmente en la tabla de detalles he creado una restricción "unique constraint" que cuando se "viola" genera una excepción. El problema se presenta cuando un usuario guarda los datos y se genera la excepción. Cuando un usuario crea un nuevo registro el campo clave AutoInc tiene el valor -1 y todos los renglones de detalles que se van agregando toman el valor -1 en el campo de la relación. Al ejecutar el "ApplyUpdates" en el maestro, el campo AutoInc toma el próximo valor que le corresponde en la base de datos (MS SQL Server) en la tabla maestra (ejemplo: 5) y cuando se ejecuta el "ApplyUpdates" de los detalles se genera la excepción y el campo de la relación en los renglones de detalles se mantienen en -1. Esto hace que los renglones de detalles se pierdan porque ya no pertenecen al maestro "actual". No sé si estoy omitiendo alguna instrucción o algún parámetro de conexión o parámetro de los querys. El código para guardar que estoy utilizando es:
¿A alguien le ha pasado o sabe por qué puede estar pasando? De antemano, muchas gracias. |
Hola...
Listo, he encontrado la falla. Si alguien se tropieza con el problema, la solución es crear la relación maestro/detalle en el SchemaAdpater. Esto es de caracter obligatorio, no basta con establecer la relación maestro/detalle en las propiedades del DataSet detalle: MasterSource, MasterFields e IndexFieldNames). El siguiente código es extraído de los ejemplos:
Saludos. |
Gracias por compartir la solucion ^\||/
|
Me podrías decir como fue la implementación de tu solución, en donde colocaste el código, o si pudieras colocar el código completo como te funcionó te lo agradecería.
|
Hola Soa...
Respuesta corta: Ahorita no recuerdo dónde se implementa el fragmento de código que publiqué, en la ayuda de los FireDAC lo puedes encontrar, realmente dejé los FireDAC en segundo plano. Respuesta larga: Después del problema por el cual inicié este post me topé con muchos más y es debido a la forma en la que funcionan los FireDAC. Al final, y para simplificar las cosas, opté por dejar en segundo plano los componentes FireDAC y utilizarlos básicamente para control de conexión a bases de datos. Con ellos puedo tener la facilidad de cambiar de Sistema Gestor de Base de datos sin mucho (o ningún) esfuerzo en el código fuente. Opté también por mezclar un poco de Datasnap con FireDAC, haciendo relaciones maestro/detalles con ClientDataSets anidados (nested). Dejé el trabajo a los TClientDataSet para que los usuarios "jugaran" todo lo que quisieran con sus datos (maestros/detalles), al TDataSetProvider el trabajo de empaquetar/desempaquetar los detalles anidados y generar las consultas necesarias para inserciones, modificaciones y borrados de datos, y al TFDQuery el trabajo de ejecución de sentencias/consultas en la base de datos. Código fuente sobre Datasnap puedes conseguir mucho en la web, incluso conseguirás ejemplos y tutoriales de cómo implementar Datasnap para aplicaciones multicapas (n-tier). Si quieres conocer más, te sugiero que comiences con Datasnap (, DBExpress o FireDAC) y ClientDataSets anidados. Bob Swart tiene buenos artículos y tutoriales en la web, además de vídeos en youtube. Recientemente leí un libro de Cary Jensen sobre ClientDataSets y aquí publicó un artículo explicativo con ejemplos: edn.embarcadero.com/article/29825 En ese artículo se explican dos formas de relacionar maestros/detalles con ClientDataSets anidados. Usa el modelo "maletín", es decir, solo ClientDataSets sin conexión a bases de datos. Espero haber sido de ayuda. Saludos. |
La franja horaria es GMT +2. Ahora son las 05:23:03. |
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