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!!
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!!
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
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
Marco, vou seguir sua sugestão e ver se consigo resolver.
Obrigado !!
Abraços
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.
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
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.
Veja esse exemplo a cidade é uma composição.
www.adianti.com.br/framework_files/tutor/index.php?class=CustomerDat
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
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
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.
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
Leitura recomendada:
www.adianti.com.br/forum/pt/view_1341?banco-de-dados-em-memoria-nao-
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;
Wilson , é fácil veja o exemplo:
Model Unidadefederacao
Model Municipio
No seu Datagrid:
Espero ter ajudado.
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!!
Pessoal já consegui fazer a troca do componente TEntry pelo TDBCombobox.
Abraços
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,
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?
Olá, tudo bem? Tópico antigo, mas como o colega acima eu também estou com mesmo problema, alguém ainda para um help ?
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