Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Combos dinamicamente em formulário Boa tarde, Tenho um formulário com 3 TDCombo, onde cada um depende do outro dinamicamente. Ao selecionar um fornecedor, será exibido no combo 2 a lista de contratos desse fornecedor. E ao selecionar um contrato, será mostrado os produtos desse contrato. A questão é que o primeiro passo já consegui, mas ao selecionar o contrato no segundo combo não tem nenhuma ação com o setChangeAct...
CJ
Combos dinamicamente em formulário  
Boa tarde,

Tenho um formulário com 3 TDCombo, onde cada um depende do outro dinamicamente. Ao selecionar um fornecedor, será exibido no combo 2 a lista de contratos desse fornecedor. E ao selecionar um contrato, será mostrado os produtos desse contrato.

A questão é que o primeiro passo já consegui, mas ao selecionar o contrato no segundo combo não tem nenhuma ação com o setChangeAction

function __construct($param) { parent::__construct(); // creates the form $this->form = new TForm('form_EntradaCereais'); $panel_master = new TPanelGroup( 'Entrada - Cereais' ); $vbox = new TVBox; $vbox->style = 'width: 100%'; $this->form->add($panel_master); $panel_master->add($vbox); $frame_general = new TFrame; $frame_general->class = 'tframe tframe-custom'; $frame_general->setLegend('Dados da Nota Fiscal'); $frame_general->style = 'background:whiteSmoke'; $table_general = new TTable; $table_general->width = '100%'; $frame_general->add($table_general); // products $frame_product = new TFrame; $frame_product->class = 'tframe tframe-custom'; $frame_product->setLegend('Produtos'); $table_product = new TTable; $frame_product->add($table_product); $vbox->add( $frame_general ); $vbox->add( $frame_product ); $criterio = new TCriteria; $criterio->add( new TFilter('grupo_id', '=', 1)); // master fields $id = new TEntry('id'); $fornecedor_id = new TDBCombo('fornecedor_id', 'nutricao', 'Fornecedor', 'id', 'nome', 'nome', $criterio); $contrato_id = new TCombo('contrato_id'); // detail fields $produto_id = new TDBCombo('produto_id', 'nutricao', 'Produto', 'id', 'nome', 'nome', $criterio); $und = new TEntry('und'); $valor_unit = new TEntry('valor_unit'); $quantidade = new TEntry('quantidade'); $saldo = new TEntry('saldo'); $numero = new TEntry('numero'); $numero = $contrato_id->getValue(); $valor_unit->setNumericMask(2, ',', '.', true); $quantidade->setNumericMask(2, ',', '.', true); $saldo->setNumericMask(2, ',', '.', true); $id->setSize('10%'); $produto_id->setSize('100%'); $und->setSize('100%'); $fornecedor_id->setSize('100%'); $produto_id->enableSearch(); $fornecedor_id->enableSearch(); $id->setEditable(false); $und->setEditable(false); $valor_unit->setEditable(false); $saldo->setEditable(false); $fornecedor_id->addValidation('Fornecedor', new TRequiredValidator); $contrato_id->addValidation('Contrato', new TRequiredValidator); $table_general->addRowSet( new TLabel('Id'), $id ); $table_general->addRowSet( new TLabel('Fornecedor', 'red'), $fornecedor_id ); $table_general->addRowSet( new TLabel('Contrato/Ano', 'red'), [$contrato_id] ); $table_general->addRowSet( new TLabel('Contrato/Ano', 'red'), [$numero] ); $add_product = new TButton('add_product'); $action_product = new TAction(array($this, 'onProductAdd')); $add_product->setAction($action_product, 'Adicionar'); $add_product->setImage('bs:plus-sign green'); $table_product->add( new TLabel('Produto', 'red')); $table_product->add( $produto_id); $change_action1 = new TAction(array($this, 'onChangeForn')); $fornecedor_id->setChangeAction($change_action1); $contrato_id->setChangeAction(new TAction(array($this, 'onChangeContrato'))); $produto_id->setChangeAction(new TAction(array($this,'onProductChange'))); $row = $table_product->addRow(); $row->addCell(new TLabel('Unidade')); $row->addMultiCell( $und, new TLabel('Preço'), $valor_unit, new TLabel('Saldo'),$saldo); $row->addCell(new TLabel('Quantidade', 'red')); $row->addCell($quantidade); $table_product->addRowSet( $add_product ); $this->product_list = new TQuickGrid; $this->product_list->style = "margin-bottom: 10px; width: 100%"; $this->product_list->disableDefaultClick(); $this->product_list->addQuickColumn('', 'edit', 'center', 10); $this->product_list->addQuickColumn('', 'delete', 'center', 10); $this->product_list->addQuickColumn('Id', 'produto_id', 'right', 40); $this->product_list->addQuickColumn('Produto', 'nome', 'left', 200); $this->product_list->addQuickColumn('Unidade', 'und', 'left', 20); $qt = $this->product_list->addQuickColumn('Quantidade', 'quantidade', 'right', 30); $pr = $this->product_list->addQuickColumn('Preço','valor_unit', 'right', 70); $st = $this->product_list->addQuickColumn('Subtotal','={quantidade} * {valor_unit}', 'right', 80); $this->product_list->createModel(); $vbox->add( $this->product_list ); $format_numero = function($value) { if (is_numeric($value)) { return number_format($value, 2, ',', '.'); } return $value; }; $format_value = function($value) { if (is_numeric($value)) { return 'R$ '.number_format($value, 2, ',', '.'); } return $value; }; $qt->setTransformer( $format_numero ); $pr->setTransformer( $format_value ); $st->setTransformer( $format_value ); $st->setTotalFunction( function($values) { return array_sum((array) $values); }); $list_button=new TButton('Lista'); //$list_button->setAction(new TAction(array('ContratoCereaisList', 'onReload')), 'Listagem de Contratos'); $list_button->setImage('fa:table blue'); $save_button = TButton::create('save', array($this, 'onSave'), 'Salvar', 'fa:save green'); $new_button = TButton::create('new', array($this, 'onClear'), 'Limpar', 'fa:eraser red'); $this->formFields = array($id, $fornecedor_id, $contrato_id, $produto_id, $und, $valor_unit, $quantidade, $add_product, $save_button, $new_button, $list_button); $this->form->setFields( $this->formFields ); $panel_master->addFooter( THBox::pack($save_button, $new_button, $list_button) ); $container = new TVBox; $container->style = 'width: 100%'; $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__)); $container->add($this->form); parent::add($container); } static function onChangeContrato( $param ) { echo "teste"; var_dump($param); } static function onChangeForn( $param ) { if( isset($param['fornecedor_id']) && $param['fornecedor_id'] ) { try { TTransaction::open('nutricao'); $criteria = new TCriteria; $criteria->add(new TFilter('fornecedor_id', '=', $param['fornecedor_id'])); $criteria->add(new TFilter('ano', '=', TSession::getValue('ano'))); $repository = new TRepository('Contrato'); $objects = $repository->load( $criteria ); $contratos = array(); foreach ($objects as $object) { $contratos[ $object->fornecedor_id ] = $object->fornecedor_id; } $resultado = array(); if (!empty($contratos)) { $criterio = new TCriteria; $criterio->add(new TFilter('id', 'IN', $contratos)); $repo = new TRepository('Contrato'); $obj = $repo->load( $criterio ); foreach ($obj as $object) { $resultado[ $object->id ] = $object->contrato .'/' . $object->ano; } } TCombo::reload('form_EntradaCereais', 'contrato_id', $resultado); TTransaction::close(); } catch (Exception $e) // in case of exception { new TMessage('error', '<b>Error</b> ' . $e->getMessage()); TTransaction::rollback(); } } } static function onProductChange( $params ) { if( isset($params['produto_id']) && $params['produto_id'] ) { try { TTransaction::open('nutricao'); $product = new Produto($params['produto_id']); $criteria = new TCriteria( new TFilter('produto_id', '=', '')); $dados_produto = new TRepository('ContratoItem'); $dados_produto->load($criteria); $fill_data = new StdClass; $fill_data->und = $product->und; TForm::sendData('form_EntradaCereais', $fill_data); TTransaction::close(); } catch (Exception $e) // in case of exception { new TMessage('error', '<b>Error</b> ' . $e->getMessage()); TTransaction::rollback(); } } }


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)


CJ

Ao selecionar o combo de contrato, não executa a função onChangeContrato. No caso acima, nõa mostra "teste" na tela e nem o var_dump;
NR

Fiz um teste rápido aqui e funcionou. Chegou a verificar no console se aparece algum erro?
Outra coisa que achei estranha, o filtro para preencher a combo de contratos está correto na função onChangeForn?
  1. <?php
  2. //onChangeForn
  3. $contratos = array(); 
  4. foreach ($objects as $object
  5.        $contratos$object->fornecedor_id ] = $object->fornecedor_id
  6. $resultado = array(); 
  7. if (!empty($contratos)) 
  8.       $criterio = new TCriteria
  9.      // conferir, $contratos é um array contendo fornecedor_id, entao está procurando na tabela contratos por registros onde o id for igual a códigos de fornecedor, é isso mesmo? 
  10.      $criterio->add(new TFilter('id''IN'$contratos)); 
  11.       $repo = new TRepository('Contrato'); 
  12. ?>
CJ

Nataniel,

Realmente estava estranho, é o que dá copiar e colar, kkkk. Não sei o que era, mas modifiquei as outras funções e funcionou.

Obrigado

Ficou assim esse método:

if( isset($param['fornecedor_id']) && $param['fornecedor_id'] ) { try { TTransaction::open('nutricao'); $criteria = new TCriteria; $criteria->add(new TFilter('fornecedor_id', '=', $param['fornecedor_id'])); $criteria->add(new TFilter('ano', '=', TSession::getValue('ano'))); $repository = new TRepository('Contrato'); $contratos = $repository->load($criteria); $options[] = 'Selecione um contrato'; foreach ($contratos as $contrato) { $options[$contrato->id] = $contrato->contrato .'/' .$contrato->ano; } TCombo::reload('form_EntradaCereais', 'contrato_id', $options); TTransaction::close(); } catch (Exception $e) // in case of exception { new TMessage('error', '<b>Error</b> ' . $e->getMessage()); TTransaction::rollback(); } }
CJ

Mas agora estou com problemas ao adicionar um novo produto, pois os dados do contrato_id (combo 2) estão desaparecendo. Acredito que seja no onReload(). Como manter esses dados?
NR

https://www.adianti.com.br/forum/pt/view_1514?manter-combos-dependentes-preenchi