Buenos dias con todos, siempre es un gusto contactarlos, en esta oportunidad estoy tratando de hacer una función generica Get para que me devuelva un objeto de cualquier tipo a traves de una consulta con un Query.
por ejemplo:
1. Creo una clase TCliente
Código Delphi
[-]
type
TCliente = class(TObject)
private
Id_Cliente:Integer;
RazonSocial:String;
RazonSocialCorta:String;
...
...
public
Constructor Create;
procedure Clear;
property iId_Cliente:Integer read Id_Cliente write Id_Cliente;
property iRazonSocial:String read RazonSocial write RazonSocial;
property iRazonSocialCorta:String read RazonSocialCorta write RazonSocialCorta;
...
...
End;
2. Creo una function con parametros del nombre de la Tabla y el numero del registro. por ejemplo la tabla se llama Cliente y el Id es el numero 1, estos datos los pongo cuando invoco la función:
Código Delphi
[-]
var Obj :TObject;
begin
Obj := TObject.Create;
Obj := Dm.GetObject(1,'Cliente');
showmessage('Razon Social: '+ (Obj as TCliente).iRazonSocial);
aquí les paso la funcion GetObject que es la quiero implementar
Código Delphi
[-]
function TDM.GetObject(Id: integer; TableName: String): TObject;
var ClassName,Cad,CProp:String;
Obj:TObject;
MiQuery: TFDQuery;
Campos, Propiedad : TStringList;
lProp : TRTTIProperty;
lContext,C : TRTTIContext;
lType : TRTTIType;
Value: TValue;
Pos1,Pos2:integer;
begin
Campos := TStringList.Create;
Propiedad := TStringList.Create;
Cad := 'select * from '+TableName;
ClassName := 'T'+TableName;
MiQuery := TFDQuery.Create(nil);
MiQuery.Connection := Connection;
MiQuery.SQL.Clear;
MiQuery.SQL.Add(Cad);
MiQuery.Open;
LContext := TRttiContext.Create;
C := TRttiContext.Create;
Obj := (C.FindType('Modelo_Cliente.'+ClassName) as TRttiInstanceType).MetaClassType.Create;
lType := lContext.GetType(Obj.ClassInfo);
for lProp in LType.GetProperties do begin
Cad := lProp.ToString;
Pos1 := Pos('i',Cad);
Pos2 := Pos(':',Cad);
CProp := Copy(Cad,Pos1,Pos2-Pos1);
Propiedad.Add(CProp);
end;
if MiQuery.RecordCount>0 then
begin
Connection.GetFieldNames('','',TableName,'',Campos);
Value := '123456789';
for lProp in LType.GetProperties do begin Cad := lProp.ToString;
if Cad = 'property iId_Cliente: Integer' then
lProp.SetValue(Obj,Value);
end;
end;
result := Obj;
end;
Como comentaba en lineas arriba no se como modificar los atributos del objeto Obj para poder devolver el objeto con todos sus valores.
todo esto lo quiero hacer para cualquier tabla y cualquier tipo de objeto, para esto debo indicar que si creo una tabla Kardex también creo una clase TKardex en un .pas que se llamaría Modelo_Kardex, ese es un standard que sigo.
Les pido me den una mano para poder solucionar este problema, este metodo me serviria para extraer cualquier objeto de cualquier tabla.
Muchas gracias de antemano por leer esta consulta y gracias por su tiempo.
Saludos,
Javier Villa.