Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Asignar ID despues de insert (https://www.clubdelphi.com/foros/showthread.php?t=57003)

vicacos 03-06-2008 15:36:49

Asignar ID despues de insert
 
trabajo en un proyecto con delphi 7, FIBplus y Firebird 2.0 quiero agregar un numero correlativo a un campo de una tabla x (por ejemplo campo ID) de tipo smallint pero que este se agregue en el momento de confirmar el ingreso es decir no en el Inser mismo (No con un trigger before o after Insert) sino por ejemplo en el evento before post del dataset. Esto con la finalidad de no dejar huecos en la tabla y que siempre tenga numeros consecutivos 1,2,3,4...etc. Gracias por la ayuda que me puedan dar:D

Wiarbumu 03-06-2008 17:42:47

Consejo
 
Te aconsejo que agregues a tu tabla un campo con restricción UNIQUE para asignar el numero sin huecos( independiente de la clave principal), por ejemplo supangamos que tenemos una tabla de nombre "PEDIDOS", a la cual agregamos un campo de nombre "Numero" en el que vamos a guardar el numero de pedido sin huecos; para agregar el número de pedido sin huecos debemos crear una tabla que llamaremos "CONTADORES" con un unico campo de nombre "IDUltimo" en el que insertaremos un primer registro, luego crearemos un trigger que asigne el número mas o menos así:




Código SQL [-]
create table CONTADORES (
IDUltimo INTEGER NOT NULL
);

insert into CONTADORES values(1);

create trigger BIPEDIDOS for PEDIDOS
active before insert position 0 as
begin
update CONTADORES
set IDUltimo = IDUltimo + 1;
select IDUltimo - 1
from CONTADORES
into new.Numero;
end!

Wiarbumu 03-06-2008 18:09:59

otra forma
 
Si no quieres utilizar triggers, otra forma menos ortodoxa es crear un procedimiento almacenado que te devuelva el valor máximo del campo en cuestión , luego creas una función en la que al valor devuelto por el procedimiento le sumas 1, así pues, puedes asignar el valor de la función en el evento que mas te plazca a dicho campo, y te quedaría sin huecos.

Saludos

vicacos 04-06-2008 14:07:26

Solucion
 
Gracias por el comentario pero eso, no funciona para esta situacion: 2 usuarios A y B hacen una peticion a la misma tabla en ese orden primero A y despues B, luego el usuario B confirma pero el usuario A cancela. Con ese metodo se genereria un salto en la data es decir 1,2,3,....5,. La isea es que el numero se genere en el ultimo momento despues de haber confirmado la transacción. Bueno para el ejemplo genere 1 tabla, un Generador y coloque 4 componentes en la form; database, transaction, query, datasource para conexion con los componentes visuales.
CREATE TABLE EJEMPLO (
ID SMALLINT,
NOMBRE VARCHAR(25) NOT NULL,
PESO NUMERIC(6,2),
FOTO BLOB SUB TYPE SEGMENT SIZE 80
);

CREATE GENERATOR MAESTRO;
SET GENERATOR MAESTRO TO 0;

En el evento afterpost del dataset coloque
procedure Tform1.miDatasetAfterPost(Dataset: Tdataset);
If not midataset.FielByName('ID').Asboolean then begin
QueryId.Sql.clear;
QueryId.Sql.Add('UPDATE TABLA SET ID = GEN_ID(MAESTRO,1) '+);
QueryId.Sql.Add('WHERE ID IS NULL');
QueryId.ExecQuery;
end;
MidataSet.Transaction.CommitRetaining;
end;

Puede existir una mejor forma pero esta funciono para mi
Saludos
Gracias a todos ;)


La franja horaria es GMT +2. Ahora son las 06:19:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi