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 03-08-2011
Luis F. Orjuela Luis F. Orjuela is offline
Miembro
 
Registrado: may 2003
Ubicación: Bogotá - Colombia
Posts: 68
Poder: 21
Luis F. Orjuela Va por buen camino
Problemas inserción de registros en IBDataset maestro-detalle y Foreign Key

Señores muy buenos dias.

Algo muy raro está pasando o simplemente me ha ganado el tema.

He buscado por todo lado aparte de nuestro amado foro pero nada de nada.

Paso a detallar el problema:

Tengo una base de datos Firebird 2.5 con las siguientes tablas:
Código SQL [-]
CREATE TABLE DEPART (
  COD_DEPARTAMENTO VARCHAR(2) CHARACTER SET ISO8859_1 NOT NULL COLLATE ISO8859_1,
  NOMBRE_DEPARTAMENTO VARCHAR(50) CHARACTER SET ISO8859_1 NOT NULL COLLATE ISO8859_1);


ALTER TABLE DEPART ADD PRIMARY KEY (COD_DEPARTAMENTO);


CREATE TABLE MUNIC (
  COD_DEPARTAMENTO VARCHAR(2) CHARACTER SET ISO8859_1 NOT NULL COLLATE ISO8859_1,
  COD_MUNICIPIO VARCHAR(3) CHARACTER SET ISO8859_1 NOT NULL COLLATE ISO8859_1,
  NOMBRE_MUNICIPIO VARCHAR(30) CHARACTER SET NONE NOT NULL COLLATE NONE);


ALTER TABLE MUNIC ADD PRIMARY KEY (COD_DEPARTAMENTO,COD_MUNICIPIO);

Dentro del formulario tengo dos IBDataSet con sus instrucciones SQL y en relación maestro-detalle funcionando bien.

Lo de "funcionando bien" lo digo porque en las pruebas que he realizado al momento de ingresar registros tanto en la tabla maestra (DEPART) como en la tabla detalle (MUNIC) lo hace bien, pues al consultar la base de datos luego de la operación se refleja la información.

Pero vaya sorpresa que cuando dentro de la base de datos quise colocar una validación de integridad referencial es decir una llave foránea para la tabla MUNIC sobre el campo COD_DEPARTAMENTO:

Código SQL [-]
ALTER TABLE MUNIC ADD CONSTRAINT FK_MUNIC FOREIGN KEY (COD_DEPARTAMENTO) REFERENCES DEPART(COD_DEPARTAMENTO) ON DELETE CASCADE ON UPDATE CASCADE;

El proceso de inserción de registros sólo me graba la información en la tabla Maestra y NO graba nada en la tabla Detalle. A continuación muestro el código en el cual grabo en la base de datos:

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
begin

    With IBD_Departamento do
     begin
       Open;
       Insert;
       FieldByName('COD_DEPARTAMENTO').Value:=cxTextEdit1.Text;
       FieldByName('NOMBRE_DEPARTAMENTO').Value:=cxTextEdit2.Text;
       Post;
       IBD_Municipios.ApplyUpdates;
       IBTransaction1.CommitRetaining;
       Close;
     end;
end;

La tabla detalle tiene activada la propiedad "CacheUpdates"

En el evento OnBeforePost de la tabla detalle tengo el siguiente código para forzar que el campo COD_DEPARTAMENTO sea el mismo de la tabla maestra:

Código Delphi [-]
procedure TForm1.IBD_MunicipiosBeforePost(DataSet: TDataSet);
begin
//  IBD_Municipios.FieldByName('COD_DEPARTAMENTO').AsString := IBD_Departamento.FieldByName('COD_DEPARTAMENTO').AsString;

      With IBD_Municipios do
       begin
        FieldByName('COD_DEPARTAMENTO').Value:=cxTextEdit1.Text;
       end;

end;

Aunque la literatura dice que utilizando la instrucción
Código Delphi [-]
CopyMasterFieldToDetail := True;
la cual está en la unidad IBUTILS.PAS que se debe agregar en el USES del formulario, debería colocar el valor de forma automática pero la verdad no funciona.

En espera de sus comentarios, un calurosos saludo desde Bogotá-Colombia

PD: Si así lo quieren puedo subir el código fuente y la base de datos para poder ser más específicos y dar con el problema.
__________________
Ing. LUIS FERNANDO ORJUELA
BOGOTA - COLOMBIA
Responder Con Cita
  #2  
Antiguo 03-08-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Suelen darse estos casos de desesperación .... a mi también me ocurrió.

Casi con toda seguridad tiene que ver con las Transacciones. Probablemente la tabla Detalle depende de una transacción y la tabla maestra de otra diferente. Comprueba al detalle este tema de las transacciones.

... y si no es por ahí, vuelve a comprobar la validez y corrección de las Sentencias SQL para Insert y Update de tu DataSet.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 03-08-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Perdón .... !

Acabo de revisar de nuevo tu código.

En níngún sitio estás haciendo un Post de la tabla Detalle ! .... con lo cual el evento OnBeforePost nunca se va a ejecutar. Ejecuta tu aplicación en modo Debug paso a paso, y comprueba si realmente en algún momento el programa pasa por el evento OnBeforePost que indicas.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #4  
Antiguo 04-08-2011
Luis F. Orjuela Luis F. Orjuela is offline
Miembro
 
Registrado: may 2003
Ubicación: Bogotá - Colombia
Posts: 68
Poder: 21
Luis F. Orjuela Va por buen camino
Hola Gluglu, gracias por responder e interesarte en mi problema..

Bueno en cuanto a lo que tú dices en tu segundo mensaje, te cuento que no realizo el post sobre la tabla detalle porque ésta tiene activada la propiedad "CacheUpdates" y por tanto lo que debo hacer es un "ApplyUpdates" a la tabla detalle.

Nota: todo lo tengo encapsulado en una única transacción...

En espera de tus comentarios.. y gracias ante todo...
__________________
Ing. LUIS FERNANDO ORJUELA
BOGOTA - COLOMBIA
Responder Con Cita
  #5  
Antiguo 04-08-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Luis.

Si estás usando componentes IBX con tablas en relación maestro/deltalle y CachedUpdates activado tenés que desactivar el DataSource de la tabla detalle al aplicar los updates.

Por ejemplo:
Código Delphi [-]
procedure TuForm.btGuardarClick(Sender: TObject);
begin
  if MessageDlg('¿Confirma la operación?', mtConfirmation, [mbYes,mbNo], 0)= mrYes then
  begin
    DMDatos.tbDetalle.DataSource:= nil;       // desconectar 
    DMConect.IBDatabase.ApplyUpdates([tbMaster ,tbDetalle]); // aplicar updates
    DMDatos.tbDetalle.DataSource:= dsDetalle; // conectar
    DMConect.IBTransaction.CommitRetaining;
  end
  else
    DMConect.IBTransaction.RollbackRetaining;    
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 04-08-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por ecfisa Ver Mensaje
Hola Luis.

Si estás usando componentes IBX con tablas en relación maestro/deltalle y CachedUpdates activado tenés que desactivar el DataSource de la tabla detalle al aplicar los updates.

Por ejemplo:
Código Delphi [-]procedure TuForm.btGuardarClick(Sender: TObject); begin if MessageDlg('¿Confirma la operación?', mtConfirmation, [mbYes,mbNo], 0)= mrYes then begin DMDatos.tbDetalle.DataSource:= nil; // desconectar DMConect.IBDatabase.ApplyUpdates([tbMaster ,tbDetalle]); // aplicar updates DMDatos.tbDetalle.DataSource:= dsDetalle; // conectar DMConect.IBTransaction.CommitRetaining; end else DMConect.IBTransaction.RollbackRetaining; end;


Saludos.
Recuerdo haber leído en otras ocasiones esto que comentas. Pregunta: ¿Sólo aplica lo de desconectar/conectar cuando se está utilizando la propiedad CachedUpdates en true y el método ApplyUpdates?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 04-08-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
¿Sólo aplica lo de desconectar/conectar cuando se está utilizando la propiedad CachedUpdates en true y el método ApplyUpdates?
Hola Delphius.

Según tengo entendido así es (al menos con los TIBDataSet). Cuando empecé con Firebird casi me vuelvo loco con ese tema hasta que leí en este artículo la solución.
Tardé en contestarte por que lo estuve buscando ya que lo había borrado. El comentario está al inicio de la página 10 (Master/Detail).

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-08-2011 a las 06:12:12.
Responder Con Cita
  #8  
Antiguo 04-08-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Gracias, leeré al artículo.
Es que como yo utilizo los DBX ya me picaba la cosa y capáz que algo me anda mal, ahora o más tarde, y yo ni enterado.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 04-08-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Si realmente no hay mucha información al respecto y la verdad que un detalle de ese calibre debería estar más documentado.

Recuerdo que yo me enteré despues de renegar un buén rato...

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 04-08-2011
Luis F. Orjuela Luis F. Orjuela is offline
Miembro
 
Registrado: may 2003
Ubicación: Bogotá - Colombia
Posts: 68
Poder: 21
Luis F. Orjuela Va por buen camino
Tema solucionado....

Se debe tener presente que trabajando con componentes IBDataSet en una relación Maestro-Detalle, y existiendo una restricción del tipo "FOREIGN KEY" en la tabla detalle en la base de datos (Firebird); y en la cual se van a ingresar varios registros a la tabla detalle, se debe activar la propiedad:
Código Delphi [-]
CacheUpdates:=True;

tanto en la tabla maestra como en la tabla detalle. Y como comentaron mis amigos anteriormente en este mismo hilo, desactivar el DataSource de la tabla detalle, luego aplicar los cambios y por útlimo volver a activar el DataSource de la tabla detalle. A continuación muestro el código utilizado para aplicar los cambios:

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    With IBD_Departamento do
     begin
      Open;
      Insert;
      FieldByName('COD_DEPARTAMENTO').Value:=cxTextEdit1.Text;
      FieldByName('NOMBRE_DEPARTAMENTO').Value:=cxTextEdit2.Text;
     end;

     IBD_Municipios.DataSource:=nil;
     IBDatabase1.ApplyUpdates([IBD_Departamento,IBD_Municipios]);   //En este orden: Tabla Maestra,Tabla Detalle
     IBD_Municipios.DataSource:=DS_Departamentos;

     IBTransaction1.CommitRetaining;
end;

Y es verdad, falta documentación al respecto.

Agradezco inmensamente la colaboración de Ecfisa quien a la final tenía la solución y con base en el artículo que él hace referencia.

Saludos a todos desde BOGOTA - COLOMBIA
Sede del Campeonato Mundial SUB 2O de Football
__________________
Ing. LUIS FERNANDO ORJUELA
BOGOTA - COLOMBIA
Responder Con Cita
  #11  
Antiguo 24-07-2013
Avatar de Cañones
Cañones Cañones is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Paz Entre Ríos
Posts: 354
Poder: 18
Cañones Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje

Según tengo entendido así es (al menos con los TIBDataSet). Cuando empecé con Firebird casi me vuelvo loco con ese tema hasta que leí en este artículo la solución.
Tardé en contestarte por que lo estuve buscando ya que lo había borrado. El comentario está al inicio de la página 10 (Master/Detail).

Un saludo.
Gracias por el dato.
A quién pertenece el documento?
Saludos.
Responder Con Cita
  #12  
Antiguo 24-07-2013
Avatar de Cañones
Cañones Cañones is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Paz Entre Ríos
Posts: 354
Poder: 18
Cañones Va por buen camino
Mil gracias a todos por el aporte.
Los dolores de cabeza que tuve trabajando con ibdataset maestro - detalle.
Saludos.
Responder Con Cita
  #13  
Antiguo 24-07-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Cañones Ver Mensaje
Gracias por el dato.
A quién pertenece el documento?
Saludos.
Hola Cañones.

El artículo se encuentra en los buscadores como un enlace a la descarga, sin datos adicionales. Pero según dice en las propiedades del propio archivo PDF, es autoría de Ernesto Cullen.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #14  
Antiguo 24-07-2013
Avatar de Cañones
Cañones Cañones is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Paz Entre Ríos
Posts: 354
Poder: 18
Cañones Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola Cañones.

El artículo se encuentra en los buscadores como un enlace a la descarga, sin datos adicionales. Pero según dice en las propiedades del propio archivo PDF, es autoría de Ernesto Cullen.

Saludos.
Haaa mirá, fué mi profesor en la UTN de Paraná. Tengo un documento escrito por el detallando todo IBX pero no explica el maestro detalle con IBdataset.
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
tmemdataset insertar registros maestro/detalle anubis Lazarus, FreePascal, Kylix, etc. 5 10-03-2011 16:39:24
Duplica Registros Maestro Detalle Moparova Conexión con bases de datos 1 30-05-2007 12:01:33
Inserta Registros maestro/detalle Vlady Firebird e Interbase 2 28-10-2006 05:35:48
InserciÓn De Registro Con Maestro-detalle perillan Conexión con bases de datos 5 23-10-2005 12:15:23
Insercion maestro/detalle para aplicacion cliente servidor mgaray Conexión con bases de datos 5 17-11-2003 18:20:46


La franja horaria es GMT +2. Ahora son las 16:39:58.


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