Ver Mensaje Individual
  #2  
Antiguo 03-08-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No entiendo tu problema con la clave. Estamos hablando de la llave primaria ¿no? Entonces no debería editarse ¿o sí?

Bueno, como alguna vez he intentado hacer estas cosas es, primero que nada, usando una llave primaria artificial (un entero autoincremental, por ejemplo) para no caer en el caso de tener que editarla.

Cada objeto del negocio desciende de una clase común:

Código:
TObjetoNegocio = class
public
  property Id;
  procedure Load(Id: Integer); virtual; abstract;
  procedure Save; virtual; abstract;
  procedure Delete; virtual; abstract;
end;
Cada clase redefine los métodos para construir las sentencias SQL adecuadas y mandarlas al DataModule. El método Save es dual, sirve para insertar y modificar. Si el ID es 0, quiere decir que el objeto es nuevo y se requiere un INSERT. En caso contrario, quiere decir que ya existe en la base y se requiere un UPDATE.

Siguiendo tu ejemplo, se procedería así:

Código:
Empresa := TEmpres.Create();

try
  Empresa.Load(EmpresaId);
  if TViewEmpresa.Editar(Empresa) then
    Empresa.Save;
finally
  Empresa.Free;
end;
TViewEmpresa.Editar sería un método de clase que es el que se encarga de construir el visor y pasarle el objeto Empresa. Esto para evitar tener que construir explícitamente el visor en cada edición que se requiera.

---------

El paso de datos entre el objeto y los controles yo creo que es mucho más difícil. Una aproximación podría ser usar RTTI para inspeccionar las propiedades publicadas del objeto y llenar con ellas los controles con el mismo nombre.

// Saludos
Responder Con Cita