Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Alterar um TCriteria para campos tipo TDB em tempo de execução Olá, gostaria de saber se é possível (e como) alterar o TCriteria para um campo do tipo TDBMultiSearch em tempo de execução? Exemplo: Tenho um TDBMultiSearch que usa um determinado criterio para buscar informações no banco, porém quando o usuário seleciona uma opção (em um radio ou combo, por exemplo) esse critério de busca deveria ser alterado conforme a opção escolhida pelo usuá...
RB
Alterar um TCriteria para campos tipo TDB em tempo de execução  
Olá, gostaria de saber se é possível (e como) alterar o TCriteria para um campo do tipo TDBMultiSearch em tempo de execução?
Exemplo:
Tenho um TDBMultiSearch que usa um determinado criterio para buscar informações no banco, porém quando o usuário seleciona uma opção (em um radio ou combo, por exemplo) esse critério de busca deveria ser alterado conforme a opção escolhida pelo usuário.
Pelo que entendi precisaria fazer uma espécie de reload do campo TDBMultiSearch (ou excluir e criá-lo novamente em tempo de execução), porém não consegui obter êxito nas minhas tentativas até o momento.
Se alguém tiver alguma sugestão agradeço.
Editado 02/06/2022 (há 1 ano) - Clique para ver alterações

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 (5)


IF

Bom dia.
Já tentou isso? https://framework.adianti.me/tutor/index.php?class=FormInteractionsView
RB

Valeu Ivan, porém para campo do tipo TDBMultiSearch essa lógica não se aplica para minha necessidade, pois eu preciso alterar os critérios para fazer a busca e não os valores do campo.
NR

Tente o seguinte:
1 - ao trocar as opções do radio/combo, grave os dados referentes aos filtros na sessão
2 - crie uma classe copiando AdiantiMultiSearchService e altere a parte dos filtros para considerar os dados da sessão salvos no passo 1
3 - defina essa nova classe como a responsável pelo preenchimento dos dados. Ex:
  1. <?php
  2. $campo = new TDBMultiSearch(....);
  3. $campo->setService('ClasseCriada');
  4. ?>


IF

Se a base de dados não for muito extensa, eu já usei assim, preenchendo a matriz em tempo de execução. Pra mim , funcionou

  1. <?php
  1. <?php
  2. class Teste extends TPage
  3. {
  4.     protected $form// form
  5.     protected $detail_list;
  6.     
  7.     /**
  8.      * Page constructor
  9.      */
  10.     public function __construct()
  11.     {
  12.         parent::__construct();
  13.         
  14.         $this->form = new BootstrapFormBuilder('form_teste');
  15.         $this->form->setFormTitle('Teste de TCriteria');
  16.         $this->form->setFieldSizes('100%');
  17.         
  18.         $opcoes = new TCombo('opcoes');
  19.         $itens_opcoes = array(
  20.             '1' => 'Criteria 1',
  21.             '2' => 'Criteria 2'
  22.         );
  23.         $opcoes->addItems($itens_opcoes);
  24.         
  25.         $opcoes->setChangeAction(new TAction([$this,'onChange']));
  26.         
  27.         $favorecido = new TUniqueSearch('favorecido''money''favorecidos''id''nome''nome'); //Não precisa definir o criteria agora
  28.         $favorecido->setMinLength(1);
  29.         
  30.         $this->form->addFields([ new TLabel('Opções:')],[ $opcoes ]);
  31.         $this->form->addFields([ new TLabel('Favorecido:')],[ $favorecido ]);
  32.         
  33.         parent::add($this->form);
  34.     }
  35.     
  36.     
  37.     
  38.     public static function onChange$param 
  39.     {
  40.         $opcao $param['opcoes'];
  41.         
  42.         TTransaction::open('money');
  43.         
  44.         if ($opcao == 1//Filtra registros com id menor que 30
  45.         {
  46.             $criteria1 = new TCriteria();
  47.             $criteria1->add( new TFilter('id''<''30'));
  48.             
  49.             $repository = new TRepository('Favorecidos');
  50.             $favorecidos $repository->load($criteria1);
  51.                    
  52.             $registros = array();
  53.             foreach ($favorecidos as $row
  54.             { 
  55.                 $registros[$row->id] = $row->nome;
  56.             }   
  57.         }
  58.         
  59.         if ($opcao == 2//Filtra Registros com id maior que 30
  60.         {
  61.             $criteria1 = new TCriteria();
  62.             $criteria1->add( new TFilter('id''>''30')); 
  63.             
  64.             $repository = new TRepository('Favorecidos');
  65.             $favorecidos $repository->load($criteria1);
  66.                    
  67.             $registros = array();
  68.             foreach ($favorecidos as $row
  69.             { 
  70.                 $registros[$row->id] = $row->nome;
  71.             }   
  72.         }
  73.       
  74.         TTransaction::close();
  75.       
  76.         TCombo::reload('form_teste','favorecido'$registros);          //Nome do form, campo a ser preenchido, registros selecionados            
  77.     }
  78.     
  79. }
  80. ?>
PD

Olá,

Estamos trabalhando para que na próxima versão seja possível definir partes do critério dinâmicas, que são alimentadas a partir de variáveis de sessão, que possam ser modificadas em tempo de execução.