Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-10-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Unhappy Campo autoincrementable en firebird

Hola amigos del foro,fijense que tengo una duda al insertar datos a la BD.Tengo un campo que se llama eval_clave, es de tipo numerico y tiene valor autoincrementable.Al momento de insertarlo en la BD, si me incrementa el valor, hasta alli muy bien, pero al momento de borrar todos los registros de ese campo me sigue aumentando el valor desde el ultimo valor que tenia.Por ejemplo, si elimino todos los registros y el ultimo valor que tenia en eval_clave era 3, y despues cuando inserto otro registro en la BD,el valor de eval_clave aumenta a 4 en vez de que me vuelva a generar 0.Alguien sabe como modificarlo para que al momento de insertar un registro empiece desde 0?Saludos
Responder Con Cita
  #2  
Antiguo 29-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Código SQL [-]
SET GENERATOR NOMBRE_GENERADOR_GEN TO 0;

Creo que es así,

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #3  
Antiguo 29-10-2008
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
De todas formas, estos "generadores automáticos" no están pensado para eso, sino para ofrecer siempre un valor DISTINTO en un campo clave, para que no se repita.
Si lo modificas a mano, has perdido su "potencial" y ya lo mismo te da poner cualquier número
Responder Con Cita
  #4  
Antiguo 29-10-2008
Avatar de Ana María
Ana María Ana María is offline
Miembro
 
Registrado: ago 2008
Posts: 40
Poder: 0
Ana María Va por buen camino
Si de pronto lo que necesitas es un identificador sin saltos (por ejemplo números de factura) lo mas práctico es crear un campo (UNIQUE) que se actualice mediante un trigger desde una tabla que haga de contador, mas o menos así (actualizaremos el campo Numero (UNIQUE) en la tabla Facturas:
Código SQL [-]
create table CONTADORES (
 IDUltimo        Integer NOT NULL);

insert into CONTADORES values(1);

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

Todo esto se puede hacer manteniendo el campo auntoincremental como clave principal y el generador para obtener el número.

Gracias
Responder Con Cita
  #5  
Antiguo 29-10-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Gracias Ana Maria por tu pronta respuesta. Solo que no se en que opcion de firebird hacerlo,uso el sql manager 2008 for interbase and firebird.De hecho es la primera vez que lo uso.Tu me podrias decir donde colocar el codigo que me sugeriste?
Responder Con Cita
  #6  
Antiguo 29-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por Elite237 Ver Mensaje
Gracias Ana Maria por tu pronta respuesta. Solo que no se en que opcion de firebird hacerlo,uso el sql manager 2008 for interbase and firebird.De hecho es la primera vez que lo uso.Tu me podrias decir donde colocar el codigo que me sugeriste?
Hola,

http://img146.imageshack.us/img146/8581/emsoy2.jpg

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #7  
Antiguo 29-10-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
yo creo que lo que tu necesitas es averiguar el ultimo valor de la clave y sumarle uno:

Código SQL [-]
Select Max(Clave) + 1 from tabla
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #8  
Antiguo 29-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por Elite237 Ver Mensaje
...Por ejemplo, si elimino todos los registros y el ultimo valor que tenia en eval_clave era 3, y despues cuando inserto otro registro en la BD,el valor de eval_clave aumenta a 4 en vez de que me vuelva a generar 0.Alguien sabe como modificarlo para que al momento de insertar un registro empiece desde 0?
Cita:
Empezado por eduarcol Ver Mensaje
yo creo que lo que tu necesitas es averiguar el ultimo valor de la clave y sumarle uno:

Código SQL [-]Select Max(Clave) + 1 from tabla
Ahora estoy más confundido , Saludos compadre
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #9  
Antiguo 29-10-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Cita:
Empezado por enecumene Ver Mensaje
Ahora estoy más confundido , Saludos compadre
segun logro entender lo que necesita el amigo es saber cual es el ultimo numero utilizado y sumarle uno, si no hay registro lo deja en uno
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #10  
Antiguo 29-10-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Lo que necesito es que cuando borre todos los registros, empiece de nuevo en 0...y no que empiece en el ultimo valor que le seguia..osea si tenia 5 registros y los borro todos, al momento de volver a insertar en la BD empieza en 6..7...8..9...y eso yo no quiero.
Responder Con Cita
  #11  
Antiguo 29-10-2008
Avatar de Ana María
Ana María Ana María is offline
Miembro
 
Registrado: ago 2008
Posts: 40
Poder: 0
Ana María Va por buen camino
Siendo así, la solución que te da Eduarcol es perfecta.
Responder Con Cita
  #12  
Antiguo 29-10-2008
Avatar de Ana María
Ana María Ana María is offline
Miembro
 
Registrado: ago 2008
Posts: 40
Poder: 0
Ana María Va por buen camino
Trigger

Si lo quieres hacer con trigger te quedaría mas o menos así:

Código SQL [-]
create trigger BICLAVES for CLAVES
    active before insert position 0 as
begin
Select Max(Clave) + 1 from Claves
    into   new.Clave;
end!
Responder Con Cita
  #13  
Antiguo 29-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
yo creo que ni eduarcol ni Ana María están entendiendo lo que necesita el amigo aquí, según entiendo (si no es así por favor corrígenme) es si el desea reiniciar la base desde 0 registros borrando todo los datos (vamos a decir a través de una sentencia delete from) es lógico que el generador no empieza desde el 0, si no que quedará el último valor usado, ejemplo, si tengo una tabla de nombres y hay 100 registros, sabemos que el último es no. 100 ¿no?, entonces si el borra los 100 registros el generador todavía sigue en el número 100 y no desde 0 y eso es lo que creo que el amigo aquí es lo que busca hacer, la solución tuya eduardo no empieza desde 0 sino 100 + 1 y el quiere 0 + 1, amigo Elite237 por favor corrígeme si no es así.

Saludos.

PD. Por favor no me maten
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #14  
Antiguo 30-10-2008
Avatar de Ana María
Ana María Ana María is offline
Miembro
 
Registrado: ago 2008
Posts: 40
Poder: 0
Ana María Va por buen camino
Tienes razón

Tienes razón Enecuneme.

Ante tanta cosa yo haría esto:

No asignar el valor de la clave en cuestión por medio de un generador si no por medio de una una función desde la aplicación, esta función usaría un query (dependiendo de con que te conectas) aquí un ejemplo con TADOQuery:

Código Delphi [-]
function  ID(Tabla: string; Campo: string): Integer;
begin
with Query  do
  try
    Close;
    SQL.Clear ;
    SQL.Add('Select max('+ Campo +')as Nuevo from '+ Tabla);
    Open ;
    if IsEmpty  then
      Result := 1
     else
      Result := FieldByName('Nuevo').AsInteger + 1;
   finally
    Close ;
    end;
end;

// Llamamos la función en BeforePost

procedure TablaBeforePost(DataSet: TDataSet);
begin
Tabla.FielByname('Clave').Value := ID('Tabla','Clave');
end;
Responder Con Cita
  #15  
Antiguo 30-10-2008
Avatar de boreg
boreg boreg is offline
Miembro
 
Registrado: oct 2007
Ubicación: México, México
Posts: 76
Poder: 17
boreg Va por buen camino
Saludos, en mi opinión la utilización de generadores es lo mejor para campos "autoincremento" por lo tanto la solución que aporta enecumene es la correcta(repito, en mi opinión), quizas solo para no ajustar "manualmente" el generador a cero con un trigger así se podría hacer:

Código SQL [-]
CREATE OR ALTER TRIGGER PRUEBA_AD0 FOR PRUEBA
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FILAS INTEGER;
begin
  select count(*) from PRUEBA into :FILAS;
  if (filas = 0) then
    execute statement 'SET GENERATOR G_PRUEBA to 0';
end

si después de la eliminacion de registros la tabla esta vacía, el generador se queda con valor cero.
El problema para este metodo sería que se eliminen los registros y posteriormente se haga un rollback ya que aún así el generador estará con valor cero y la siguiente insercion de registros duplicará el campo eval_clave.

Saludos
Responder Con Cita
  #16  
Antiguo 30-10-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Cita:
Empezado por enecumene Ver Mensaje
yo creo que ni eduarcol ni Ana María están entendiendo lo que necesita el amigo aquí, según entiendo (si no es así por favor corrígenme) es si el desea reiniciar la base desde 0 registros borrando todo los datos (vamos a decir a través de una sentencia delete from) es lógico que el generador no empieza desde el 0, si no que quedará el último valor usado, ejemplo, si tengo una tabla de nombres y hay 100 registros, sabemos que el último es no. 100 ¿no?, entonces si el borra los 100 registros el generador todavía sigue en el número 100 y no desde 0 y eso es lo que creo que el amigo aquí es lo que busca hacer, la solución tuya eduardo no empieza desde 0 sino 100 + 1 y el quiere 0 + 1, amigo Elite237 por favor corrígeme si no es así.

Saludos.

PD. Por favor no me maten
Excelente...lo que dice ecueneme es exactamente lo que quiero hacer...yo borro con una sentencia delete..y el generador sigue en el numero 15 y no desde cero..Gracias
Responder Con Cita
  #17  
Antiguo 31-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por Elite237 Ver Mensaje
Excelente...lo que dice ecueneme es exactamente lo que quiero hacer...yo borro con una sentencia delete..y el generador sigue en el numero 15 y no desde cero..Gracias
¿Probaste la sugerencia de boreg?, es un buen código que te soluciona tu problema.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #18  
Antiguo 31-10-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Question

Código SQL [-]
CREATE OR ALTER TRIGGER PRUEBA_AD0 FOR PRUEBA
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FILAS INTEGER;
begin
  select count(*) from PRUEBA into :FILAS;
  if (filas = 0) then
    execute statement 'SET GENERATOR G_PRUEBA to 0';
end
Una pregunta, como es la sintaxis de ese trigger?osea que significa?
Código SQL [-]
CREATE OR ALTER TABLE TRIGGER (aqui es un nombre que le daremos al trigger?) FOR (aqui el nombre de la tabla?)



SET GENERATOR (aqui que es el nombre del campo autoincrementable?) TO 0
Saludos
Responder Con Cita
  #19  
Antiguo 31-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Si, pleno, lo has acertado todo.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #20  
Antiguo 31-10-2008
Avatar de boreg
boreg boreg is offline
Miembro
 
Registrado: oct 2007
Ubicación: México, México
Posts: 76
Poder: 17
boreg Va por buen camino
Cita:
Empezado por Elite237 Ver Mensaje
Una pregunta, como es la sintaxis de ese trigger?osea que significa?

Código SQL [-]
CREATE OR ALTER TABLE TRIGGER (aqui es un nombre que le daremos al trigger?) FOR (aqui el nombre de la tabla?)
 
SET GENERATOR (aqui que es el nombre del campo autoincrementable?) TO 0



Saludos
Algo así, solo una aclaración


Código SQL [-]
SET GENERATOR (aquí es el nombre del GENERADOR) to 0
Saludos
Responder Con Cita
Respuesta



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
Campo Autoincrementable al máximo casacham Conexión con bases de datos 1 08-09-2007 23:41:11
Campo autoincrementable en sql server 2000? dariana20 SQL 2 25-05-2006 19:07:05
Campo autoincrementable jonny0157 C++ Builder 1 11-08-2005 08:36:50
¿Como recuperar un valor de un campo autoincrementable? SyncMaster Firebird e Interbase 3 11-05-2004 08:08:04
como crear un campo autoincrementable acrophet Firebird e Interbase 2 14-10-2003 14:08:04


La franja horaria es GMT +2. Ahora son las 17:18:14.


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