#1 2024-02-21 20:47:25

mrbar2000
Member
From: Brazil
Registered: 2016-10-26
Posts: 88

Get Objects and your relations

Sry brind this questions but I need help.

this is my model:

  TContatos = class(TOrmMany)
  private
    FSource: TPessoa;
    FDest: TContato;
  published
    property Source: TPessoa read FSource;
    property Dest: TContato read FDest;
  end;
  
  TContato = class(TOrm)
  private
    FTelefone: RawUTF8;
    FEmail: RawUTF8;
  published
    property Telefone: RawUTF8 read FTelefone write FTelefone;
    property Email: RawUTF8 read FEmail write FEmail;
  end;
  
  TRacas = (rPoodle, rViraLata, rPitbull, rShawShaw);

  TPet = class(TOrm)
  private
    FRaca: TRacas;
    FNome: RawUTF8;
    FDono: TPessoa;
  published
    property Raca: TRacas read FRaca write FRaca;
    property Nome: RawUTF8 read FNome write FNome;
    property Dono: TPessoa read FDono write FDono;
  end;
  
  TCidade = class(TOrm)
  private
    FNome: RawUTF8;
  published
    property Nome: RawUTF8 read FNome write FNome;
  end;

  TPessoa = class(TOrm)
  private
    FNome: RawUTF8;
    FIdade: Integer;
    FCidade: TCidade;
    FContatos: TContatos;
    FPets: TObjectList;
  public
    function NewContato(const pEmail, pFone: RawUtf8): TContato;
    function NewPet(const pRaca: TRacas; const pNome: RawUTF8): TPet;
    property Pets: TObjectList read FPets write FPets;
    destructor Destroy; override;
  published
    property Nome: RawUTF8 read FNome write FNome;
    property Idade: Integer read FIdade write FIdade;
    property Cidade: TCidade read FCidade write FCidade;
    property Contatos: TContatos read FContatos write FContatos;
  end;

this is my data on database

Pessoa
id,"nome","idade","cidade"
1,"Pedro","25","1"
2,"Maria","39","2"

pet
id,"raca","nome","dono"
1,0,"miau","1"
2,1,"auau","1"
3,3,"goal","1"
4,1,"sansao","2"

cidade
id,"nome"
1,"Conquista"
2,"Jequié"

contato
id,"telefone","email"
1,"77 988526666","pedro@gmail.com"
2,"77 988526666","joao@gmail.com"
3,"73 999566489","jose@gmail.com"

contatos
id,"source","dest"
1,"1","1"
2,"1","2"
3,"2","3"
4,"2","1"

There is some way to retrieve all Pessoa with all properties? Cidade, Contatos, Pets, How can I do this?

my tries:

var
  vPessoas: TPessoa;
  vCidade: TCidade;
  vContato: TContato;
  vOrm: IRestOrm;
  vIdPessoa: TID;
  vI: Integer;
begin
  vPessoas := TPessoa.CreateAndFillPrepareJoined(FRestOrm.Orm, '', [], []);
  try
	  Memo2.Lines.Add(Format('Quantidade de pessoas: %d', [vPessoas.FillTable.RowCount]));  // ok return 2 pessoa
	  while vPessoas.FillOne do
	  begin
      Memo2.Lines.Add(Format('Id: %d', [vPessoas.ID]));
      Memo2.Lines.Add(Format('Nome: %s', [vPessoas.Nome]));
      Memo2.Lines.Add(Format('Idade: %d', [vPessoas.Idade]));
      Memo2.Lines.Add(Format('Cidade: %s', [vPessoas.Cidade.Nome]));

      vPessoas.Contatos.FillPrepareMany(FRestOrm.Orm, 'RowId>=?', [], [vPessoas.ID]);
      Memo2.Lines.Add(Format('Quantidade de Contatos: %d', [vPessoas.Contatos.FillTable.RowCount])); // ERROR HERE. return 0 should be 2 (pedro and joao) <<<<<<
      while vPessoas.Contatos.Dest.FillOne do  // fillone return false
      begin
        Memo2.Lines.Add(Format('  Contato: %s - %s', [vI, vPessoas.Contatos.Dest.Email, vPessoas.Contatos.Dest.Telefone])); //is not retrieving email and telefone value
      end;
      vPessoas.FillClose;

      // pets is nil on this moment then i do this, but i don´t know if is the better aproach.  <<<<<<

      vPessoas.Pets := FRestOrm.RetrieveList(TPet, 'dono=?', [vPessoas.Id]);
      Memo2.Lines.Add(Format('Quantidade de Pets: %d', [vPessoas.Pets.Count]));  ok 3 from first pessoa and 1 to second
      for vI := 0 to vPessoas.Pets.Count-1 do
        Memo2.Lines.Add(Format('  Pets %d: %s', [vI, TPet(vPessoas.Pets[vI]).Nome]));

      Memo2.Lines.Add('-----------------------');

      vPessoas.Pets.Clear;
      vPessoas.Pets.Free;
      vPessoas.Pets := nil;
	  end;
  finally
	  vPessoas.Free;
  end;

 

I try too
vPessoas := TPessoa.CreateAndFillPrepareMany(FRestOrm.Orm, '', [], []); 
but this way it retrieve 4 pessoa on while

I try too
vPessoas.Contatos.FillPrepareMany(FRestOrm.Orm, 'RowId>=?', [], [vPessoas.ID]);
but vPessoas.Contatos.FillTable.RowCount return 0 and vPessoas.Contatos.FillOne return false

I try too
vPessoas.Contatos.FillMany(FRestOrm.Orm, vPessoas.ID);
vPessoas.Contatos.FillTable.RowCount return 2 ok but vPessoas.Contatos.FillOne return false

Oh my god!!!! I read documentation already and cannot make this work.

Offline

Board footer

Powered by FluxBB