Ver Mensaje Individual
  #1  
Antiguo 02-05-2020
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 99
Reputación: 20
javicho_villa Va por buen camino
Smile Funcion Get usando RTTI

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;

  //-- Iniciando extraccion de las propiedades de las clases --//
  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  /// Aca guardo las propiedades en un StringList llamado Propiedad
  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
      //--- Poniendo los campos en el arreglo --///
      Connection.GetFieldNames('','',TableName,'',Campos);   //--- Aca hay que poner los campos del Query ----//

      //--- Poniendo las propiedades del Objeto ---//
      //(Obj as ClassName).Propiedad[2] := '123456';
      Value := '123456789';


      for lProp in LType.GetProperties do  //// ACA ESTA EL ERROR NO PUEDO GUARDAR LOS VALORES EN EL OBJETO
      begin                                            /// NOSE COMO USAR EL PROPERTY O CUALQUIER METODO PARA MODIFICAR LOS ATRIBUTOS DEL OBJETO.
        Cad  := lProp.ToString;
        //showmessage(Cad);
        if Cad = 'property iId_Cliente: Integer' then
          lProp.SetValue(Obj,Value);
      end;

      //Lprop.SetValue(Obj,'12345');


      //showmessage(Campos[5]);
      //showmessage(Propiedad[4]);

    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.
__________________
Javier Villa Sánchez
jvilla@andreaproducciones.com
Responder Con Cita