Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-09-2008
vivamotos vivamotos is offline
Miembro
 
Registrado: ago 2006
Posts: 150
Poder: 18
vivamotos Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 02-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 02-09-2008
vivamotos vivamotos is offline
Miembro
 
Registrado: ago 2006
Posts: 150
Poder: 18
vivamotos Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 02-09-2008
vivamotos vivamotos is offline
Miembro
 
Registrado: ago 2006
Posts: 150
Poder: 18
vivamotos Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 02-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
...
Responder Con Cita
  #6  
Antiguo 02-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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

Última edición por duilioisola fecha: 02-09-2008 a las 20:42:15.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
seleccionar y modificar fila por fila enMYSQL schaka SQL 14 20-03-2008 07:06:23
fila mas repetida raulmm26 Varios 2 17-03-2007 20:36:52
Forzar a un dbgrid a no crear una nueva fila toorbye Conexión con bases de datos 2 10-10-2005 19:34:35
Nro de fila en TDBGrid lucasarts_18 Varios 16 11-06-2005 17:26:17
Fila del DbGrid Rabata Varios 3 08-11-2004 23:18:13


La franja horaria es GMT +2. Ahora son las 14:12:10.


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