Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ayuda con autoincrmentales - SQL Manager Lite 2008 / firebird (https://www.clubdelphi.com/foros/showthread.php?t=54169)

Forest 11-03-2008 01:03:46

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

BlueSteel 11-03-2008 01:43:54

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:p:D

BlueSteel 11-03-2008 01:45:31

Cita:

Empezado por Forest (Mensaje 272190)
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 11-03-2008 01:50:05

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...


La franja horaria es GMT +2. Ahora son las 23:29:12.

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