Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   como generar un id (https://www.clubdelphi.com/foros/showthread.php?t=42529)

UREÑA 16-04-2007 22:04:06

como generar un id
 
hola amigos una vez mas solicitando de su valiosa ayuda

lo que pasa es que tengo una tabla de usuarios con los campos de id_usuario, nombre, contraseña, me gustaria saber como le puedo hacer para generar un id de usuario cada vez que se agregue un usuario a la tabla

gracias un avez mas;)

chileno 16-04-2007 22:14:09

hola ureña...

debes colocar que base de datos utilizas, porque la mayoria soporta campos incrementales, eso se crea cuando das la estructura de la tabla...ahora si no soporta campos incrementales tu DB. crea una tabla que lleve el conteo, es decir cuando se inserta un registro se le asigna un valor que esta contenido en la otra tabla, y luego se incrementa de tal forma que este listo para la proxima insercion.....bye:)

marcoszorrilla 16-04-2007 22:20:04

Creo que lo que pide es otra cosa. Supongo que quieres generar un Id de usuario automático y al azar.

Si el campo Usuario es de tipo clave única con eso ya evitarás que se repite algún nombre de usuario.

Puedes utilizar Randomize y luego la función Random, para una clave de seis caracteres puede hacer 6 llamadas a esta función dentro del rango de los números y letras y devolverá claves aleatorias, puedes usar SQL para comprobar si la clave ya existe y entonces llamar a generar otra.

Un Saludo.

luisgutierrezb 16-04-2007 22:27:59

lo mas facil es obtener el ultimo id e ir incrementando tu el registro y obtienes un id, otra puede ser conseguir una libreria md5 por ejemplo y obtener el md5 del nombre, seria otro id..

casacham 16-04-2007 22:31:11

Genereando un Id Inteligente
 
Hola amigo del FORO
Te cuento que yo utilizo Id como campo clave en la mayoria de las bases de datos que diseños. Esto me permite modificar el resto de los campos sin perder la relacion Master - > Datail que ocurre cuando se utilizas un campo con valores que vos no controlas como campo clave. Es decir, si utilizas algun dato como la edad o algo asi como campo clave, al modificar esta valor y no actualizarlo en las tablas de detalle perdes la relacion y por consiguiente no vas a ver los datos relacionados.
Debido a este motivo tenes dos soluciones.

1) Hacer que tu campo clave sea autonumerico. Lo cual es muy facil, y si manejas bases de datos de escritorios podes desde Acces o el DatabaseDesktop señalar como autoincrementable a tu campo clave

2) Podes escribir un poco de codigo, sin utilizar Sql, sino algo sencillo como el que yo utilizo para que te genere numeros enteros continuos. Es decir que cada vez que insertas un registro, una funcion encuentre un numero unico para cada campo y que sea continuacion del que eliminaste. Es asi. vas a ingresar registros y cada uno llevara como Id valores como 1 2 3 4 5 6, pero si borras el registro "3", te van a quedar 1 2 4 5 6, lo que hace mi codigo es buscar esa falta y rellenarla. Es solo para dar un orden. Aqui va el codigo

Tenes que definir esta funcion en el sector private de tu DataModule


Código Delphi [-] procedure DS_EvolLaboraStateChange(Sender: TObject);
private
{ Private declarations }
ViejoPE, ViejaAL, VijoEP: Double;
FUNCTION ValidIdReg(TOrigen,Tablit: TADOTable; Campo: String):Integer;
.....
....
.....

FUNCTION TDM_BD.ValidIdReg(TOrigen,Tablit: TADOTable; Campo: String):Integer;
Var I: Integer;
begin
{Funcion definida para campos numericos, busca el numero entero inmediato
es para asignar el valor para los campos IdReg, por ejempo}
Tablit.TableName:=TOrigen.TableName;
Tablit.Open;
Tablit.Clone(TOrigen);
I:= 0;
While Tablit.Locate (Campo, I,[loCaseInsensitive]) = True do
begin
I:= I+1;
end;
If Tablit.Locate (Campo, 0,[loCaseInsensitive]) = False then Result:= 0 Else Result:= I;
Tablit.Close;
end;





Luego capturas el evento OnNewRecord de la tabla en la que esta el id
en cuestion y escribis este codigo


Código Delphi [-]
procedure TDM_BD.T_PCTE_NewRecord(DataSet: TDataSet);
begin
F_PCTE.cxDBTextEdit1.SetFocus;
T_PCTE_IdPcte.Value:=ValidIdReg(T_PCTE_, TCtrl, T_PCTE_IdPcte.FieldName);
end;





TDM_BD= TDatamodule donde estan tus objetos
T_PCTE_= Es una TADOTable
T_PCTE_IdPcte= Es el Id del paciente
TCtrl= Es una tabla TADOTable que esta en tu datamodule pero no esta relacionada con ninguna tabla de tu base de datos
La funcion ValidIdReg te devuelve el numero para un Id unico e irrepetible luego de que le pasas como parametro la tabla de origen en la cual reside el campo Id que quieres generar, luego el nombre de la tabla control, que es una tabla ado vacia y el campo id en cuestion de la tabla origen.
Finalmente la funcion clona la tabla origen, es decir realiza un copia de tu tabla original y trata de ver si existe un hueco en la sucesion de numeros id, si es asi te devuelve el necesario para rrellenarlo, sino te genera el siguiente.

Espero que te sirva, y comentame si usas TAdotable, paradox o que sistema de bases de datos estas utilizando. Es totalmente adaptable a paradox el codigo que te mando, pero si lo tuyo es lo mas sencillo con lo que te digo en el primer punto (campos id autoincrementables) es suficiente.

UREÑA 17-04-2007 22:01:52

hola amigos lo que quiero hacer es mucho mas facil...

solo quiero agregarle un numero consecutivo a cada uno de los registros ya que solo voy a eliminar logicamente por que tengo un campo que me los pone como activo o inactivo segun sea el caso asi es que no hay problema al momento de que queden numeros consecutivos sin usar

luisgutierrezb 17-04-2007 22:58:15

pues el autoincremento desde la base de datos
o cuando crees un nuevo registro, puedes usar una consulta, que te traiga el maximo +1 para ponerlo en el campo id

UREÑA 18-04-2007 20:42:21

gracias
 
gracias a todos a los que se tomaron la molestia en ayudarme

ya me quedo

cada vez me gusta mas esto de delphi

salidos!!!:D

ebeltete 17-05-2007 04:09:53

Hola Ureña, buscando otra cosa llege a este hilo, no lo lei todo pero hace tiempo encontre una forma sencilla de generar un id para mi db, lo hice generando un formato de fecha y hora que me permite que se cambie permanentemente, porque el tiempo no para..
es el siguiente:
edit1.TEXT:=formatdatetime('yyMMddHHmmsszzz',now);
queda algo asi: 070516221120235
si tenes varias pc en la red puede pasar que en el mismo momento, o sea en el mismo dia a la misma hora en el mismo segundo y en la misma milesima de segundo se duplique el numero pero en ese caso manejate poniendo un un para de digitos unicos para cada Pc
salu2

casacham 20-05-2007 00:56:47

Que buena IDEA
 
Hola ebeltete que buena idea tenes, menos mal que la publicaste en un hilo reciente


La franja horaria es GMT +2. Ahora son las 21:45:29.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi