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 procedure o lo que sea que aumente fila por fila (https://www.clubdelphi.com/foros/showthread.php?t=59607)

vivamotos 02-09-2008 11:53:37

Crear procedure o lo que sea que aumente fila por fila
 
Saludos,

Tengo una tabla con un CAMPO ID que de momento no es llave primaria.
Pero ya tengo datos en la tabla y muchos, quisiera saber si hay algun procedure o algo que haga que ese campo aumentando en +1 su valor al cambiar de fila.

Grácias :)

duilioisola 02-09-2008 13:26:35

Con un trigger y un generador podrías solucionar esto:

Código SQL [-]
create trigger TABLA_BI0 for TABLA active before insert position 0
as
begin
  if ( new.CAMPO_ID = 0 ) then new.entrada = gen_id( contador_id , 1 ) ;
end

También podrías hacer un procedimiento para recalcular el campo ID.

Código SQL [-]
create procedure REORDENAR
as
declare variable clave char(8);
declare variable id integer;
begin
   /* Pongo a 0 el contador */
   contador = 0;
   /* Recorro toda la tabla */
   /* RDB$DB_KEY es un campo que identifica a cada registro */
   FOR select RDB$DB_KEY from TABLA do
         into :clave
   DO
   begin
       update TABLA 
       set CAMPO_ID = :id
       where RDB$DB_KEY=:CLAVE;
   end
end

vivamotos 02-09-2008 17:18:14

No funciona
 
No me funciona el procedure el campo contador no se dónde lo sacas, y si lo pongo de esta forma:

begin
/* Pongo a 0 el contador */
id = 0;
/* Recorro toda la tabla */
/* RDB$DB_KEY es un campo que identifica a cada registro */
FOR select RDB$DB_KEY from USERS_LOG_ENTRADAS
into :clave
DO
begin
update USERS_LOG_ENTRADAS
set ID = :id
where RDB$DB_KEY=:CLAVE;
end
end

Funciona pero dice ROWS AFFECTED 0 :(

vivamotos 02-09-2008 18:00:45

Campo Clave
 
El campo Clave siempre queda con el valor ', sin nada, entonces al debugar no ejecuta el update porque la sentencia no es correcta.

Que puede ser?

P.D. UTILIZO FIREBIRD

duilioisola 02-09-2008 19:35:54

No pude probarlo antes de enviarlo.
Cambié contador por id (es el nombre que queria darle)
Agregue id=id+1, para incrementar el contador.
Código SQL [-]
create procedure REORDENAR
as
declare variable clave char(8);
declare variable id integer;
begin
   /* Pongo a 0 el contador */
   id = 0;
   /* Recorro toda la tabla */
   /* RDB$DB_KEY es un campo que identifica a cada registro */
   FOR select RDB$DB_KEY from TABLA do
         into :clave
   DO
   begin
       /* Incremento el contador */
       id = id + 1;
       /* Modifico el CAMPO_ID con el contador */
       update TABLA 
       set CAMPO_ID = :id
       where RDB$DB_KEY=:CLAVE;
   end
end

Ten en cuenta que si quieres que el contador está ordenado, puedes ordenar el for select ...
Código SQL [-]
...
   /* Recorro toda la tabla */
   /* RDB$DB_KEY es un campo que identifica a cada registro */
   FOR select RDB$DB_KEY from TABLA do
         ORDER BY campos_a_ordenar
         into :clave
   DO
...

duilioisola 02-09-2008 19:39:04

Pon el código SQL entre marcadores [ sql ] y [ / sql ], para que se pueda leer mejor.
RDB$DB_KEY se llenará con cadenas de 8 caracteres (con poco sentido para cualquiera de nosotros). De todos modos es un campo de sistema, que sirve para identificar a cada registro.
Si haces
SELECT RDB$DB_KEY FROM USERS_LOG_ENTRADAS
varas que el resultado será algo así:
0C3F78A3
947CFEBA
...

Escribo a continuación tu procedimiento corregido.
Código SQL [-]
create procedure REORDENAR
as
declare variable clave char(8);
declare variable id integer;
begin
   /* Pongo a 0 el contador */
   id = 0;
   /* Recorro toda la tabla */
   /* RDB$DB_KEY es un campo que identifica a cada registro */
   FOR select RDB$DB_KEY from USERS_LOG_ENTRADAS
         into :clave
  DO
  begin
    id = id + 1;
    update USERS_LOG_ENTRADAS
    set ID = :id
    where RDB$DB_KEY=:CLAVE;
  end
end


La franja horaria es GMT +2. Ahora son las 22:10:20.

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