RTTI - Avançado Objeto dentro de Objeto - ContasBancarias.Clientes
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
Como eu faço para pegar os atributos da classe cliente.
Hoje para pegar de conta bancária eu faço assim
Isso pega os dados do ContaBancaria.
Mais como eu faria para pegar os atributos dos clientes ?
Desde já agradeço
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
Curtidas 0
Respostas
Marco Salles
09/08/2012
Vc decorou sua classe com Atributos ???
GOSTEI 0
Andre Faria
09/08/2012
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;
GOSTEI 0
Marco Salles
09/08/2012
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 ???
Percebo que vc esta tentando criar um Framework de persitencia
Vc viu os videos do Rodrigo que exemplifica isto ???
GOSTEI 0
Andre Faria
09/08/2012
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.
Mais o problema lá é que ninguém faz relacionamento entre tabelas, não ví nenhum video que exemplifica isso.
GOSTEI 0
Leandro
09/08/2012
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:
Lista:
Essa rotina varre o objeto e verifica se é uma classe ou uma lista
Alguns trechos do codigo tirado do framework FireObject
msn: robhotyco@hotmail.com
Grato.
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.
GOSTEI 0
Valdenir Albino
09/08/2012
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 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.
GOSTEI 0
Andre Faria
09/08/2012
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 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;
GOSTEI 0
Andre Faria
09/08/2012
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:
Lista:
Essa rotina varre o objeto e verifica se é uma classe ou uma lista
Alguns trechos do codigo tirado do framework FireObject
msn: robhotyco@hotmail.com
Grato.
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
GOSTEI 0
Leandro
09/08/2012
Ja adicionei voce André
GOSTEI 0
Andre Faria
09/08/2012
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
GOSTEI 0