Ver Mensaje Individual
  #5  
Antiguo 16-04-2007
Avatar de casacham
casacham casacham is offline
Miembro
 
Registrado: abr 2006
Ubicación: Cordoba->Argentina. Arboleas->Almeria->España
Posts: 184
Reputación: 19
casacham Va por buen camino
Cool 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.
Responder Con Cita