Tema: dbexpress
Ver Mensaje Individual
  #2  
Antiguo 14-06-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
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
Smile Diferencia entre campos "ID" y "NUMERO"

¡Hola a todos!

En uno de los proyectos que me ocupan actualmente (Delphi 7 + Firebird 1.5), tengo un procedimiento almacenado llamado SPIDGeneral, el cual utilizo para obtener la llave ID que le doy a cada registro nuevo (el valor se obtiene de un generador):
Código SQL [-]
CREATE PROCEDURE SPIDGENERAL 
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = Gen_ID (GNGENERAL, 1);
END

En la aplicación, en uno de los módulos de datos, tengo un método función llamado NuevoID, que se encarga de ejecutar ese procedimiento almacenado:
Código Delphi [-]
Function TdmGeneral.NuevoID :Integer;
Begin
  spIDGeneral.ExecProc;
  Result := spIDGeneral.Params [0].AsInteger;
End;

Finalmente, me aseguro de llamar al método NuevoID en el evento AfterInsert de cada conjunto de datos cliente de captura, para asignar un valor al campo ID de cada nuevo registro:
Código Delphi [-]
procedure TfmPlantillaCapturaCodigo.dtCapturaAfterInsert(
  DataSet: TDataSet);
begin
  inherited;
  dtCapturaID.Value := dmGeneral.NuevoID ();
end;

Esto considerando que el campo llave ID de todas las tablas se utiliza solamente para identificar de manera única cada registro y no tiene un valor semántico para el usuario (el campo ID no es mostrado ni impreso, el número que almacena no representa nada para el usuario). Por lo tanto utilizo un generador común (gnGeneral) para el campo ID de todas las tablas.

En casos donde requiero un campo estrictamente consecutivo y representativo para el usuario (como los números de facturas, por ejemplo), lo agrego a la tabla a la cual corresponda y lo alimento en un disparador Before Insert con el número máximo almacenado actualmente más uno («Select Max (Numero) From...» + 1). Como es de esperarse, el número consecutivo aparece en pantalla hasta que el usuario guarda el registro.

De esa manera, cada tabla tiene un campo ID cuyo valor es obtenido desde un generador común, y asignado desde el evento AfterInsert de un conjunto de datos, o en su defecto, desde el disparador Before Insert que, para este propósito, toda tabla puede tener. Y algunas de esas tablas cuentan además con un campo Numero, para guardar el número consecutivo que el usuario verá en pantalla o impreso. Es decir, no mezclo los identificadores de registro que son para el servidor (campos ID), con los identificadores de entidad de datos que son para el usuario (campos Numero). Establezco una independencia muy sana entre ambos.

Espero esta experiencia sea de utilidad a muchos otros desarrolladores.

Un abrazo clave.

Al González.
Responder Con Cita