Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como genero claves secuenciales (https://www.clubdelphi.com/foros/showthread.php?t=61244)

Lizette 31-10-2008 07:52:18

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

Delphius 31-10-2008 08:11:27

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,

Lizette 31-10-2008 08:22:22

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?

Caro 31-10-2008 13:02:13

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

duilioisola 31-10-2008 15:39:43

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!)

mamcx 31-10-2008 15:54:23

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.

Delphius 31-10-2008 15:56:51

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,

Lizette 31-10-2008 16:42:28

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?

Delphius 31-10-2008 18:08:45

Cita:

Empezado por Lizette (Mensaje 323565)
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 (Mensaje 323565)
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 (Mensaje 323565)
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,

Lepe 31-10-2008 19:51:03

Cita:

Empezado por Lizette (Mensaje 323565)
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

Lizette 31-10-2008 19:55:36

;) 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! :)

Al González 31-10-2008 20:14:29

Cita:

Empezado por mamcx (Mensaje 323549)
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

Al González 31-10-2008 20:38:14

Cita:

Empezado por Lepe (Mensaje 323634)
...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. :)


La franja horaria es GMT +2. Ahora son las 00:21:59.

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