GJ
TRecord retorna os campos em branco
Bom dia, prezados.
Estou iniciando no adianti e, após ler o livro de capa a capa, criei uma classe pessoa, descendente de TRecord.
No banco de dados a tabela pessoa tem muito mais campos. Porém, para não dificultar o aprendizado, apenas explicitei conforme abaixo, dando o nome do arquivo de Pessoa.class.php. Essa classe tem a primary key denominada id e também tem um campo chamado codigo:
Criei uma classe controladora, descendente de TPage, registrei no sistema, dei permissão ao grupo, acrescentei no menu. Tudo certinho.
Ao chamar a classe, aparece o form exatamente como previsto. Porém, todos os registros vem com seus campos em branco.
Se eu chamo o count, vem a quantidade correta de registros com o filtro especificado. Nesse caso, os nomes que começam com Antônio.
Estou quebrando a cabeça há 3 dias.
Uso o SQL Server num ambiente windows com apache e PHP 7.0.13
Em tempo: se eu fizer uma consulta direta, do tipo listado abaixo, funciona normal. Ou seja, o que estou fazendo de errado na classe Pessoa?
Estou iniciando no adianti e, após ler o livro de capa a capa, criei uma classe pessoa, descendente de TRecord.
No banco de dados a tabela pessoa tem muito mais campos. Porém, para não dificultar o aprendizado, apenas explicitei conforme abaixo, dando o nome do arquivo de Pessoa.class.php. Essa classe tem a primary key denominada id e também tem um campo chamado codigo:
- <?php
- /**
- * Pessoa Active Record
- * @author Geazi
- */
- class Pessoa extends TRecord
- {
- const TABLENAME = 'pessoa';
- const PRIMARYKEY= 'id';
- const IDPOLICY = 'max'; // {max, serial}
- /**
- * Constructor method
- */
- public function __construct($id = NULL)
- {
- parent::__construct($id);
- parent::addAttribute('codigo');
- parent::addAttribute('nome');
- parent::addAttribute('cnpj');
- }
- }
- ?>
Criei uma classe controladora, descendente de TPage, registrei no sistema, dei permissão ao grupo, acrescentei no menu. Tudo certinho.
Ao chamar a classe, aparece o form exatamente como previsto. Porém, todos os registros vem com seus campos em branco.
Se eu chamo o count, vem a quantidade correta de registros com o filtro especificado. Nesse caso, os nomes que começam com Antônio.
- <?php
- class ExecuteManualConnection extends TPage
- {
- public function __construct()
- {
- parent::__construct();
- try
- {
- TTransaction::open('sinergia'); // abre uma transação
- TTransaction::setLogger(new TLoggerHTML('tmp/log_sinergia.html'));
- $criteria = new TCriteria;
- $criteria->add(new TFilter('nome', 'like', 'ANTONIO%'));
- $criteria->setProperty('limit', 30);
- $criteria->setProperty('order', 'codigo');
- $repository = new TRepository('pessoa');
- $pessoas = $repository->load($criteria);
- foreach ($pessoas as $pessoa)
- {
- echo $pessoa->nome . ' - ' . $pessoa->cnpj . '<br>';
- }
- TTransaction::close(); // close transaction
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- }
- }
- }
- ?>
Estou quebrando a cabeça há 3 dias.
Uso o SQL Server num ambiente windows com apache e PHP 7.0.13
Em tempo: se eu fizer uma consulta direta, do tipo listado abaixo, funciona normal. Ou seja, o que estou fazendo de errado na classe Pessoa?
- <?php
- TTransaction::open('sinergia');
- $conn = TTransaction::get();
- $result = $conn->query('SELECT ID, CODIGO, NOME, CNPJ FROM PESSOA' );
- foreach ($result as $pessoa)
- {
- print $pessoa['id'] . ' - ' . $pessoa['codigo'] . ' - ' .$pessoa['nome'] . "<br>\n";
- }
- TTransaction::close;
- catch (Exception $e)
- {
- new TMessage('Erro:', $e->getMessage());
- }
- ?>
Se o nome das colunas está em maiúsculo no banco, faça o teste declarando em maiúsculo no model e no control também.
Eu tive um problema semelhante há algum tempo. No meu caso resolveu escrevendo o parâmetro "LIKE" em maiúsculas.
Isso aconteceu na versão anterior do framework utilizando MySQL, não sei se foi resolvido na versão atual.
Nataniel, muito obrigado. Você matou a charada.
Mudei a declaração no model e no controle. Resolveu em parte. O campo codigo apareceu mas o campo nome continuava sem aparecer.
Inverti, fiz vários testes, com maiusculas, com minúsculas, e nada. As vezes um campo aparecia e outro não. Nunca todos de uma vez.
Então, resolvi radicalizar:
Mudei todos os nomes de campos da tabela pessoa no banco de dados, para minúsculas e as declarações para minúsculas.
E... voilà... funcionou.
Obrigado por ter dado uma idéia diferente para o problema, mostrando a luz no fim do túnel.
Para quem tiver um problema parecido e quiser saber como fiz no sql server, aqui vai: