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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-06-2015
jarlos jarlos is offline
Registrado
 
Registrado: sep 2006
Posts: 8
Poder: 0
jarlos Va por buen camino
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:
Código Delphi [-]
  ADConnection1.StartTransaction;
  if (qrMaster.ApplyUpdates(0) = 0) then begin
    if (qrDetails.ApplyUpdates(0) = 0) then begin
      ADConnection1.Commit;
      qrMaster.CommitUpdates;
      qrDetails.CommitUpdates;
      Showmessage('Información almacenada');
    end
    else begin
      ADConnection1.Rollback;
    end;
  end
  else begin
    ADConnection1.Rollback;
  end;

¿A alguien le ha pasado o sabe por qué puede estar pasando?

De antemano, muchas gracias.

Última edición por nlsgarcia fecha: 28-06-2015 a las 06:52:10. Razón: Sintaxis Delphi
Responder Con Cita
  #2  
Antiguo 30-06-2015
jarlos jarlos is offline
Registrado
 
Registrado: sep 2006
Posts: 8
Poder: 0
jarlos Va por buen camino
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:

Código Delphi [-]
  with (SchemaAdapter.DatSManager) do begin
    Relations.Clear;
    with (Relations.Add(
          'Orders_OrderDetails',
          mtMaster.Table.Columns.ItemsS['id1'],
          mtDetails.Table.Columns.ItemsS['fk_id1']).ChildKeyConstraint) do begin
      InsertRule := crCascade;
      UpdateRule := crCascade;
      DeleteRule := crCascade;
    end;
  end;


Saludos.
Responder Con Cita
  #3  
Antiguo 30-06-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.815
Poder: 9
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Gracias por compartir la solucion
Responder Con Cita
  #4  
Antiguo 31-05-2016
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 78
Poder: 2
Soa Pelaez Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 01-06-2016
jarlos jarlos is offline
Registrado
 
Registrado: sep 2006
Posts: 8
Poder: 0
jarlos Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema relación maestro-detalle mas filtrado en DBGrid DANIEL1818 SQL 12 23-06-2015 03:20:43
Problema con ApplyUpdate en relación maestro/detalle Ignacio Gentile Providers 1 26-12-2012 12:43:36
Saber si el DBGrid (Detalle) esta Vacio en Relacion Maestro/Detalle Adrian Murua Conexión con bases de datos 2 03-01-2009 13:48:46
Problema con relación maestro-detalle en ClientDataSet David Conexión con bases de datos 3 11-01-2008 11:02:59
Problema relacion maestro-detalle (Nested Dataset) Toni Conexión con bases de datos 10 19-05-2004 16:38:56


La franja horaria es GMT +2. Ahora son las 21:20:57.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi