Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Sobre Generators (https://www.clubdelphi.com/foros/showthread.php?t=8972)

nax 07-04-2004 20:30:41

Sobre Generators
 
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:
Código:

CREATE GENERATOR GEN2;
SET GENERATOR GEN2 TO 0;

Y así mi trigger:
Código:

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.


La franja horaria es GMT +2. Ahora son las 23:37:20.

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