Fórum RTTI - Avançado Objeto dentro de Objeto - ContasBancarias.Clientes #421368

09/08/2012

0

Boa noite galera,
estou quebrando a cabeça a horas, tenho um método genérico que monta todo o select via RTTI com os atributos dos campos.
Segue o problema,
tenho um objeto dentro de outro objeto
    TCONTAS_RECEBER = Class(TMovimentoTabelas)
..
    FCLIENTE: TCLIENTES;//Esse é outro objeto do tipo cliente


Como eu faço para pegar os atributos da classe cliente.
Hoje para pegar de conta bancária eu faço assim

      _ctx := TRttiContext.Create;
      _typ := _ctx.GetType(Objeto.ClassInfo);
     For _pro In _typ.GetProperties Do
      Begin
        Achou := False;
        For oAtt In _pro.GetAttributes Do
        Begin
          If oAtt Is TForeignkey Then
          Begin
             //Comandos quaiquer
          End;
        End;

Isso pega os dados do ContaBancaria.
Mais como eu faria para pegar os atributos dos clientes ?

Desde já agradeço
Andre Faria

Andre Faria

Responder

Posts

10/08/2012

Marco Salles

Vc decorou sua classe com Atributos ???
Responder

Gostei + 0

10/08/2012

Andre Faria

sim decorei
TLISTAPARCELAS = Class;
  TCR_ITENS = Class;
  [TTableName(CONTAS_RECEBER)]
    [TGeneretor(CONTAS_RECEBER_CR_CODIGO_GEN)]
    TCONTAS_RECEBER = Class(TMovimentoTabelas)
  Private
    FCR_DOCUMENTO: String;
    FFOR_CODIGO: Integer;
    FCR_OBS_BOLETO: String;
    FCTB_CODIGO: Integer;
    FCR_DATA_ENTRADA: TDate;
    FCLI_CODIGO: Integer;
    FCR_NOME: String;
    FCR_FL_NOTA_FISCAL: String;
    FCCB_CODIGO: Integer;
    FCR_VALOR_TOTAL: Currency;
    FCR_CODIGO: Integer;
    FLISTA_PARCELAS: TLISTAPARCELAS;
    FEMP_CODIGO: Integer;
    FCR_NUMERO_NOTA: Integer;
    FCLIENTE: TCLIENTES;
    Procedure SetCCB_CODIGO(Const Value: Integer);
    Procedure SetCLI_CODIGO(Const Value: Integer);
    Procedure SetCR_CODIGO(Const Value: Integer);
    Procedure SetCR_DATA_ENTRADA(Const Value: TDate);
    Procedure SetCR_DOCUMENTO(Const Value: String);
    Procedure SetCR_FL_NOTA_FISCAL(Const Value: String);
    Procedure SetCR_NOME(Const Value: String);
    Procedure SetCR_OBS_BOLETO(Const Value: String);
    Procedure SetCR_VALOR_TOTAL(Const Value: Currency);
    Procedure SetCTB_CODIGO(Const Value: Integer);
    Procedure SetFOR_CODIGO(Const Value: Integer);
    Procedure SetLISTA_PARCELAS(Const Value: TLISTAPARCELAS);
    Procedure SetEMP_CODIGO(Const Value: Integer);
    Procedure SetCR_NUMERO_NOTA(Const Value: Integer);
    Procedure SetCLIENTE(Const Value: TCLIENTES);
    { private declarations }
  Protected
    { protected declarations }
  Public
    { public declarations }

  Published
    { published declarations }
    [TPrimaryKey(True)]
      [TAutoIncrement(True)]
      [TNomeCampoTabela(CR_CODIGO)]
      Property CR_CODIGO: Integer Read FCR_CODIGO Write SetCR_CODIGO;
    [TNomeCampoTabela(FOR_CODIGO)]
      Property FOR_CODIGO: Integer Read FFOR_CODIGO Write SetFOR_CODIGO;
    [TNomeCampoTabela(CCB_CODIGO)]
      Property CCB_CODIGO: Integer Read FCCB_CODIGO Write SetCCB_CODIGO;
    [TNomeCampoTabela(CR_NOME)]
      Property CR_NOME: String Read FCR_NOME Write SetCR_NOME;
    [TNomeCampoTabela(CR_DATA_ENTRADA)]
      Property CR_DATA_ENTRADA: TDate Read FCR_DATA_ENTRADA Write SetCR_DATA_ENTRADA;
    [TNomeCampoTabela(CR_DOCUMENTO)]
      Property CR_DOCUMENTO: String Read FCR_DOCUMENTO Write SetCR_DOCUMENTO;
    [TNomeCampoTabela(CR_FL_NOTA_FISCAL)]
      Property CR_FL_NOTA_FISCAL: String Read FCR_FL_NOTA_FISCAL Write SetCR_FL_NOTA_FISCAL;
    [TNomeCampoTabela(CR_VALOR_TOTAL)]
      Property CR_VALOR_TOTAL: Currency Read FCR_VALOR_TOTAL Write SetCR_VALOR_TOTAL;
    [TNomeCampoTabela(CR_OBS_BOLETO)]
      Property CR_OBS_BOLETO: String Read FCR_OBS_BOLETO Write SetCR_OBS_BOLETO;
    [TNomeCampoTabela(CLI_CODIGO)]
      Property CLI_CODIGO: Integer Read FCLI_CODIGO Write SetCLI_CODIGO;
    [TNomeCampoTabela(CTB_CODIGO)]
      Property CTB_CODIGO: Integer Read FCTB_CODIGO Write SetCTB_CODIGO;
    [TNomeCampoTabela(EMP_CODIGO)]
      Property EMP_CODIGO: Integer Read FEMP_CODIGO Write SetEMP_CODIGO;
    [TNomeCampoTabela(CR_NUMERO_NOTA)]
      Property CR_NUMERO_NOTA: Integer Read FCR_NUMERO_NOTA Write SetCR_NUMERO_NOTA;
    [TForeignkey(CLIENTES, CLI_CODIGO,CLI_CODIGO, True, TCLIENTES, ToUmPum)]
      Property CLIENTE: TCLIENTES Read FCLIENTE Write SetCLIENTE;
    Property LISTA_PARCELAS: TLISTAPARCELAS Read FLISTA_PARCELAS Write SetLISTA_PARCELAS;
    Function CRIAR_PARCELA_LISTA: TCR_ITENS;
    Procedure ImprimirBoletos(MostrarPreview: Boolean; NumCopias: Integer);
    Procedure MontaBoletos(EnviadoRemessa: Boolean);
    Procedure PARCELAS_GETALL;
    Class Procedure MontaOcorrenciaRemessa(ComboBox: TComboBox);
    Constructor Create;
    Destructor Destroy; Override;
  End;
Responder

Gostei + 0

10/08/2012

Marco Salles

Os atributos descedem da classe TCustomAtribute ??

Percebo que vc esta tentando criar um Framework de persitencia

Vc viu os videos do Rodrigo que exemplifica isto ???
Responder

Gostei + 0

10/08/2012

Andre Faria

Eu ví alguns videos, se você puder me passar o link.
Mais o problema lá é que ninguém faz relacionamento entre tabelas, não ví nenhum video que exemplifica isso.

Responder

Gostei + 0

10/08/2012

Leandro

Me adiciona no msn, estou concluindo um framework ORM pro delphi,

tenho esse metodo

function FindByKey(O : T; ARecursive : Boolean = False; ASearch : Boolean = False): Boolean; reintroduce; virtual;

que carrega recursivamente os objetos que possui na classe tanto objeto como TObjectListT

Objeto:

  [TBusinessObject]
  [TJoinColumn(cepcli,Codigo)]
  [TColumn(cepcli, ftWideString, 8, False, Cep)]
   property Cep : TCepBO read GetCep write SetCep;



Lista:


  [TBusinessObject]
  [TJoinColumn(empresacpg,Empresa)]
  [TJoinColumn(codigocpg,Codigo)]
  property Itens : TObjectListTItensCondicaoPagtoBO read GetItens write SetItens;


Essa rotina varre o objeto e verifica se é uma classe ou uma lista

   if not ARecursive then
   begin
     for myProp in  TRttiContext.Create.GetType(O.ClassType).GetProperties do
     begin
       if TReflectionBO.IsGenericList(myProp.PropertyType) then
       begin
         lObjList := myProp.GetValue(TBaseBO(O)).AsObject;
         SetObjectList(myProp.GetAttributes,O,TObjectListTBaseBO(lObjList));
       end
       else
       if myProp.PropertyType.TypeKind = tkClass then
       begin
         lRefObj :=  TBaseBO(myProp.GetValue(TBaseBO(O)).AsObject);
         Self.FindByKey(lRefObj, True);
       end;
     end;
   end;



Alguns trechos do codigo tirado do framework FireObject

msn: robhotyco@hotmail.com

Grato.

Responder

Gostei + 0

10/08/2012

Valdenir Albino

Olá Amigo.

Eu estou sem o delphi agora, não tenho como escrever códigos.

Primeiramente você deverá executar o for dentro da sua classe normal para montar seu Select.

Porém dentro desse for, voce deve ver se a propriedade é de um tipo primitivo(String, Integer, Float...), ou se ela é uma classe(que é o seu caso).

Eu resolvi isso verificando o TypeKind = tkClass

se ele for TkClass voce vai fazer recursividade, e resolverá seu problema.

qualquer dúvida poste o código.
Responder

Gostei + 0

11/08/2012

Andre Faria

Olá Amigo.

Eu estou sem o delphi agora, não tenho como escrever códigos.

Primeiramente você deverá executar o for dentro da sua classe normal para montar seu Select.

Porém dentro desse for, voce deve ver se a propriedade é de um tipo primitivo(String, Integer, Float...), ou se ela é uma classe(que é o seu caso).

Eu resolvi isso verificando o TypeKind = tkClass

se ele for TkClass voce vai fazer recursividade, e resolverá seu problema.

qualquer dúvida poste o código.


Eu tentei fazer isso.
mais quando eu tento aplicar a recursividade ele não está pegando os atributos da minha outra classe, esté pegando atributos do próprio RTTI atributes tipo, Handle ..
segue um trecho do código.
Eu já tinha feito exatamente com você falou .
rsr

            If _pro.GetValue(Objeto).Kind = tkClass Then
            Begin
              _ctxForeng := TRttiContext.Create;
              _typForeng := _ctxForeng.GetType(TMovimentoTabelas(_pro).ClassInfo);
              For _proForeng In _typForeng.GetProperties Do
              Begin
                NomeCampo := _proForeng.Name;
                For oAttForeng In _proForeng.GetAttributes Do
                Begin
                  If oAttForeng Is TNomeCampoTabela Then
                  Begin
                    NomeCampo := TNomeCampoTabela(oAtt).Nome;
                    Break;
                  End;
                End;
              End;
            End;

Responder

Gostei + 0

11/08/2012

Andre Faria

Me adiciona no msn, estou concluindo um framework ORM pro delphi,

tenho esse metodo

function FindByKey(O : T; ARecursive : Boolean = False; ASearch : Boolean = False): Boolean; reintroduce; virtual;

que carrega recursivamente os objetos que possui na classe tanto objeto como TObjectListT

Objeto:

  [TBusinessObject]
  [TJoinColumn(cepcli,Codigo)]
  [TColumn(cepcli, ftWideString, 8, False, Cep)]
   property Cep : TCepBO read GetCep write SetCep;



Lista:


  [TBusinessObject]
  [TJoinColumn(empresacpg,Empresa)]
  [TJoinColumn(codigocpg,Codigo)]
  property Itens : TObjectListTItensCondicaoPagtoBO read GetItens write SetItens;


Essa rotina varre o objeto e verifica se é uma classe ou uma lista

   if not ARecursive then
   begin
     for myProp in  TRttiContext.Create.GetType(O.ClassType).GetProperties do
     begin
       if TReflectionBO.IsGenericList(myProp.PropertyType) then
       begin
         lObjList := myProp.GetValue(TBaseBO(O)).AsObject;
         SetObjectList(myProp.GetAttributes,O,TObjectListTBaseBO(lObjList));
       end
       else
       if myProp.PropertyType.TypeKind = tkClass then
       begin
         lRefObj :=  TBaseBO(myProp.GetValue(TBaseBO(O)).AsObject);
         Self.FindByKey(lRefObj, True);
       end;
     end;
   end;



Alguns trechos do codigo tirado do framework FireObject

msn: robhotyco@hotmail.com

Grato.



Esse fireObject é seu ?
Me adiciona no Skype, estou sem msn no momento.
cloudcon-es
Responder

Gostei + 0

11/08/2012

Leandro

Ja adicionei voce André
Responder

Gostei + 0

11/08/2012

Andre Faria

lRefObj := TBaseBO(myProp.GetValue(TBaseBO(O)).AsObject);

Linha muito bem postada pelo meu amigo leandro, é exatamente isso que eu precisava.
Agora basta usar a recursividade e problema resolvido.

Obrigado a todos que contribuiram.
Um abraço
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar