PDA

Ver la Versión Completa : Insertar Nuevo Registro


perillan
17-04-2005, 17:53:29
Tengo dos tablas (Maestro y detalle) en Interbase.

Cuando intento insertar un registro en la detalle completados los datos del primer registro al darle para que pase al segundo registro me sale el siguiente error y se me
bloquea el programa.

VIOLATION OF FOREINKEY CONSTRAINT "INTEG9" ON TABLE "TABLE"


Las tablas están unidas por dos IBDataSet y la relación entre ellas parece que funciona
bienn ya que en una búsqueda relaciona perfectamente las dos tablas.
Dichas tablas tienen un campo calculado cada una, pero en el primer registro cuando se meten los datos los pone bien.
Un saludo. Agustin

marcoszorrilla
17-04-2005, 19:42:36
Pues el error que te da, quiere decir que el registro que estás dando de alta en la tabla detalle no casa con el de la tabla maestro, es decir el campo que tienen en comun no es igual, es decir la ForeignKey.

Coloca 2 rejillas para visualizar a la vez maestro y detalle y así verás porque no casan.

Un Saludo.

perillan
19-04-2005, 21:38:49
Marcos:

He colocado otra rejilla y no veo ninguan anomalia. De todas las maneras soy nuevo con Interbase y lo mismo tengo algun problema en su diseño.
Te comento: Esta es una parte de la estructura de las bases de datos que me gustaria que le hechases un vistazo.
Tabla Padre
CREATE TABLE ARTICULOS(
CLAVE VARCHAR(5)NOT NULL,
ARTICLAVE INTEGER NOT NULL,
NOMBRE VARCHAR(70)NOT NULL,
NCODIGO VARCHAR(15),
NNOC VARCHAR(15),
NMATRICULA VARCHAR(17),
CONTROLZ VARCHAR(10),
FECHAALTA DATE,

PRIMARY KEY(ARTICLAVE))


Tabla hijo.
CREATE TABLE IMPLEMENTOS(
IMPLECLAVE INTEGER NOT NULL,
ARTICLAVE INTEGER NOT NULL,
NOMBRE VARCHAR(70)NOT NULL,
NCODIGO VARCHAR(15),
NNOC VARCHAR(15),
NMATRICULA VARCHAR(17),
CONTROLZ VARCHAR(10),
FECHAALTA DATE,
NSERIE VARCHAR(70),
NSERIE1 VARCHAR(70),
NSERIE2 VARCHAR(70),

PRIMARY KEY(IMPLECLAVE),
FOREIGN KEY(ARTICLAVE)REFERENCES ARTICULOS(ARTICLAVE))


Triggerr:
////////
CREATE GENERATOR G_ARTICULOS
//////////
CREATE TRIGGER NEWTRIGGER FOR ARTICULOS
BEFORE INSERT
AS
BEGIN
NEW.ARTICLAVE=GEN_ID(G_ARTICULOS,1);
END

///////////////
CREATE GENERATOR G_IMPLEMENTOS
/////////////
CREATE TRIGGER NEWTRIGGER FOR IMPLEMENTOS
BEFORE INSERT
AS
BEGIN
NEW.IMPLECLAVE=GEN_ID(G_IMPLEMENTOS,1);
END

Como en la rejilla no le veo ningun ploblema, he intentado hacer de nuevo las bases de datos que ves, y lo curioso es que si creo primero el Triggerr de la base articulos despues no medeja crear el de implementos, pero si primero creo el de implementos no me deja crear el de articulos.
Un saludo y muchas gracias
Agustin.

perillan
24-04-2005, 14:30:23
Al final despues de dedicarle mucho tiempo y hacer de nuevo las bases de datos me he dado cuenta de que los trigeer creados con IB_SQL no funcionaban y quitandoselos y activandolos con las IBDataSet deja pasar de una linea a otra en la rejilla. La llave foránea sobre la que se hace el enlace de integridad entre las dos tablas creada con IB_sql la quite.

Pero sigo teniendo un problema:
El la rejilla de la tabla hija, cuando paso linea al siguiente registro del segundo al tercero, me cambia los valores que he metido por los del primer registro, pero despues si miro la base de datos la transacion la ha hecho correstamente metiendo los valores correctos, no los cambiados en la rejilla al cambiar el registro.
Alquien tiene alguna sugerencia ?.
Un saludo.