Ver Mensaje Individual
  #1  
Antiguo 03-08-2011
Luis F. Orjuela Luis F. Orjuela is offline
Miembro
 
Registrado: may 2003
Ubicación: Bogotá - Colombia
Posts: 68
Reputación: 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