Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Mostrar descrição ao invés do id Boa tarde! Pessoal estou començando a trabalhar com Adianti e mesmo lendo os tutoriais e alguns tópicos aqui no fórum não consegui resolver. Acredito que seja falha minha mesmo. Tenho 2 tabela , Municipio e UnidadeFederacao Eu gostaria de exibir no datagrid a UF do Estado, mas está aparecendo o ID Na classe Municipio eu tenho o método get_unidadefederacao() public function get_uni...
WR
Mostrar descrição ao invés do id  
Fechado
Boa tarde!
Pessoal estou començando a trabalhar com Adianti e mesmo lendo os tutoriais e alguns tópicos aqui no fórum não consegui resolver.
Acredito que seja falha minha mesmo.

Tenho 2 tabela , Municipio e UnidadeFederacao
Eu gostaria de exibir no datagrid a UF do Estado, mas está aparecendo o ID

Na classe Municipio eu tenho o método get_unidadefederacao()
public function get_unidadefederacao()
{
// loads the associated object
if (empty($this->unidadefederacao))
$this->unidadefederacao = new Unidadefederacao($this->unidadefederacao_id);

// returns the associated object
return $this->unidadefederacao->sigla;
}

E na Classe MunicipioFormList (gerado pelo Gerador de Formulários) eu tenho isso:

// creates the datagrid columns
$column_id = new TDataGridColumn('id', 'Id', 'left');
$column_nome = new TDataGridColumn('nome', 'Nome', 'left');
$column_idUnidadeFederacao = new TDataGridColumn('idUnidadeFederacao', 'UF', 'left');


// add the columns to the DataGrid
$this->datagrid->addColumn($column_id);
$this->datagrid->addColumn($column_nome);
$this->datagrid->addColumn($column_idUnidadeFederacao);

Onde estou errando??

Desde já agradeço!!

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (22)


MC

boa tarde

A minha sugestão e que opte por uma das opções abaixo, simples e tecnicamente correto,
pois também uso estes relacionamentos em diversos tipos de objetos.

1 - Ao invés de você guardar o ID da Federação na Segunda Tabela, guarda o UF da mesma (Base de Dados)
2 - Criar uma View que faça o relacionamento entre as duas tabelas e carrega-la na DataGrid ao invés da Tabela. (minha sugestão)


No cadastro basta usar um TDBCombo ou se preferir um TCombo.

Abraços
MC

Detalhe.

Caso opte pela segunda opção, somente no onReload do list você irá usar a View,

Quando for excluir deverá usar a Tabela.


Abraços
WR

Marco, vou seguir sua sugestão e ver se consigo resolver.
Obrigado !!
Abraços
FC

Wilson e Marco

O Adianti faz o relacionamento guarde sempre os ids conforme divulgado para recuperar em qualquer lugar ou mesmo no datagrid basta apenas ajustar o código

$column_idUnidadeFederacao = new TDataGridColumn('unidadefederacao->sigla', 'UF', 'left');

A função do framework é evitar o retrabalho um deles é a criaçao de sql complexas e views desnecessárias.

WR

Olá Felipe, também tentei fazer conforme você mecionou utilizando o código a baixo

$column_idUnidadeFederacao = new TDataGridColumn('unidadefederacao->sigla', 'UF', 'left');

Porém dá um erro "Trying to access a non-existent property (unidadefederacao->sigla)" e não carrega a UF

Já revisei várias vezes e não consigo recuperar a informação utilizando o relacionamento.
Quando criei o Novo modelo (Municipio) eu configurei a associação com a tabela UnidadeFederacao e alterei o returne do método
get_unidadefederacao()
De: return $this->unidadefederacao;
Para return $this->unidadefederacao->sigla;

Abraço
FC

na model deve setar a variavel como private e o return deve ser somente $this->unidadeferacao

Então la em cima da classe model verifica se esta assim

private $unidadefederacao;

public function get_unidadefederacao()
{
// loads the associated object
if (empty($this->unidadefederacao))
$this->unidadefederacao = new Unidadefederacao($this->unidadefederacao_id);

// returns the associated object
return $this->unidadefederacao;
}

confira os ids se existem na tabela.
FC

Veja esse exemplo a cidade é uma composição.

www.adianti.com.br/framework_files/tutor/index.php?class=CustomerDat
WR

Até já dei uma olhada no código desse exemplo. Estou usando o gerador de formulários para gerar o código, vou fazer manualmente usando o exemplo como base pra ver se consigo fazer funcionar.
Parece ser apenas um detalhe, mas tá me dando um baile!

Agradeço pela ajuda!

Abraço
WR

Usei como base o exemplo www.adianti.com.br/framework_files/tutor/index.php?class=CustomerDat e modifiquei para meus dados, mas não consigo retornar os dados (UF) usando o relacionamento de composição. Dá erro dizendo que a propriedade que estou tentando acessar não existe.


Tô usando o mysql e versão 3.0 do Adianti Studio.
Será que pode ter alguma coisa a ver com o meu banco de dados??

Não querendo abusar , se alguém puder simular esse exemplo com essas duas tabelas bem pequenas, só pra tirar a dúvida se funciona mesmo, pois aqui tá difícil de fazer funcionar.

mysql> desc UnidadeFederacao;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| nome | varchar(40) | YES | MUL | NULL | |
| sigla | char(2) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+

mysql> desc Municipio;
+--------------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| nome | varchar(50) | YES | | NULL | |
| idUnidadeFederacao | int(11) | YES | MUL | NULL | |
+--------------------+-------------+------+-----+---------+-------+

Desde já agradeço a ajuda de todos
Abraços
MC

Felipe, descordo de voce

Pra que usar um BD se você não não sabe ou não vai utiliza-lo ???

View inuteis ?, SQL complexas..... ???

Esta é a função do BD, descomplicar o que para o sistema eh complicado... ou engessamento do sistema.

Não saber trabalhar com o BD é diferente do que vc comentou acima.

Toda as regras de negocio ficam para o BD e para isso que eles servem.

2 dias tentando resolver uma consulta simples....

Exemplo

Select cid.id, cid.cidade, est.sigla
from Cidade cid, unidadefederacao est
where est.id = cid.ufid

simples assim...

Winson posta ai os arquivos records das duas tabelas e qual BD você esta usando que mando para você a View para ser criada,
basta depos cria um novo records da View e faça as alteração no onReload do List, pronto tara resolvido o seu problema.


Abraços.
FC

Marco

Não estamos falando de banco de dados, tenho bastaste experiência com BD o que estou alertando acima é a orientação que o Pablo e a documentação do Framework propõe que é diminuir a quantidade de códigos e sql misturados dentro do framework, não estou dizendo que seu método é errado nem estou fazendo critica, apenas alertando que pode trocar uma view e mais um model por apenas um objeto exemplo:

Olhe Marco
Seu metodo propoe
1- Criar uma view.
2- Criar um Model para aessar a mesma.

O metodo do Pablo sugere apenas
$obejeto->nomedocampo


Ambos fazem o mesmo.

Em nenhum momento fiz critica como trabalha, mas analisa direitinho.

Sds
Felipe Cortez
FC

Leitura recomendada:
www.adianti.com.br/forum/pt/view_1341?banco-de-dados-em-memoria-nao-
MC

Wilson

Segue o Select para se criar a View no MySQL pode dar o nome que quiser, aqui estou chamando de ViewCidade



select *
from Municipio MN,
UnidadeFederacao UF
where MN.idUnidadeFederacao = UF.Id



Depois siga abaixo

1 - Apos criar a View no BD, cria um novo modelo como TRecord

2 - No onReload do seu List mude para a View onde você carrega a Tabela

$repository = new TRepository('ViewCidade');


3 - A View irá trazer todos os campos das duas tabelas, assim você decide qual irá mostra.


Lembre-se no BD tantos os campos, quanto os nomes das Tabelas tem que esta da forma que foram constituídos
ou seja com Maiúsculas e minusculas, usei o modelo que você passou aqui no fórum então acredito que esteja.
Outra coisa é que você só usara a View no onReload, nas demais ações deve se deixar a Tabela.


Quanto ao problema original e bom estuda-lo e tentar resolve-lo assim aprenderá um pouco mais sobre a ferramenta.


Abraços;
IF

Wilson , é fácil veja o exemplo:

Model Unidadefederacao
  1. <?php
  2. /**
  3.  * Unidadefederacao Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class Unidadefederacao extends TRecord
  7. {
  8.     const TABLENAME 'UnidadeFederacao';
  9.     const PRIMARYKEY'id';
  10.     const IDPOLICY =  'serial'// {max, serial}
  11.     
  12.     
  13.     /**
  14.      * Constructor method
  15.      */
  16.     public function __construct($id NULL$callObjectLoad TRUE)
  17.     {
  18.         parent::__construct($id$callObjectLoad);
  19.         parent::addAttribute('nome');
  20.         parent::addAttribute('sigla');
  21.     }
  22. }
  23. ?>


Model Municipio

  1. <?php
  2. /**
  3.  * Municipio Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class Municipio extends TRecord
  7. {
  8.     const TABLENAME 'Municipio';
  9.     const PRIMARYKEY'id';
  10.     const IDPOLICY =  'serial'// {max, serial}
  11.     
  12.     
  13.     private $unidadefederacao;
  14.     /**
  15.      * Constructor method
  16.      */
  17.     public function __construct($id NULL$callObjectLoad TRUE)
  18.     {
  19.         parent::__construct($id$callObjectLoad);
  20.         parent::addAttribute('nome');
  21.         parent::addAttribute('idUnidadeFederacao');
  22.     }
  23.     
  24.     /**
  25.      * Method set_unidadefederacao
  26.      * Sample of usage: $municipio->unidadefederacao = $object;
  27.      * @param $object Instance of Unidadefederacao
  28.      */
  29.     public function set_unidadefederacao(Unidadefederacao $object)
  30.     {
  31.         $this->unidadefederacao $object;
  32.         $this->idUnidadeFederacao $object->id;  //Seu erro está aqui!!! ***
  33.     }
  34.     
  35.     /**
  36.      * Method get_unidadefederacao
  37.      * Sample of usage: $municipio->unidadefederacao->attribute;
  38.      * @returns Unidadefederacao instance
  39.      */
  40.     public function get_unidadefederacao()
  41.     {
  42.         // loads the associated object
  43.         if (empty($this->unidadefederacao))
  44.             $this->unidadefederacao = new Unidadefederacao($this->idUnidadeFederacao); // E aqui!!!***
  45.     
  46.         // returns the associated object
  47.         return $this->unidadefederacao;
  48.     }
  49.     
  50. }
  51. ?>


No seu Datagrid:

  1. <?php
  2.         $column_idUnidadeFederacao = new TDataGridColumn('unidadefederacao->sigla''Idunidadefederacao''right');
  3. ?>


Espero ter ajudado.
WR

Bom dia!

Agradeço a ajuda de todos, agora a exibição dos registros (UF) na grid está funcionando legal!!!

Só mais uma pergunta , na edição dos registros é possível substituir o componente TEntry por um TDBCombobox ?? para que o campo idUnidadeFederacao possa mostrar a UF correspondente ??

Abraços e mais uma vez muito obrigado!!
WR

Pessoal já consegui fazer a troca do componente TEntry pelo TDBCombobox.

Abraços
PD

People,

A discussão é interessante. Eu tenho 20 anos de experiência na construção de sistemas de gestão e já vi muita empresa desesperada por colocar muita lógica no BD e depois morrer abraçada nele. Se usarmos o BD apenas como "repositório de dados", vamos conseguir intercambiar entre diferentes SGBD's de maneira mais fácil. Lógica é para estar na aplicação, não no BD, e com o uso de cache transparente de objetos, como o Felipe colocou, reduzimos consideravelmente a necessidade de ir até o BD buscar registros. O objetivo final é código limpo, sem SQL's.

Sei que tem muita gente apaixonada por SQL, que programa quase tudo em SQL. É uma linguagem boa para relatórios, não para usar no meio da regra de negócio. Outra leitura sugerida:
www.adianti.com.br/forum/pt/view_876?pensando-em-objetos-nao-em-sql-

Abraço,
RS

boa noite,
Sei q esse topico é antigo, mas estou com o mesmo problema, e nao e exclussivo dessa classe todas que tento utilizar seguindo o exemplo ($comanda->system_unit->attribute;) nao funciona, mesmo na classe que fiz passo a passo como esta na video aula, mas nao esta funcionando, alguem pode me ajudar?

  1. <?php
  2. /**
  3.  * Comanda Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class Comanda extends TRecord
  7. {
  8.     const TABLENAME 'comanda';
  9.     const PRIMARYKEY'Cod_Comanda';
  10.     const IDPOLICY =  'max'// {max, serial}
  11.     
  12.     
  13.     private $system_unit;
  14.     /**
  15.      * Constructor method
  16.      */
  17.     public function __construct($id NULL$callObjectLoad TRUE)
  18.     {
  19.         parent::__construct($id$callObjectLoad);
  20.         parent::addAttribute('Cod_Empresa');
  21.         parent::addAttribute('Situacao');
  22.         parent::addAttribute('Descricao');
  23.         parent::addAttribute('Nome_Interno');
  24.         parent::addAttribute('Requer_Utilizador');
  25.         parent::addAttribute('cor');
  26.     }
  27.     
  28.     /**
  29.      * Method set_system_unit
  30.      * Sample of usage: $comanda->system_unit = $object;
  31.      * @param $object Instance of SystemUnit
  32.      */
  33.     public function set_system_unit(SystemUnit $object)
  34.     {
  35.         $this->system_unit $object;
  36.         $this->system_unit_id $object->id;
  37.     }
  38.     
  39.     /**
  40.      * Method get_system_unit
  41.      * Sample of usage: $comanda->system_unit->attribute;
  42.      * @returns SystemUnit instance
  43.      */
  44.     public function get_system_unit()
  45.     {
  46.         // loads the associated object
  47.         if (empty($this->system_unit))
  48.             $this->system_unit = new SystemUnit($this->system_unit_id);
  49.     
  50.         // returns the associated object
  51.         return $this->system_unit;
  52.     }
  53.     
  54. }
  55. ?>


DS

Olá, tudo bem? Tópico antigo, mas como o colega acima eu também estou com mesmo problema, alguém ainda para um help ?
DS

// creates the datagrid columns $column_idproblema = new TDataGridColumn('idproblema', 'Idproblema', 'right'); $column_tituloproblema = new TDataGridColumn('tituloproblema', 'Tituloproblema', 'left'); $column_descricaoproblema = new TDataGridColumn('descricaoproblema', 'Descricaoproblema', 'left'); $column_dataabertura = new TDataGridColumn('dataabertura', 'Dataabertura', 'left'); $column_situacaoid = new TDataGridColumn('{situacao->situacao}', 'Situacaoid', 'right'); $column_usuarioid = new TDataGridColumn('{system_user->name}', 'Usuarioid', 'right');
DS

  1. <?php 
  2.  // creates the datagrid columns
  3.         $column_idproblema = new TDataGridColumn('idproblema''Idproblema''right');
  4.         $column_tituloproblema = new TDataGridColumn('tituloproblema''Tituloproblema''left');
  5.         $column_descricaoproblema = new TDataGridColumn('descricaoproblema''Descricaoproblema''left');
  6.         $column_dataabertura = new TDataGridColumn('dataabertura''Dataabertura''left');
  7.         $column_situacaoid = new TDataGridColumn('{situacao->situacao}''Situacaoid''right');
  8.         $column_usuarioid = new TDataGridColumn('{system_user->name}''Usuarioid''right');
  9. ?>
RS


DAVI LIMA E SILVA tudo bem, o meu erro estava na classe do meu codigo, mas precisamente no set e get , aonde, eu setava o atributo system_unit_id mas na minha classe era Cod_Empresa, se voce puder postar a classe q do objeto q esta passando para popular a datagrid, talvez eu possa ajudar vc