PDA

Ver la Versión Completa : Sobre Generators


nax
07-04-2004, 20:30:41
Tengo una BD en Firebird hecha con IBExpert. En una tabla creé dos registros, la clave primaria como Autoincremental (Generator) y un valor tipo numérico para almacenar datos. En un formulacio de C++ Builder, únicamente enlacé el valor tipo numérico a una DBEdit, y cada vez que trato de insertar un nuevo registro me manda el error:
SQL Error: violation of PRIMARY or UNIQUE KEY constraint "PK_TABLAX" on table "TABLAY". Error Code -803. Invalid insert or update value(s): objecto columns are constrained - no 2 table rows can have duplicate column values The SQL: INSERT INTO TABLAX (CLAVE, VALOR) VALUES (?,?);

El error supongo está en mi llave primaria, pues si la quito y dejo únicamente el otro campo todo marcha bien. ¿Alguna idea de dónde podría estar mi error? ¿En c++ builder? ¿En la definición de mi campo llave? De antemano gracias.

__cadetill
07-04-2004, 20:54:30
El problema está en que no asignas ningún valor a tu clave primaria, de ahí que, al ingresar un segundo registro te de el error de clave duplicada.

Tienes varias opciones, o asignas el valor (llamando al generador) desde C++ o bien, mediante un trigger en la propia base de datos llamas al generador

guillotmarc
07-04-2004, 21:02:47
Para complementar lo que dice Cadetill. El IB-Expert te puede ayudar a generar el Trigger para asignar valor a la clave primaria, o a crear un procedimiento almacenado que es el que debes llamar desde C++ Builder para asignar allí el valor de clave primaria.

El procedimiento almacenado y el trigger, se pueden crear en la misma pantalla en la que se crea el generador (al definir autoincremental el campo), en las pestañas adicionales.

Saludos.

nax
07-04-2004, 21:43:44
Gracias por responder. Ya creé un trigger desde IB-Expert, previa creación de un generador:
CREATE GENERATOR GEN2;
SET GENERATOR GEN2 TO 0;

Y así mi trigger:
AS
BEGIN
IF (NEW.NUMERO IS NULL) THEN
NEW.NUMERO = GEN_ID(GEN2,1);
END

Ahora quiero hacer pruebas a ver si todo quedó ya bien. ¿Cómo realizo la inserción desde SQL? He intentado desde el SQL Editor escribiendo:

INSERT INTO TABLAX VALUES (13);
INSERT INTO TABLAX (NUMERO, VALOR) VALUES (13);
Pero manda error. Si escribo...

INSERT INTO TABLAX (NUMERO, VALOR) VALUES (1,13);
... Lo hace bien, pero no veo que incremente la clave. Y si vuelvo a ejecutar la misma sentencia otra vez (INSERT INTO TABLAX (NUMERO, VALOR) VALUES (1,13);) me indica que no puede haber claves repetidas. Disculparán mi falta de experiencia, pero quiero asegurarme que mi trigger está bien y funciona, pero no sé cómo realizar mi sentencia para constatarlo.

Saludos.

___________________
Noé Alejandro Castro

guillotmarc
07-04-2004, 21:53:52
Hola.

No intentes asignar el valor de NUMERO, lo hará el Trigger.

Prueba con la sentencia :

INSERT INTO TABLAX (VALOR) VALUES (13);

Verás que la puedes ejecutar tantas veces como desees, y que siempre asigna automaticamente el siguiente valor en NUMERO.

Saludos.