RB
Dados não Carrega na datagrid
Olá a todos,
Tenho a seguinte estrutura no banco
Pessoa
IdPessoa,
Nome
...
PessoaFisica
IdPessoa,
CPF,
...
PessoaEndereco
IdPessoa,
IdEndereco,
....
Endereco
IdEndereco,
Logradouro
....
Criei as classes conforme abaixo.
Model Pessoa
Model PessoaFisica
Model PessoaEndereco
Classe que Carrega a datagrid
Porém não carrega nada e também não da erro algum /
Alguém poderia me dar uma luz.
Obs.: estou utilizando banco de dados Mysql, Adianti studio v.40
No aguardo,
desde já obrigado.
Tenho a seguinte estrutura no banco
Pessoa
IdPessoa,
Nome
...
PessoaFisica
IdPessoa,
CPF,
...
PessoaEndereco
IdPessoa,
IdEndereco,
....
Endereco
IdEndereco,
Logradouro
....
Criei as classes conforme abaixo.
Model Pessoa
- <?php
- /**
- * Pessoa Active Record
- * @author <your-name-here>
- */
- class Pessoa extends TRecord
- {
- const TABLENAME = 'Pessoa';
- const PRIMARYKEY= 'IdPessoa';
- const IDPOLICY = 'max'; // {max, serial}
- /**
- * Constructor method
- */
- public function __construct($id = NULL, $callObjectLoad = TRUE)
- {
- parent::__construct($id, $callObjectLoad);
- parent::addAttribute('Nome');
- }
- }
- ?>
Model PessoaFisica
- <?php
- /**
- * Pessoafisica Active Record
- * @author <your-name-here>
- */
- class Pessoafisica extends TRecord
- {
- const TABLENAME = 'PessoaFisica';
- const PRIMARYKEY= 'IdPessoaFisica';
- const IDPOLICY = 'max'; // {max, serial}
- private $pessoa;
- /**
- * Constructor method
- */
- public function __construct($id = NULL, $callObjectLoad = TRUE)
- {
- parent::__construct($id, $callObjectLoad);
- parent::addAttribute('IdPessoa');
- parent::addAttribute('CPF');
- }
- }
- ?>
Model PessoaEndereco
- <?php
- /**
- * PessoaPessoaEndereco Active Record
- * @author <your-name-here>
- */
- class PessoaEndereco extends TRecord
- {
- const TABLENAME = 'PessoaEndereco';
- const PRIMARYKEY= 'id';
- const IDPOLICY = 'max'; // {max, serial}
- /**
- * Constructor method
- */
- public function __construct($id = NULL, $callObjectLoad = TRUE)
- {
- parent::__construct($id, $callObjectLoad);
- parent::addAttribute('Id');
- parent::addAttribute('IdPessoa');
- }
- }
- Model Endereco
- <?php
- /**
- * Endereco Active Record
- * @author <your-name-here>
- */
- class Endereco extends TRecord
- {
- const TABLENAME = 'Endereco';
- const PRIMARYKEY= 'IdEndereco';
- const IDPOLICY = 'max'; // {max, serial}
- /**
- * Constructor method
- */
- public function __construct($id = NULL, $callObjectLoad = TRUE)
- {
- parent::__construct($id, $callObjectLoad);
- parent::addAttribute('Logradouro');
- parent::addAttribute('Bairro');
- parent::addAttribute('Cep');
- parent::addAttribute('Cidade');
- parent::addAttribute('Estado');
- parent::addAttribute('Pais');
- parent::addAttribute('Latitude');
- parent::addAttribute('Longitude');
- parent::addAttribute('CodigoIbge');
- parent::addAttribute('Gia');
- parent::addAttribute('Criacao');
- parent::addAttribute('Atualizacao');
- }
- }
- ?>
Classe que Carrega a datagrid
- <?php
- class ClienteFisicoForm extends TPage {
- private $datagrid; // listing
- private $pageNavigation;
- private $loaded;
- public function __construct() {
- parent::__construct();
- // creates one datagrid
- $this -> datagrid = new TQuickGrid;
- $this -> datagrid -> style = 'width: 100%';
- $this -> datagrid -> makeScrollable();
- $this -> datagrid -> setHeight(300);
- // add the columns
- $this -> datagrid -> addQuickColumn('#', 'IdPessoa', 'right', '5%');
- $this -> datagrid -> addQuickColumn('Nome', 'name', 'left', '20%');
- $this -> datagrid -> addQuickColumn('Data Nasc', 'dataNasc', 'left', '8%');
- $this -> datagrid -> addQuickColumn('Estado Cívil', 'civil', 'left', '10%');
- $this -> datagrid -> addQuickColumn('Genero', 'genero', 'left', '8%');
- $this -> datagrid -> addQuickColumn('CPF', 'cpf', 'left', '7%');
- $this -> datagrid -> addQuickColumn('RG / CNH', 'rg', 'left', '10%');
- $this -> datagrid -> addQuickColumn('Telefone', 'telefone', 'left', '10%');
- $this -> datagrid -> addQuickColumn('Celular', 'celular', 'left', '10%');
- $this -> datagrid -> addQuickColumn('E-mail', 'email', 'left', '10%');
- $this -> datagrid -> addQuickColumn('Site', 'site');
- $this -> datagrid -> addQuickColumn('Cep', 'cep', 'left', '10%');
- $this -> datagrid -> addQuickColumn('Logradouro', 'logradouro');
- $this -> datagrid -> addQuickColumn('Número', 'numero');
- $this -> datagrid -> addQuickColumn('Bairro', 'bairro');
- $this -> datagrid -> addQuickColumn('UF', 'uf');
- $this -> datagrid -> addQuickColumn('Cidade', 'cidade');
- $this -> datagrid -> addQuickColumn('Tipo Endereço', 'tipoEndereco');
- $this -> datagrid -> addQuickColumn('Complemento', 'complemento');
- // add the actions
- $this -> datagrid -> addQuickAction('Input', new TDataGridAction( array($this, 'onInputDialog')), 'name', 'fa:external-link');
- // creates the datagrid model
- $this -> datagrid -> createModel();
- // wrap the page content using vertical box
- $vbox = new TVBox;
- $vbox -> add(new TXMLBreadCrumb('menu.xml', __CLASS__));
- $vbox -> add($this -> datagrid);
- parent::add($vbox);
- }
- /**
- * Load the data into the datagrid
- */
- function onReload($param = null) {
- try {
- parent::setDatabast('sgvo');//abre a transação
- //cria o repositorio Pessoa
- $rep_pessoa = new TRepository('Pessoa');
- $limit = 10;
- //cria o critério de seleção
- $criteria = new TCriteria;
- $criteria -> setProperties($param);//oredr, offsset
- $criteria -> setProperty('limit', $limit);
- //carrega os objetos
- $obj = $rep_pessoa -> load($criteria);
- //limpa a datagrid
- $this -> datagrid -> clear();
- if ($obj) {
- //percorre a coleção de Active Records
- foreach ($obj as $object) {
- //adiciona o objeto na datagrid
- $this -> datagrid -> addItem($object);
- }
- }
- //conta o total de registros
- $criteria -> resetProperties();
- $count = $rep_pessoa -> count($criteria);
- $this -> pageNavigation -> setCount($count); // count of records
- $this -> pageNavigation -> setProperties($param); // order, page
- $this -> pageNavigation -> setLimit($limit);// limit
- // close the transaction
- TTransaction::close();
- $this -> loaded = true;
- } catch(Exception $e) {
- new TMessage('error',$e->getMessage());
- TTransaction::rollback();
- }
- }
- /**
- * Terminar adaptação
- * Open an input dialog
- */
- public function onInputDialog($param) {
- $nome = new TEntry('nome');
- $cpf = new TEntry('cpf');
- $name -> setValue($param['key']);
- $form = new TForm('input_form');
- $form -> style = 'padding:20px';
- $table = new TTable;
- $table -> addRowSet(new TLabel('Nome: '), $name);
- $table -> addRowSet($lbl = new TLabel('CPF: '), $cpf);
- $lbl -> setFontColor('red');
- $form -> setFields(array($nome, $cpf));
- $form -> add($table);
- // show the input dialog
- $action = new TAction( array($this, 'onConfirm'));
- $action -> setParameter('stay-open', 1);
- new TInputDialog('Input dialog', $form, $action, 'Confirm');
- }
- /**
- * Show the input dialog data
- */
- public static function onConfirm($param) {
- if (isset($param['amount']) AND $param['amount'])// validate required field
- {
- new TMessage('info', "Name: " . $param['name'] . ';Amount: ' . $param['amount'], new TAction( array('ClienteFisicoForm', 'onReload')));
- } else {
- new TMessage('error', 'Amount is required');
- }
- }
- /**
- * shows the page
- */
- function show() {
- if ($this->loaded) {
- $this->onReload();
- }
- parent::show();
- }
- }
- ?>
Porém não carrega nada e também não da erro algum /
Alguém poderia me dar uma luz.
Obs.: estou utilizando banco de dados Mysql, Adianti studio v.40
No aguardo,
desde já obrigado.
Na base de dados tem algum registro na tabela pessoa?
Porque pessoa física não é um atributo de pessoa (uma coluna dentro da tabela pessoa)?
Em pessoa endereço está faltando uma referência a endereço, não (IdEndereço)?
A função onReload não está sendo executada. Imagino que o problema esteja na função show. O "if($this->loaded)" sempre retorna false e com isso a função onReload não é chamada. É necessário alterar o if, adicionando a negação (!):
Outra coisa, sugiro alterar o nome da classe para ClienteFisicoList por tratar-se de uma grid e não de um formulário. Além disso, como essa classe é simples, não há a necessidade de reeescrever as funções onReload e show, basta herdar a classe padrão TStandardList.
Alexandre,
Sim a tabela pessoa esta populada,
Quanto ao IdEndereco também esta adicionado.
*******************************************************
Nataniel,
Fiz a alteração conforme mencionou, porém ainda não carrega os dados das tabelas relacionadas, Só esta carregando informações da tabela pessoa.
Acho que há alguma confusão nos relacionamentos. Você está usando o model Pessoa como repositório para carregamento da grid, mas não há nenhum relacionamento nesse model.
Então,
Sei que o objetivo aqui não é ensinar a programar, porém realmente não estou conseguindo entender,
Tem como dar uma luz de como fazer para que funcione.
Rubens, nesse caso acho que o mais simples seria criar uma view no banco de dados trazendo as informações de todas tabelas em uma consulta. Depois você cria um model para essa view e utiliza esse novo model como repositório da função onReload.
Nataniel,
Eu comprei o livre na esperança de haveria um exemplo completo de como fazer, porém .... tudo em pedaço.....
Não tem um modelo completo .... decepção.
Mas valeu pela atenção vou continuar tentando.....
obrigado
Ola, a todos,
Então eu ainda não consegui carregar os dados de tabelas relacionadas como citado no post , será que alguém poderia me ajudara identificar o problema.
Ola a todos,
Pessoa venho aqui mais uma vez pedir ajuda de vocês, pois não estou conseguindo carregar de tabela relacionadas em uma datagrid.
segue classe com os relacionamentos.
Classe que monta o datagrid.
Alguém pode me ajudar a identificar o problema ?
Rubens, vou passar um exemplo básico de relacionamento entre pessoa e cidade, depois você tenta adaptar à sua necessidade:
Nataniel,
Então, fiz as alterações conforme mencionou, porém nada....
//get pessoa_fisica
public function get_pessoa()
{
if (empty($this->pessoa))
$this->pessoa = new Pessoa($this->IdPessoa);
// returns the associated object
return $this->pessoa;
}
agora da a seguinte mensagem : Tentaiva de acesso a uma propriedade inexisten(pessoa->DataNascimeto).
Não consegui identificar o erro, ta virando uma saga.......
Ola a todos,
Na tentativa de resolver o problema citado acima, alterei o banco e geri novas classes pelo adianti pro, porém sem sucesso.
Alguém pode me ajudar /
Segue classe geradas pelo adianti.
pagina onde estou tentando carregar a grid.
Desde já obrigado pela atenção.
Rubens, acredito que o relacionamento entre pessoa e pessoa física deve ser uma associação e não uma composição ou agregação. Do jeito que está uma pessoa pode ter várias pessoas físicas vinculadas. Não sei se essa foi sua intenção mas na minha visão está incorreto.
E também, para que o relacionamento funcione na grid, você precisa ter uma função correspondente no model. Por exemplo:
Você tem que criar a função get_pessoa_fisicas no model Pessoa retornando a instância do objeto relacionado, que nesse caso seria PessoaFisica.
Nataniel,
Então alterei a classe conforme citou acima, porém sem sucesso.
Segue abaixo:
trecho Datagrid
Na função get_pessoa_fisica você está utilizando um atributo inexistente. O $this->pessoa_id não existe nessa tabela. Imagino que seja uma coluna da tabela pessoa_fisica. Nesse caso você vai ter que fazer outro tipo de consulta:
E na grid deveria ser:
Nataniel , bom dia,
Então, sei qual é o problema, mas simplesmente só carrega os dados da tabela principal ( Pessoa)
Segue todo o código que gerei novamente pelo assistente.
Model Pessoa.
PessoaFisica
Trecho alterado data grid
Não funcionou ...