Problema con PK nula en Delphi-Firebird

gastonfurini
19 de Junio del 2005
Que tal? paso a explicar el problema.
Utilizando Firebird 1.5 creo una tabla, un generador y un disparador (trigger) de esta manera utilizando IB Expert (Base de datos en Dialecto 3).

/******************************************************************************/
/**** Generated by IBExpert 18/06/2005 08:05:02 p.m. ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES NONE;



/******************************************************************************/
/**** Tables ****/
/******************************************************************************/


CREATE GENERATOR GEN_PERSONAS;

CREATE TABLE TBLPERSONAS (
PK_PERSONA INTEGER NOT NULL,
DNI INTEGER,
NOMBRE VARCHAR(32) NOT NULL,
SEGUNDO_NOMBRE VARCHAR(32),
APELLIDOS VARCHAR(64),
FNAC DATE,
EDAD INTEGER,
PK_SIGNO INTEGER,
SEXO VARCHAR(3) NOT NULL,
PK_ESTADO_CIVIL INTEGER,
OCUPACION VARCHAR(128),
ALTURA NUMERIC(5,2),
PESO NUMERIC(5,2),
MED_PECHO INTEGER,
MED_CINTURA INTEGER,
MED_CADERA INTEGER,
PK_SIGNO_CHINO INTEGER
);




/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/

ALTER TABLE TBLPERSONAS ADD PRIMARY KEY (PK_PERSONA);


/******************************************************************************/
/**** Foreign Keys ****/
/******************************************************************************/

ALTER TABLE TBLPERSONAS ADD FOREIGN KEY (PK_SIGNO) REFERENCES TBLSIGNOS (PK_SIGNO) ON DELETE CASCADE ON UPDATE SET NULL;
ALTER TABLE TBLPERSONAS ADD FOREIGN KEY (PK_ESTADO_CIVIL) REFERENCES TBLESTADO_CIVIL (PK_ESTADO_CIVIL) ON DELETE CASCADE ON UPDATE SET NULL;
ALTER TABLE TBLPERSONAS ADD FOREIGN KEY (PK_SIGNO_CHINO) REFERENCES TBLSIGNOSCHINO (PK_SIGNO) ON DELETE CASCADE ON UPDATE SET NULL;


/******************************************************************************/
/**** Triggers ****/
/******************************************************************************/


SET TERM ^ ;


/******************************************************************************/
/**** Triggers for tables ****/
/******************************************************************************/



/* Trigger: SET_PK */
CREATE TRIGGER SET_PK FOR TBLPERSONAS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
new.pk_persona = gen_id(gen_personas,1);
end
^


SET TERM ; ^



/******************************************************************************/
/**** Privileges ****/
/******************************************************************************/

Bien hasta aqui todo funciona de diez, incluso cuando ingreso una nueva tupla a esta tabla mediante la siguiente orden, se genera la tupla correctamente.

INSERT INTO TBLPERSONAS ( NOMBRE, SEXO )
VALUES ( 'Juan P茅rez', 'HOM');

Todo esto es realizado en al administrador de la base de datos, hasta aqui todo funciona como debe ser.

Pasemos a Delphi 7.
Este es el evento del boton "Aplicar", el cual hace efectivo una inserci贸n o una modificaci贸n dependiendo del estado del objeto clientdataset (CDS).

procedure TfrmABMPersona.btnAplicarClick(Sender: TObject);
begin
try
dtmMain.cdstblPersonas.Post;
dtmMain.cdstblPersonas.ApplyUpdates(-1);
dtmMain.ReOpen(dtmMain.cdstblPersonas);
btnEliminar.Enabled := not dtmMain.cdstblPersonas.IsEmpty;
except
dtmMain.cdstblPersonas.Cancel;
ShowMessage('Error de escritura');
end;
end;

Reopen es un procedimiento que abre y cierra el CDS, para actualizar los cambios.

Pero el error ocurre en la linea del POST. Ocurriendo una excepcion que dice lo siguiente: "Field 'PK_PERSONA' must have a value".
Lo cual est谩 bien ya que es clave primaria, pero viendo que se ha declarado un Trigger que captura la inserci贸n y si el PK es NULL le genera un valor adecuado, en donde est谩 el error??
Seg煤n mi l贸gica deber铆a estar en las propiedades del componente CDS, pero no se como resolverlo, si me pueden ayudar estar茅 eternamente agradecido.
Adios y gracias de nuevo por leer tan larga explicaci贸n.