Conheça as melhorias da versão 8.0, 8.1, 8.2!
Clique aqui para saber mais
AutoComplete - TEntry - Performance Pessoal, preciso de mais uma ajuda, ou dica. Tenho um formulário de solicitação de viagens, e preciso selecionar o Aeroporto de origem e destino. Fiz em uma primeira versão utilizando o TDBSeekButton, mas não atende muito minha necessidade, pois exibe apenas 1 coluna adicional com a informação, eu precisaria adicionar mais campos. Então resolvi utilizar o Auto Complete, fiz uma colu...
FW
AutoComplete - TEntry - Performance  
Fechado
Pessoal, preciso de mais uma ajuda, ou dica.

Tenho um formulário de solicitação de viagens, e preciso selecionar o Aeroporto de origem e destino.
Fiz em uma primeira versão utilizando o TDBSeekButton, mas não atende muito minha necessidade, pois exibe apenas 1 coluna adicional com a informação, eu precisaria adicionar mais campos.

Então resolvi utilizar o Auto Complete, fiz uma coluna no banco concatenada com o "IATA - Aeroporto - Cidade - País".
Funciona, porém com uma péssima performance, leva 3~5 segundos pra carregar o formulário.

Existe uma maneira mais eficiente para este caso?? Algo que eu possa melhorar?
A consulta retorna 8 mil registros.

 
  1. <?php
  2. $autoOrigem->setCompletion(array_values($this->onCargaAuto()));
  3. $autoDestino->setCompletion(array_values($this->onCargaAuto()));
  4. ?>

Função:
 
  1. <?php
  2. public static function onCargaAuto()
  3. {
  4. try
  5. {
  6. // open database transaction
  7. TTransaction::open('gestao_viagens');
  8. // items repository
  9. $repository = new TRepository('Aeroportos');
  10. // load all objects
  11. $collection = $repository->load(new TCriteria);
  12. // add the combo items
  13. $items = array();
  14. foreach ($collection as $object)
  15. {
  16. $items[$object->airport_id] = $object->autocomplete;
  17. }
  18. TTransaction::close();
  19. return $items;
  20. }
  21. catch (Exception $e)
  22. {
  23. new TMessage('error', '<b>Error:</b> ' . $e->getMessage());
  24. }
  25. }
  26. ?>


Obrigado.

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (4)


NR

Fernando, o TDBSeekButton só permite uma coluna, mas você pode utilizar o TSeekButton e customizar com as colunas que quiser.
Outra opção seria usar o TDBEntry que busca as informações no banco de dados de acordo com o que a pessoa for digitando, ou seja, não preenche os dados na criação do formulário, e sim de acordo com o que o usuário digitar.
E outra coisa, você está chamando 2 vezes a função onCargaAuto. Chame 1 vez só e coloque o retorno em uma variável, isso já deve melhorar o desempenho.
FW

Nataniel.

Chamei uma vez apenas o onCargaAuto, reduziu o tempo.

Tentei utilizar o TDBEntry e está dando um erro de javascript.

 
  1. <?php
  2. $autocomp = new TDBEntry('autocomp', 'gestao_viagens', 'Aeroportos', 'autocomplete');
  3. $this->form->addQuickField('Destino', $autocomp, 300);
  4. ?>


Uncaught SyntaxError: Unexpected token < in JSON at position 0 n.parseJSON - VM866:1 @ jquery.min.js?afver=201:4 transformResult @ jquery-plugins.min.js?afver=201:45 (anonymous function) @ jquery-plugins.min.js?afver=201:59 j @ jquery.min.js?afver=201:2 fireWith @ jquery.min.js?afver=201:2 x @ jquery.min.js?afver=201:4 (anonymous function) @ jquery.min.js?afver=201:4

FW

Nataniel,

Acabei de ver outro detalhe, quando entro no detalhe do erro, VM983:1, ele aparece o HTML de uma modal, com span dizendo: Permissão negada.

Será que preciso liberar alguma coisa?
FW

Nataniel.

Resolvido, habilitei na engine.php o AdiantiAutocompleteService.

Resolveu o problema, excelente performance.

Muito obrigado novamente pela ajuda.