Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-10-2008
Lizette Lizette is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Lizette Va por buen camino
Exclamation Como genero claves secuenciales

Hola, lo que trato de hacer es generar automaticamente una clave, basado en incrementos, es decir abro mi tabla clientes y con la funcion recordcount, me cuenta cuantos registros tengo, y yo le sumo 1, pero el caso, es que el rango de valores debe de ir de 000001 a 999999.

Si tengo 1 registro seria: 000001
Si tengo 10 registros: 000010
Si tengo 100 registros: 000100
..
..
..

Cómo le puedo hacer para que me de esta secuencia??
Gracias por su colaboracion
Responder Con Cita
  #2  
Antiguo 31-10-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola Lizette,
¿Es necesario que la clave cuente con ese formato? ¿Digo, es un requisito que tenga esos ceros a la izquierda?

Muchos motores de base de datos tienen un tipo autoincremental. Te preguntaba si es necesario ese formato precisamente por esto, si se emplean este tipo obtendrás, 1, 1543, 545, etc. Es decir, sin los ceros.

Necesitamos saber que motor usas para saberte ayudar.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 31-10-2008
Lizette Lizette is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Lizette Va por buen camino
estoy usando MySql con ODBC

El caso, es que esa clave debe de ser de 6 digitos, y no se debe de repetir..
Es por ello el formato que puse, o que otra solucion puedo tomar, para que no se repita y sea de 6 digitos?
Responder Con Cita
  #4  
Antiguo 31-10-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Lizette, si utilizas un campo autoincremental tu clave no se va a repetir, pero no tendra los ceros a izquierda, sino sera 1,2,3,4,5......, como te ha explicado el amigo Marcelo.

Para rellenar ceros a la izquierda, lo puedes hacer así:

Código Delphi [-]
 
var
 Valor : String;
begin
 Valor := '110';
 Showmessage(StringOfChar('0',6-length(Valor))+Valor);
 
 o también con format
 
 Valor := 110; 
 Showmessage(Format('%0.6d',[Valor]));

claro que tu campo tendría que ser de tipo Varchar.

Si utilizas el campo autoincremental, se almacenara como te digo pero para mostrar puedes utilizar la propiedad DisplayFormat de tu campo.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #5  
Antiguo 31-10-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Creo que deberías tener una tabla de contadores.
Por ejemplo una con los campos:
NOMBRE_TABLA string
CONTADOR integer

Al momento de insertar un nuevo registro, lees de la tabla de contadores el contador que corresponda, lo incrementas, le das el formato de 6 digitos y lo utilizas.

La opción de utilizar la cantidad de elementos de la tabla no es muy fiable, por lo siguiente:

Añades 10 elementos.
- Se numeran del 000001 al 000010
Borras un elemento.
- Supongamos el 000005
Añades un elemento nuevo
- La cantidad es 9 elementos. El que añades es el 10mo. El identificador será nuevamente 000010 (duplicado!)
Responder Con Cita
  #6  
Antiguo 31-10-2008
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Es una mala, mala idea tener como campos claves CUALQUIER tipo de codigos.

Un campo clave solo debe ser de 2 tipos, y ya: Un autoincremental o un GUID.

Si necesitas un codigo por razones del usuario o de identificacion mas "humana" esta bien, pero debes analizar si la razon del codigo es una representacion humana o una imitacion innecesaria de una clave interna del sistema.

Si solo se requiere para identificar un registro, un autonumerico es mas que suficiente.
__________________
El malabarista.
Responder Con Cita
  #7  
Antiguo 31-10-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Me parece que la idea de caro es bastante buena y simple, contar con un campo autoincremental y emplear DisplayFormat para visualizarlo con los ceros.

Esto permite facilitar las consultas, se evita el tener que estar analizando dentro de strings (subcadenas) y en ciertas ocasiones unos molestos casts o moldeos de tipos.

Por otro lado, si el motor no soporta este tipo de campo la recomendación es duilioisola es más que recomendable. Combinando esta alternativa con la técnica de DisplayFormat se pueden conseguir buenos resultados.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #8  
Antiguo 31-10-2008
Lizette Lizette is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Lizette Va por buen camino
Es verdad, es muy buena tu respuesta Caro, pero lo que dice duilioisola es muy cierto y no habia pensado en ello (gracias por ese comentario), las claves se pueden repetir, si tengo 10 elementos, el ultimo es 10 y elimino uno, el proximo que me genere sera 10 otra vez..

Caro, tu idea la puedo implementar para completar los 6 digitos, pero utilizando otro medio para generar las claves, no el autoincremento.. Pero qué otra cosa puedo utilizar para que esa clave se genere automaticamente y no se repita?
Responder Con Cita
  #9  
Antiguo 31-10-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Lizette Ver Mensaje
Es verdad, es muy buena tu respuesta Caro, pero lo que dice duilioisola es muy cierto y no habia pensado en ello (gracias por ese comentario), las claves se pueden repetir, si tengo 10 elementos, el ultimo es 10 y elimino uno, el proximo que me genere sera 10 otra vez..
Por ello lo que comenta duilioisola es tener otra tabla que tenga un campo que guarde la próxima clave, ante cada nueva inserción de un registro de tu tabla, se actualiza el valor de este campo en la tabla CONTADORES.

Si eliminas un campo de tu tabla no importa, en CONTADORES seguirá estando el próximo valor.

Cita:
Empezado por Lizette Ver Mensaje
Caro, tu idea la puedo implementar para completar los 6 digitos, pero utilizando otro medio para generar las claves, no el autoincremento.. Pero qué otra cosa puedo utilizar para que esa clave se genere automaticamente y no se repita?
Entonces sería muy oportuno que nos describas el proceso que empleas para conseguir tus claves.

Por otro lado, ¿MySQL no tiene un tipo autoincremental? Desconozco MySQL. El empleo de un campo de este tipo no se vé afectado por el borrado, continuará generando el siguiente que le corresponde.

Cita:
Empezado por Lizette Ver Mensaje
Pero qué otra cosa puedo utilizar para que esa clave se genere automaticamente y no se repita?
Repito, una opción es tener esa tabla que comentó duilioisola. Pero claro, en vista de que dices que empleas un método para generar la clave, no sabríamos decirte si es viable lo que te comentamos.

Disculpame que lo diga pero me parece que te estás ahogando en un vaso de agua. O hay algo que se nos escapa o se te escapa a ti.
Si nos aportaras más detalles de tu situación te podríamos aportar alternativas y soluciones.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #10  
Antiguo 31-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por Lizette Ver Mensaje
pero utilizando otro medio para generar las claves, no el autoincremento.
Creo que aquí está la clave, estás negando la forma más fácil y fiable de hacerlo. ¿por qué? pues no lo sé, no lo explicas.

Si lo que quieres generar son números distintos siempre, la herramienta correcta son los generadores.

También puedes usar un:
Código SQL [-]
select Max(codigo) +1 from tabla
Pero esto tiene el problema de funcionamiento en red, cuando dos usuarios distintos quieren crear un cliente, a ambos se le da el mismo número.

O sea, según lo que has pedido: tabla contadores y punto en boca.

Lizette, te sugiero leas la guía de estilo, entre otras cosas se dice que te tomes el tiempo necesario para formular tu pregunta.

Si en el primer mensaje hubieras explicado todas tus necesidades y herramientas que usabas, probablemente la primera respuesta (hace 11 horas) hubiera sido "la solución".

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 31-10-2008
Lizette Lizette is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Lizette Va por buen camino
Jejeje gracias Delphius, haré lo de la tabla temporal..
Eso es lo que queria, solo que me generara el numero para convertirlo a 6
digitos..

Gracias por su aportación!
Responder Con Cita
  #12  
Antiguo 31-10-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por mamcx Ver Mensaje
Es una mala, mala idea tener como campos claves CUALQUIER tipo de codigos.

Un campo clave solo debe ser de 2 tipos, y ya: Un autoincremental o un GUID.

Si necesitas un codigo por razones del usuario o de identificacion mas "humana" esta bien, pero debes analizar si la razon del codigo es una representacion humana o una imitacion innecesaria de una clave interna del sistema.

Si solo se requiere para identificar un registro, un autonumerico es mas que suficiente.
Complementando lo que comenta Mario, creo que es conveniente considerar este razonamiento: http://www.clubdelphi.com/foros/show...3&postcount=14
Responder Con Cita
  #13  
Antiguo 31-10-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Lepe Ver Mensaje
...También puedes usar un:
Código SQL [-]
select Max(codigo) +1 from tabla
Pero esto tiene el problema de funcionamiento en red, cuando dos usuarios distintos quieren crear un cliente, a ambos se le da el mismo número...
No si la tabla tiene establecido un índice de tipo único sobre el campo en cuestión. En cuyo caso, para el segundo usuario, se elevaría una excepción que podría ser atrapada para entonces intentar de nuevo la operación haciendo otra vez la consulta "Select Max".

Esto considerando que la transacción usada para el guardado no demore más tiempo de lo que se requiere para insertar un registro y sus posibles detalles en la base de datos. Comento esto último porque, de otra forma, el segundo usuario podría verse obligado a esperar una cantidad de tiempo considerable (ya sea por bloqueo de la primera transacción o por no estar "visible" aún el nuevo valor máximo).

Saludos.

Al González.

Última edición por Al González fecha: 31-10-2008 a las 20:46:42.
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
como genero una numeracion en QuickReport ...?¿ marcelinux Varios 1 12-09-2007 00:48:30
¿Cómo genero un informe en Word? EveElgrande Internet 3 25-07-2006 15:46:54
COmo genero un mensaje antes de un Sysutils.Abort Bitbanner Conexión con bases de datos 19 16-02-2005 17:41:58
ToolBar como Genero una mtpedro Conexión con bases de datos 2 29-10-2004 16:14:01
Numero secuenciales lafirma Firebird e Interbase 9 25-11-2003 22:06:30


La franja horaria es GMT +2. Ahora son las 11:33:09.


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