Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-03-2008
Forest Forest is offline
Miembro
 
Registrado: may 2007
Posts: 30
Poder: 0
Forest Va por buen camino
Ayuda con autoincrmentales - SQL Manager Lite 2008 / firebird

Hola, bueno me sucede que tengo mi base de datos creada en Firebird con el SQL Manager Lite 2008 y tengo algunas tablas en las que el campo de la llave principal es un autoincremental, hasta ahí todo bien... o eso creo o.o...

Estoy usando esa base de datos desde Turbo Delphi. La base de datos ya está conectada y ya he guardado algunos registros de prueba sin problemas. El problema está cuando he querido guardar en las tablas con campos autoincrementales, ya que al intentar guardar un nuevo registro me pide que un valor al campo autonumérico, lo que según yo no debería pasar pues se supone que para eso es el autoincremental, para que no tenga yo que especificar el valor manualmente.

Si sirve de algo el código sería algo como:

Código Delphi [-]
DataModule.tabla.insert;
DataModule.tablaDescripcion.value:= wnombre.text;
DataModule.tablaPrecio.value:= strToFloat(wprecio.text);
DataModule.tabla.post;


En teoría el campo "Counter" es decir tablaCounter no debería de especificarlo, pues al ser autoincremental el valor debería generarse automático, pero no lo hace, tengo que agregarlo manualmente, bueno, desde el mismo código pero buscando el ultimo registro y sumándole 1 para así guardar ese valor en el nuevo registro.

Código Delphi [-]
DataModule.tabla.insert;
DataModule.tablaCounter.value:= strToInt(ultimo_registro + 1);
DataModule.tablaDescripcion.value:= wnombre.text;
DataModule.tablaPrecio.value:= strToFloat(wprecio.text);
DataModule.tabla.post;


Y la verdad si no me va a servir de nada tenerlo en autoincremental mejor lo dejaría como un entero normal, pues eso me daría más flexibilidad para manipular los valores de este campo.

Espero me puedan explicar a que se debe que el valor no se esté generando... o no se... si no me expliqué digánme para intentar explicarlo de nuevo.

Yo me imagino que el error pudiera estar en el SQL Manager Lite, en los Triggers o con el Generator para el autoincremental. Pero de eso no se, por eso mismo no los he modificado, es decir, el código SQL que ejecutan es el mismo que el mismo programa generó, que sería este creo:

Código SQL [-]
CREATE TABLE TEMP_VENTA (
  COUNTER INTEGER DEFAULT 0 NOT NULL,
  DESCRIPCION VARCHAR(50) CHARACTER SET WIN1251 COLLATE WIN1251,
  PRECIOUNITARIO NUMERIC(15, 4),
  CANTIDAD SMALLINT,
  PRECIO NUMERIC(15, 4));


ALTER TABLE TEMP_VENTA ADD PRIMARY KEY (COUNTER);


SET TERM ^ ;

CREATE TRIGGER BI_TEMP_VENTA_COUNTER FOR TEMP_VENTA
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.COUNTER IS NULL) THEN
      NEW.COUNTER = GEN_ID(TEMP_VENTA_COUNTER_GEN, 1);
END^

SET TERM ; ^

Espero alguien haya entendido mi problema u.u
Responder Con Cita
  #2  
Antiguo 11-03-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Wink

Hola Forest

Nunca he usado Firebird.. pero he utilizado Interbase (que son muy parecidos )...

Para declarar un Campo Autoincremental en Interbase, tenia que crear el Campo (Obvio)... pero además, tenia que realizar 2 procesos adicionales..

1.- Crear un Generador...

y

2.- Crear un Trigger para que me asigne el generador al Campo autonumerico...

y con eso se soluciono mi problema.. quizas para ti sea el mismo caso...

Salu2 y suerte
__________________
BlueSteel
Responder Con Cita
  #3  
Antiguo 11-03-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Cita:
Empezado por Forest Ver Mensaje
Yo me imagino que el error pudiera estar en el SQL Manager Lite, en los Triggers o con el Generator para el autoincremental. Pero de eso no se, por eso mismo no los he modificado, es decir, el código SQL que ejecutan es el mismo que el mismo programa generó, que sería este creo:


Código SQL [-]
CREATE TABLE TEMP_VENTA (
  COUNTER INTEGER DEFAULT 0 NOT NULL,
  DESCRIPCION VARCHAR(50) CHARACTER SET WIN1251 COLLATE WIN1251,
  PRECIOUNITARIO NUMERIC(15, 4),
  CANTIDAD SMALLINT,
  PRECIO NUMERIC(15, 4));


ALTER TABLE TEMP_VENTA ADD PRIMARY KEY (COUNTER);


SET TERM ^ ;

CREATE TRIGGER BI_TEMP_VENTA_COUNTER FOR TEMP_VENTA
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.COUNTER IS NULL) THEN
      NEW.COUNTER = GEN_ID(TEMP_VENTA_COUNTER_GEN, 1);
END^

SET TERM ; ^
Espero alguien haya entendido mi problema u.u
no veo el codigo para crear el Generador ???
__________________
BlueSteel

Última edición por BlueSteel fecha: 11-03-2008 a las 01:48:34.
Responder Con Cita
  #4  
Antiguo 11-03-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
A continuación te muestro un codigo de una tabla con autoincremental, generador y trigger

Código SQL [-]
/* Tabla: Movimiento */
CREATE TABLE "Movimiento" (
    "Mov_Nro" INTEGER NOT NULL,
    "Per_Nro" VARCHAR (4) CHARACTER SET NONE NOT NULL COLLATE NONE,
    "Mov_Limp" NUMERIC (8, 1),
    "Mov_Ire" NUMERIC (8, 1),
    "Mov_Mov" NUMERIC (8, 1),
    "Mov_Pmed" NUMERIC (8, 1),
    "Mov_Leys" NUMERIC (8, 1),
    "Mov_Ctah2" NUMERIC (8, 1),
    "Mov_Cper" VARCHAR (2) CHARACTER SET NONE COLLATE NONE,
    "Mov_Colac" NUMERIC (8, 1),
    "Mov_Onimp" NUMERIC (8, 1),
    "Mov_Seguro1" NUMERIC (8, 1),
    "Mov_Mes" INTEGER NOT NULL,
    "Mov_Mafp" NUMERIC (8, 1),
    "Mov_Mfam" NUMERIC (8, 1));
 
/* Primary keys definition */
ALTER TABLE "Movimiento" ADD CONSTRAINT "PK_Movimiento" PRIMARY KEY ("Mov_Nro");
SET TERM ^ ;
/* Triggers definition */
 
/* Trigger: MOVIMIENTO_BI */
CREATE TRIGGER MOVIMIENTO_BI FOR "Movimiento" ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
     New."Mov_Nro"=gen_id(g_mov_numero,1);
END
^

SET TERM ; ^


Editado:

mirando el codigo, se visualiza todo igual, salvo el Trigger...?...

Podrias realizar la sgte prueba... ingresar un registro desde tu Programa de Administración de SQL...( yo utilizo EMS... ) si te resulta desde ahí.. tu problema puede ser otro...
__________________
BlueSteel

Última edición por BlueSteel fecha: 11-03-2008 a las 01:53:39.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Cómo conectan Report Manager con Firebird? axelbb Impresión 4 02-12-2010 21:58:56
Roadmap de firebird 2008 jachguate Noticias 2 24-01-2008 09:42:06
por que tengo un error al conectar BD en sql manager lite... uper Firebird e Interbase 0 01-02-2006 19:38:20
ayuda sobre Report Manager fcobanda Impresión 0 25-08-2004 17:35:24
Ayuda Con el Action Manager edgusano Varios 1 26-07-2004 01:12:21


La franja horaria es GMT +2. Ahora son las 15:28:25.


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