Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Dificuldade em filtrar itens combo dinâmico Olá, galera Quero carregar itens no combo 2 conforme a categoria do combo 1, porém não estou conseguindo identificar onde estou errando na hora de fazer o filtro, alguém pode me ajudar ? Segue abaixo fonte que setou utilizando. ...
RB
Dificuldade em filtrar itens combo dinâmico  
Olá, galera

Quero carregar itens no combo 2 conforme a categoria do combo 1, porém não estou conseguindo identificar onde estou errando na hora de fazer o filtro, alguém pode me ajudar ?

Segue abaixo fonte que setou utilizando.
  1. <?php
  2.         //adciona criterio de filtro categoria natureza juridica
  3.     $filter = new TCriteria;
  4.         $filter->add(new TFilter('id''<''4'));
  5.     
  6.         //categoria juridica
  7.     $natureza_categoria    = new TDBCombo('natureza_categoria_id','xxxx','CategoriaNaturezaJuridica','id','descricao','descricao',$filter);
  8.     $natureza_categoria->setDefaultOption(false);
  9.     $natureza_categoria->setSize('width:100%');
  10.     $filter1 = new TCriteria;
  11.         $filter1->add(new TFilter('categoria_id''=',$natureza_categoria));
  12.         
  13.         //natureza juridica
  14.         $cod_nat_juridica = new TDBCombo('natureza_juridica_id','centinel','NaturezaJuridica','id','codigo_descricao',$filter1);
  15.         $cod_nat_juridica->setDefaultOption(false);
  16.         $cod_nat_juridica->setChangeAction( new TAction( array($this'NaturezaJuridica')) );
  17.            //metodo NaturezaJuridica
  18.          public static function NaturezaJuridica($param)
  19.     {
  20.         try
  21.         {
  22.             TTransaction::open('xxxxx');
  23.             if ($param['natureza_categoria_id'])
  24.             {
  25.                 $criteria TCriteria::create( ['categoria_id ' => $param['natureza_categoria_id'] ] );
  26.                 
  27.                 // formname, field, database, model, key, value, ordercolumn = NULL, criteria = NULL, startEmpty = FALSE
  28.                 TDBCombo::reloadFromModel('frm_empresa''categoria_id''centinel''NaturezaJuridica''id''{descricao} ({id})''descricao'$criteriaTRUE);
  29.             }
  30.             else
  31.             {
  32.                 TCombo::clearField('frm_empresa''natureza_juridica_id');
  33.             }
  34.             
  35.             TTransaction::close();
  36.         }
  37.         catch (Exception $e)
  38.         {
  39.             new TMessage('error'$e->getMessage());
  40.         }
  41.     }
  42. ?>


Model Categoria

  1. <?php
  2. /**
  3.  * NaturezaJuridica Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class NaturezaJuridica extends TRecord
  7. {
  8.     const TABLENAME 'natureza_juridica';
  9.     const PRIMARYKEY'id';
  10.     const IDPOLICY =  'serial'// {max, serial}
  11.     
  12.     
  13.     private $categoria_natureza_juridica;
  14.     private $juridica;
  15.     /**
  16.      * Constructor method
  17.      */
  18.     public function __construct($id NULL$callObjectLoad TRUE)
  19.     {
  20.         parent::__construct($id$callObjectLoad);
  21.         parent::addAttribute('codigo_descricao');
  22.         parent::addAttribute('categoria_id');
  23.     }
  24.     
  25.     /**
  26.      * Method set_categoria_natureza_juridica
  27.      * Sample of usage: $natureza_juridica->categoria_natureza_juridica = $object;
  28.      * @param $object Instance of CategoriaNaturezaJuridica
  29.      */
  30.     public function set_categoria_natureza_juridica(CategoriaNaturezaJuridica $object)
  31.     {
  32.         $this->categoria_natureza_juridica $object;
  33.         $this->categoria_natureza_juridica_id $object->id;
  34.     }
  35.     
  36.     /**
  37.      * Method get_categoria_natureza_juridica
  38.      * Sample of usage: $natureza_juridica->categoria_natureza_juridica->attribute;
  39.      * @returns CategoriaNaturezaJuridica instance
  40.      */
  41.     public function get_categoria_natureza_juridica()
  42.     {
  43.         // loads the associated object
  44.         if (empty($this->categoria_natureza_juridica))
  45.             $this->categoria_natureza_juridica = new CategoriaNaturezaJuridica($this->categoria_natureza_juridica_id);
  46.     
  47.         // returns the associated object
  48.         return $this->categoria_natureza_juridica;
  49.     }
  50. ?>


Model CategoriaJuridica

  1. <?php
  2. /**
  3.  * CategoriaNaturezaJuridica Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class CategoriaNaturezaJuridica extends TRecord
  7. {
  8.     const TABLENAME 'categoria_juridica';
  9.     const PRIMARYKEY'id';
  10.     const IDPOLICY =  'serial'// {max, serial}
  11.     /**
  12.      * Constructor method
  13.      */
  14.     public function __construct($id NULL$callObjectLoad TRUE)
  15.     {
  16.         parent::__construct($id$callObjectLoad);
  17.         parent::addAttribute('descricao');
  18.     }
  19. }
  20. ?>



desde já obrigado pela atenção.




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


AM

Olá Rubens,

Dê uma olhada em:

https://www.adianti.com.br/framework_files/tutor/index.php?class=FormInteraction
NR

Tá faltando 1 parâmetro na segunda instância da TDBCombo, linha 15
MC

Experimente primeiro deixar o $filter1 em branco para mudar de acordo com o combo 2
  1. <?php
  2.  $filter1 = new TCriteria;
  3.  $filter1->add(new TFilter('categoria_id''<',$natureza_categoria'0'));
  4. ?>


na linha 35 tente
  1. <?php
  2.  TCombo::clearField('frm_empresa''Categoria_id');
  3. ?>

Boa sorte
MC

Experimente primeiro deixar o $filter1 em branco para mudar de acordo com o combo 2
$filter1 = new TCriteria;
$filter1->add(new TFilter('categoria_id', '<', '0'));


na linha 35 tente

TCombo::clearField('frm_empresa', 'categoria_id');

Boa sorte
RB

Miuller,

fiz como indicou porém combo dois não carrega nenhum item.

Só lembrando que a ordem é seleciona item combo 1 e carrega combo 2 conforme item combo um.



//Trecho alterado

  1. <?php
  2.    ............
  3. //categoria juridica combo 1
  4.         $natureza_categoria = new TDBCombo('natureza_categoria_id','centinel','CategoriaNaturezaJuridica','id','descricao','descricao');
  5. //combo dois
  6.                 $filter1 = new TCriteria
  7.         $filter1->add(new TFilter('categoria_id''<'0));  
  8.         
  9.         //natureza juridica
  10.         $cod_nat_juridica = new TDBCombo('natureza_juridica_id','centinel','NaturezaJuridica','id','codigo_descricao','codigo_descricao',$filter1);
  11.         
  12.         $cod_nat_juridica->setChangeAction( new TAction( array($this'NaturezaJuridica')) );
  13. ..................
  14.    if ($param['natureza_categoria_id'])
  15.             {
  16.                 $criteria TCriteria::create( ['categoria_id ' => $param['natureza_categoria_id'] ] );
  17.                 
  18.                 //formname, field, database, model, key, value, ordercolumn = NULL, criteria = NULL, startEmpty = FALSE
  19.                 TDBCombo::reloadFromModel('frm_empresa''categoria_id''centinel''NaturezaJuridica''id''{descricao} ({id})''descricao'$criteriaTRUE);
  20.             }
  21.             else
  22.             {
  23.                  TCombo::clearField('frm_empresa''categoria_id'); 
  24.             }
  25. ?>

MC

Primeiramente a mensagem de erro que vc mandou o print na tela diz que está ocorrendo um erro de sql, ou seja, a combo não está conseguindo filtrar(not be converted to string), estava faltando um parâmetro na sua combo.

Reescrevi o código das combos para facilitar o entendimento
  1. <?php
  2. //combo 1(master)
  3. $natureza_categoria_id =  new TDBCombo('natureza_categoria_id' ,'centinel','CategoriaNaturezaJuridica','id','descricao'       ,'descricao asc'                  );
  4. //combo 2 (detail)
  5. $natureza_juridica_id  =  new TDBCombo('natureza_juridica_id'  ,'centinel','NaturezaJuridica'         ,'id','codigo_descricao','codigo_descricao asc',$filter1  );
  6. ?>

Segundo, sua combo1 tem nome, se chama natureza_categoria_id, então o parâmetro da primeira combo se chama "natureza_categoria_id", com isso sua function vai ordenar a segunda combo(natureza_juridica_id) de acordo com a primeira, abaixo tentei reescrever o código, observe o nome das combos

  1. <?php
  2. try
  3.    {
  4.       TTransaction::open('centinel'); //base de dados
  5.       if ($param['natureza_categoria_id'])//se existe parâmetro da primeira combo(nome da primeira combo)
  6.          {
  7.             $criteria TCriteria::create( ['categoria_id' => $param['natureza_categoria_id'] ] );  //categoria id = parametro chave estrangeira da tabela master       
  8.                                                               // formname  ,  field(nome do campo) , database    , nome da model     , key ,    value        , ordercolumn = NULL, criteria, startEmpty = FALSE
  9.             TDBCombo::reloadFromModel('frm_empresa''natureza_juridica_id''centinel'      'NaturezaJuridica'   'id'  '{descricao}''id',               $criteria,        TRUE);
  10.         }
  11.         else
  12.         {
  13.           TCombo::clearField('frm_empresa''natureza_categoria_id'); //reload do formulario frm_empresa na segunda combo "natureza_juridica_id"
  14.         }
  15.      }  
  16. ?>


Não testei, mas a lógica é essa, se não der certo me manda um email que eu te envio um exemplo de código estado x cidade. boa sorte
RB

Miuller,

Mais uma vez obrigado pela atenção,alterei conforme indicou mas sem sucesso.

simplesmente não carrega os dados do combo 2, nem da erro.

<a href="attach/3991/Captura de tela de 2017-12-12 14-04-38.png">Captura de tela de 2017-12-12 14-04-38.png</a>
RB

Miuller,

Consegui resolver, estava cometendo um amadorismo na hora de atribuir a ação a categoria.

  1. <?php
  2. ...................
  3. //adciona criterio de filtro categoria natureza juridica
  4.           $filter = new TCriteria;
  5.         $filter->add(new TFilter('id''<''4'));
  6.         //combo 1(master)
  7.         $categoria_juridica_id =  new TDBCombo('categoria_juridica_id' ,'centinel','CategoriaJuridica','id','descricao','descricao asc',$filter);
  8.         $categoria_juridica_id->setDefaultOption(false);
  9.         $categoria_juridica_id->setChangeAction( new TAction( array($this'onChangeAction')) );
  10.         $filter1 = new TCriteria
  11.         $filter1->add(new TFilter('id''<','0'));  
  12.         
  13.         //combo 2 (detail)
  14.         $natureza_juridica_id  =  new TDBCombo('natureza_juridica_id','centinel','NaturezaJuridica','id','codigo_descricao','codigo_descricao asc',$filter1);
  15. static function onChangeAction($param)
  16.     {
  17.         try
  18.            {
  19.               TTransaction::open('centinel'); //base de dados
  20.               if ($param['categoria_juridica_id'])//se existe parâmetro da primeira combo(nome da primeira combo)
  21.              {
  22.                $criteria TCriteria::create( ['categoria_juridica_id' => $param['categoria_juridica_id'] ] );  
  23.                 //$criteria = new TCriteria;
  24.                 //$criteria->add(new TFilter('categoria_juridica_id', '=', $param['categoria_juridica_id'])); 
  25.                 
  26.                 //categoria_juridica_id = parametro chave estrangeira da tabela master       
  27.                    // formname,field(nome do campo),database , nome da model,key,value,ordercolumn = NULL,criteria, startEmpty = FALSE
  28.                 TDBCombo::reloadFromModel('frm_empresa','natureza_juridica_id','centinel','NaturezaJuridica','id','{codigo_descricao}''codigo_descricao',$criteria,TRUE);
  29.             }
  30.             else
  31.             {
  32.               TCombo::clearField('frm_empresa''natureza_juridica_id'); //reload do formulario frm_empresa na segunda combo "natureza_juridica_id"
  33.             }
  34.              TTransaction::close();
  35.         }
  36.         catch (Exception $e)
  37.         {
  38.             new TMessage('error'$e->getMessage());
  39.         }  
  40.     }
  41. ?>


Valeu pela força.