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)
-   -   Crear generador de campo. (https://www.clubdelphi.com/foros/showthread.php?t=44590)

brakaman 10-06-2007 16:15:26

Crear generador de campo.
 
Hola tengo creada una tabla con el IBExpert (personal) y en un campo , el cual tambien es Not Null y primary key, quiero añadirle un generador que incremente automaticamente el campo en 1, el valor del primer registro me lo pregunta, contesto 1., le asigno el generador al campo.

Ah el campo es integer.

Voy a dar de alta un registro pero no me aplica el generador.

¿Donde se define el incremento deseado?

¿No son compatibles el generador con un primary key?

Si en vez de un generador pruebo a asignar un trigger (Before insert) que haga lo mismo o un procedure recibo igualmente error, es obvio que tengo algun dato mal.

Gracias por vuestra ayuda.

pvizcay 10-06-2007 17:55:36

el generador no se asigna a un campo, lo tienes que usar tu en la sentencia insert into o definir un trigger que incremente la secuencia y lo asigne a la PK (el problema de esto es que desde tu aplicación no se conocera la PK para identificar la nueva tupla.. por eso no te lo recomiendo)

brakaman 10-06-2007 22:11:27

Ya, lo que trato es de crear un campo con autoincremento automatico, entonces .... ¿Tengo que declarar un nuevo DOMAIN y como le indico que lo quiero autoincrementado?

¿Funcionaria esto?

Esto de Firebird requiero tiempo .... :D

Saludos.

pvizcay 11-06-2007 02:55:00

no existe ese concepto de otras bases de datos, al menos con la versión 1.5 que es la que uso..

salu2

sitrico 11-06-2007 07:12:06

Si es un campo de autoincremento lo puedes hacer así:

1ro creas un generador (ibExpert)

Código SQL [-]
CREATE GENERATOR GEN_FACTURAS_ID;
SET GENERATOR GEN_FACTURAS_ID TO 0;

2do creas un trigger (before insert)

Código SQL [-]
SET SQL DIALECT 3;

SET NAMES NONE;

CREATE GENERATOR GEN_FACTURAS_ID;

SET TERM ^ ;


CREATE TRIGGER FACTURAS_ID FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
IF (NEW.IDFACTURA IS NULL) THEN
    NEW.IDFACTURA = GEN_ID(GEN_FACTURAS_ID,1); -- aqui pones el generador
end
^


SET TERM ; ^

Y por último cada vez que lances el Insert, manda el campo de autoincremento como null (lo que disparará el trigger)

Código SQL [-]
Insert into AD_FACTURAS 
(IdFactura, fecha, Monto) Values
(Null, :Fecha, :Monto)

De cualquier manera busca en el foro "autoincremento" que hay bastante.

brakaman 11-06-2007 18:56:02

Hola Sitrico.

Pues funciona, pero la verdad creia que existia un campo de este tipo, es un poco darle vueltas para conseguir algo que gestores de Bases de datos de menos "Categoria" te dan hecho. (Paradox, Access), en fin....

Sigo preguntando haber si consigo gente tan amable como tu que vaya contestando. :mad:

Muchisimas gracias.

sitrico 11-06-2007 20:34:42

Al principio pensaba igual que tú, pero creeme, una vez que le agarras la caida al firebird (y yo aun estoy en eso), te darás cuenta que este enfoque no es ningun problema ;) .

rastafarey 13-06-2007 19:48:44

Resp
 
No comparen a dios con un brujo.

Lo del generador te mas libertades de la que podrías imaginarte.

Se escapa del control transaccional. Que a mi parecer te evita muchisimos dolores de cabezas. Cosa que no hace un campo auto ¿Ho si lo hace?.

Bueno como te dijeron en le mensaje anterior una vez lo uses veras las vertidus (Te lo digo yo que lo uso antes de que existiera firebird y lo comense a usar buscando evitar lo famosos bloques muertos de sistemas manejadores de archivos).


La franja horaria es GMT +2. Ahora son las 03:42:32.

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