Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-04-2004
nax nax is offline
Miembro
 
Registrado: mar 2004
Posts: 52
Poder: 21
nax Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 07-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 07-04-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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).
Responder Con Cita
  #4  
Antiguo 07-04-2004
nax nax is offline
Miembro
 
Registrado: mar 2004
Posts: 52
Poder: 21
nax Va por buen camino
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

Última edición por nax fecha: 07-04-2004 a las 21:47:09.
Responder Con Cita
  #5  
Antiguo 07-04-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:44:19.


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
Copyright 1996-2007 Club Delphi