FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
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 |
#3
|
||||
|
||||
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#4
|
|||
|
|||
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; Código:
AS BEGIN IF (NEW.NUMERO IS NULL) THEN NEW.NUMERO = GEN_ID(GEN2,1); END
Saludos. ___________________ Noé Alejandro Castro Última edición por nax fecha: 07-04-2004 a las 21:47:09. |
#5
|
||||
|
||||
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
|
|