Lançado Adianti Framework 8.1!
Clique aqui para saber mais
Como implementar busca de cidades Como posso fazer com que o campo de estado (TDBCombo) preencha os campos cidades (TDBMultiSearch), como faço no AJAX, preenchimento automático, quando escolho o Estado? $estado = new TDBCombo('estado', 'smart', 'Uf', 'id', 'ds_uf_sigla'); $criteria = new TCriteria; $criteria->add(new TFilter('id_uf', '=', 'Null')); $cidades = new TDBMult...
AL
Como implementar busca de cidades  
Fechado
Como posso fazer com que o campo de estado (TDBCombo) preencha os campos cidades (TDBMultiSearch), como faço no AJAX, preenchimento automático, quando escolho o Estado?

$estado = new TDBCombo('estado', 'smart', 'Uf', 'id', 'ds_uf_sigla');

$criteria = new TCriteria;
$criteria->add(new TFilter('id_uf', '=', 'Null'));

$cidades = new TDBMultiSearch('cidades', 'smart', 'Cidade', 'id', 'ds_cidade_nome', '', $criteria);
$cidades->setMinLength(2);
$cidades->setSize(280,30);

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


AL

Encontrei a solução, vou adicionar a function onExitAction no TCOMBO, e fazer a busca ao sair da seleção da combo!
FC

Só seguir esse exemplo
www.adianti.com.br/framework_files/tutor/index.php?class=FormInterac
AL

Felipe, tentei seguir este exemplo, percebi que o que estou usando é uma combo que após selecionar o estado, coloca as cidades que pertencem a ele em ou MultiSearch, para ficarem em um tipo texto, e depois salvo na base de dados como texto e não os IDs das cidades.
E no sistema não tem uma ExitAction para Combo, por isso implementei esta function na classe TBCombo, que é o que utilizo normalmente em meus sistemas com SELECT e AJAX, muito simples de usar.
Ainda não montei, mais vou ver se dá certo, certo?

Obrigado
FC

Então após vc selecionar o estado na combo use o evento onComboChange para carregar o TMultiSearch veja que o exemplo que te mostrei faz exatamente isso carrega a combo baseado numa escolha. No seu caso é só troca a Tcombo pelo TMultiSearch.
AL


Meu código inteiro do formulário é este!

Não estou entendendo aonde colocar o onComboChange?

  1. <?php
  2. class RegiaoFormDataGrid extends TPage
  3. {
  4.     private $form;
  5.     private $datagrid;
  6.     private $loaded;
  7.     
  8.     public function __construct()
  9.     {
  10.         parent::__construct();
  11.         
  12.         //cria formulário
  13.         $this->form = new TQuickForm('form_regiaogrid');
  14.         
  15.         //CSS Class
  16.         $this->form->class 'tform';
  17.         
  18.         //titulo do formulário
  19.         $this->form->setFormTitle('Regiões de Vendas');
  20.         
  21.         //Declara os Campos do formulário
  22.         $id = new TEntry('id');
  23.         $nome = new TEntry('nome_regiao');
  24.         $nome->addValidation('Nome da Região', new TRequiredValidator);
  25.         
  26.         $estado = new TDBCombo('estado''smart''Uf''id''ds_uf_sigla');
  27.            
  28.         $cidades = new TMultiSearch('cidades');
  29.         $cidades->setMinLength(2);
  30.         $cidades->setSize(280,30);
  31.         
  32.         //adiciona os campos no formulário
  33.         $this->form->addQuickField('ID'$id40 );
  34.         $this->form->addQuickField('Nome da Região'$nome240 );
  35.         $this->form->addQuickField('Estados'$estado100); 
  36.         $this->form->addQuickField('Cidades da Região'$cidades220);
  37.         
  38.         //define as ações de estados
  39.         $exit_action = new TAction(array($this'onChangeAction'));
  40.         $estado->setChangeAction($exit_action);     
  41.         
  42.         //define a ação do formulário
  43.         $this->form->addQuickAction('Salvar', new TAction(array($this'onSave')), 'ico_save.png');
  44.         $this->form->addQuickAction('Novo', new TAction(array($this'onClear')), 'ico_new.png');
  45.         
  46.         //torna o campo não editável
  47.         $id->setEditable(FALSE);
  48.         
  49.         //instancia objeto datagrid
  50.         $this->datagrid = new TQuickGrid;
  51.         $this->datagrid->style 'width: 100%';
  52.         $this->datagrid->setHeight(320);
  53.         
  54.         //adiciona as colunas
  55.         $this->datagrid->addQuickColumn('ID''id''center'50, new TAction(array($this'onReload')), array('order''id'));
  56.         $this->datagrid->addQuickColumn('Nome da Região''nome_regiao''left'250, new TAction(array($this'onReload')), array('order''nome_regiao'));
  57.         $this->datagrid->addQuickColumn('Estado''uf''center'20, new TAction(array($this'onReload')));
  58.         $this->datagrid->addQuickColumn('Cidades da Região''cidades' 'center'400, new TAction(array($this'onReload')));
  59.         //adiciona ações
  60.         $this->datagrid->addQuickAction('Editar', new TDataGridAction(array($this'onEdit')), 'id''ico_edit.png');
  61.         $this->datagrid->addQuickAction('Deletar', new TDataGridAction(array($this'onDelete')), 'id''ico_delete.png');
  62.         
  63.         //cria a estrutura do Datagrid
  64.         $this->datagrid->createModel();
  65.         
  66.         //Cria um container para os objetos
  67.         $vbox = new TVBox;
  68.         $vbox->add($this->form);
  69.         parent::add($vbox);
  70.         
  71.         $vbox1 = new TVBox;
  72.         $vbox1->add($this->datagrid);
  73.         parent::add($vbox1);
  74.     }
  75.     function show()
  76.     {
  77.         if (!$this->loaded)
  78.         {
  79.             $this->onReloadfunc_get_arg(0) );
  80.         }
  81.         parent::show();
  82.     }
  83.     public static function onChangeAction($param)
  84.     {
  85.     
  86.         $key $param['key'];    
  87.         
  88.         TTransaction::open('smart');    
  89.         
  90.         $criteria = new TCriteria;
  91.         $criteria->add(new TFilter('id_uf''='$key ));
  92.         
  93.         $repository = new TRepository('Cidade');
  94.         $cidades $repository->load($criteria);
  95.         
  96.         foreach ($cidades as $cidade)
  97.         {
  98.             $options $cidade->ds_cidade_nome;
  99.         }
  100.         //envia os dados ao formulário
  101.         TForm::sendData('form_regiaogrid''cidades'$options);      
  102.         TTransaction::close();
  103.     } 
  104.     
  105.     function onReload($param NULL)
  106.     {
  107.         try
  108.         {
  109.             //abre a base de dados
  110.             TTransaction::open('smart');
  111.             
  112.             //cria repositorio
  113.             $repository = new TRepository('Regiao');
  114.             
  115.             //cria criterio para selecao de registros
  116.             $criteria = new TCriteria;
  117.             $order    = isset($param['order']) ? $param['order'] : 'id';
  118.             $criteria->setProperty('order'$order);
  119.             
  120.             //carrega os dados
  121.             $regioes $repository->load($criteria);
  122.             
  123.             //limpa datagrid
  124.             $this->datagrid->clear();
  125.             if ($regioes)
  126.             {
  127.                 foreach($regioes as $regiao)
  128.                 {
  129.                     $this->datagrid->addItem($regiao);
  130.                 }
  131.             }
  132.             TTransaction::close();
  133.             $this->loaded true;
  134.             
  135.         }
  136.         catch (Exception $e)
  137.         {
  138.             new TMessage('erros''<b>Error</b> ' $e->getMessage());
  139.             TTransaction::rollback();
  140.         }
  141.     }
  142.     
  143.     function onSave()
  144.     {
  145.         try
  146.         {
  147.             TTransaction::open('smart');
  148.             
  149.             $regiao $this->form->getData('Regiao');
  150.             
  151.             //salva os registros
  152.             $regiao->store();
  153.             
  154.             TTransaction::close();
  155.             
  156.             new TMessage('info''Registro Salvo');
  157.             $this->onReload();
  158.         }
  159.         catch (Exception $e)
  160.         {
  161.             new TMessage('error'$e->getMessage());
  162.             TTransaction::rollback();
  163.         }
  164.     }
  165.     
  166.     public function onClear()
  167.     {
  168.         $this->form->clear();
  169.     }
  170.     
  171.     function onEdit($param)
  172.     {
  173.         try
  174.         {
  175.             if (isset($param['key']))
  176.             {
  177.                 $key $param['key'];
  178.                 TTransaction::open('smart');
  179.                 $regioes = new Regiao($key);
  180.                 $this->form->setData($regioes);
  181.                 TTransaction::close();
  182.                 $this->onReload();
  183.             }
  184.             else
  185.             {
  186.                 $this->form->clear();
  187.             }
  188.         }
  189.         catch (Exception $e)
  190.         {
  191.             new TMessage('error'$e->getMessage());
  192.             TTransaction::rollback();
  193.         }
  194.     }
  195.     
  196.     function onDelete($param)
  197.     {
  198.         $action = new TAction(array($this'Delete'));
  199.         $action->setParameters($param);
  200.         new TQuestion('Deseja realmente excluir o registro'$action);
  201.     }
  202.     
  203.     function Delete($param)
  204.     {
  205.         try
  206.         {
  207.             $key $param['key'];
  208.             
  209.             TTransaction::open('smart');
  210.             $regioes = new Regiao($key);
  211.             $regioes->delete();
  212.             TTransaction::close();
  213.             $this->onReload$param );
  214.             new TMessage('info'"Registro Excluido");
  215.             
  216.         }
  217.         catch (Exception $e)
  218.         {
  219.             new TMessage('error'$e->getMessage());
  220.             TTransaction::rollback();
  221.         }
  222.     }    
  223. }
  224. ?>


Obrigado.
FC

é preciso dar um var_dump dentro do onComboChange leia esse tópico www.adianti.com.br/forum/pt/view_1149?tcombo-onchangeaction esse param['key'] está trazendo o id da tabela uf ? não esqueça de indexar o vetor ok. tem esse outro post que pode ajudar www.adianti.com.br/forum/pt/view_1243?tratar-dados-do-tmultisearch
AL

Bom vou te explicar o que quero.

Quero trazer os Estados de uma tabela "Uf" no BD, de acordo com o estado, quero popular o TMultSearch com as cidades da tabela "Cidade" e dentro do MultSearch escolher as cidades do estado que vão pertencer a Região de Vendas.
Não estou conseguindo popular o TMultisearch com o resultado da lista com o Options, fiz esta osnChangeAction e não funciona, mais o $option está carregado com as cidades que quero colocar na TMultiSearch.

public static function onChangeAction($param)
{

$key = $param['key'];

TTransaction::open('smart');

$criteria = new TCriteria;
$criteria->add(new TFilter('id_uf', '=', $key ));

$repository = new TRepository('Cidade');
$cidades = $repository->load($criteria);

foreach ($cidades as $cidade)
{
$options[] = $cidade->ds_cidade_nome;
}

TTransaction::close();

//envia os dados ao formulário
TCombo::reload('form_regiaogrid', 'cidades', $options);

}
FC

Eu entendi desde o começo porém olha seu código está dando o reload numa combo e não está indexando seu vetor.

O TMultiSearch não possui a função onReload nativa como a Tcombo vai ter que usar o TForm::sendData mas acredito que para funcionar vai precisar indexar o vetor.
AL

Felipe, me desculpe, o que é indexar vetor?
FC

$options[$cidade->id] = $cidade->ds_cidade_nome;

É criar um índice deve funcionar assim.
AL

Felipe, fiz desta forma:

{

$key = $param['key'];

TTransaction::open('smart');

$criteria = new TCriteria;
$criteria->add(new TFilter('id_uf', '=', $key ));

$repository = new TRepository('Cidade');
$cidades = $repository->load($criteria);

foreach ($cidades as $cidade)
{
$options[$cidade->id] = $cidade->ds_cidade_nome;
}

TTransaction::close();

//envia os dados ao formulário
TForm::sendData('form_regiaogrid', $options);

}
Mais não mandou os campos para a TMultiSearch.

Tem como substituir o TMultiSearch, no formulário, por um TDBMultiSearch, com um $criteria do id do estado?
FC

O problema é que não atualiza a pagina ou seja o criterio viria como nulo e não teria retorno, se fosse trocado o multisearch por uma combo resolveria esse problema com o tcombo::reload , mas acredito que falta um detalhe para funcionar ou é a variavel $options que não está declarada como objeto ou no foreach precisa passar o $key tem como me enviar seu projeto para eu analisar ? está em qual banco de dados?




AL

Felipe, bom dia, nunca utilizei um Framework, comprei o livro do adianti e já li ele todo para poder criar dúvidas, já desenvolvi sistemas com algumas classes que criei e que fui desenvolvendo desde 2012, e utilizo um Ajax muito simples que altera com um innerHtml o objeto na página e preenche os campos!
Com o adianti, verifiquei este campo muito interessante(MultiSearch), que fica mais fácil utilizar ao gravar os dados do banco dentro de um campo TEXT, evitando operações de associação com a base de Cidades, que a cada abertura de tela ou chamada de edição fazer buscas em outra tabela.
Então este campo ficaria com acesso a outra base, somente em caso de Edição e Alteração, e somente no estado que necessite, sem ter que carregar a base toda de cidades, na hora de escolher as cidades.
Se tivesse uma function reload na Classe TMultiSearch não resolveria?
FC

Exatamente !!! é isso que estamos fazendo de uma forma manual(sem mexer na classe), agora ja abriu a classe MultiSearch para ver como ela carrega os dados? confesso que eu não olhei. faz o seguinte olha esse exemplo www.adianti.com.br/framework_files/tutor/index.php?class=SearchBox ele parece que faz exatamente o que vc quer basta ajustar em vez de carregar do xml carregar do banco de dados com o filtro.

Olha o Adianti é uma ferramenta que facilita a vida de criações de aplicação de negocio que se resumem muito a listagens e formulários o foco é evitar o retrabalho de ficar reescrevendo códigos, claro cada projeto é diferente e o framework é bem flexivel podendo mudar suas classes facilmente.

Cabe vc analisar o seu projeto ajustar o MultiSearch a sua necessidade ou até mesmo criar o seu, esta liberdade que é bacana pois não existe nenhum projeto igual ao outro.

Boa sorte senão conseguir avisa que tento montar um exemplo.
FC

Montei esse exemplo só salvar no control do tutor

  1. <?php
  2. /**
  3.  * Search Box
  4.  *
  5.  * @version    1.0
  6.  * @package    samples
  7.  * @subpackage tutor
  8.  * @author     Pablo Dall'Oglio
  9.  * @copyright  Copyright (c) 2006-2014 Adianti Solutions Ltd. (http://www.adianti.com.br)
  10.  * @license    http://www.adianti.com.br/framework-license
  11.  */
  12. class SearchBoxP extends TPage
  13. {
  14.     private $form;
  15.     
  16.     /**
  17.      * Constructor method
  18.      */
  19.     public function __construct()
  20.     {
  21.         parent::__construct('search_box');
  22.         $this->form = new TForm('form_box');
  23.         
  24.         $table = new TTable;
  25.         
  26.         $input = new TMultiSearch('input');
  27.         $input->setSize(240,28);
  28.         $input->addItemsTSession::getValue('programas'));
  29.         $input->setMinLength(1);
  30.         $input->setMaxSize(1);
  31.         //$input->setChangeAction(new TAction(array('SearchBox', 'loadProgram')));
  32.         
  33.         $combo = new TCombo('estado');
  34.         $combo_itens['3'] = 'Ate id 3';
  35.         $combo_itens['6'] = 'Até id 6';
  36.         $combo->addItems($combo_itens);
  37.         $combo->setValue(TSession::getValue('estado'));
  38.         $table->addRowSet( new TLabel('Estado:'), $combo );
  39.         $table->addRowSet( new TLabel('Cidade:'), $input );
  40.         
  41.         $change_action = new TAction(array($this'getPrograms'));
  42.         $combo->setChangeAction($change_action);
  43.         
  44.         $this->form->add($table);
  45.         
  46.         $this->form->setFields(array($input,$combo));
  47.         parent::add($this->form);
  48.        
  49.     }
  50.     
  51.     /**
  52.      * Returns an indexed array with all programs
  53.      */
  54.     public static function getPrograms($param)
  55.     {
  56.         
  57.         
  58.         TSession::setValue('estado'$param['estado']);
  59.          
  60.         TTransaction::open('samples');
  61.         $repository = new TRepository('City');
  62.         $citys $repository->where('id''<'$param['key'])
  63.                                                      ->load();
  64.         $items = array();
  65.         foreach ($citys as $item)
  66.         {
  67.           $items[$item->id] = $item->name;
  68.         }
  69.         TTransaction::close();
  70.         
  71.         TSession::setValue('programas',$items);
  72.         
  73.         TApplication::loadPage('SearchBoxP');
  74.         
  75.         
  76.     }
  77.     
  78.    
  79. }
  80. ?>
AL

Felipe, não consegui colocar os dados dentro do retorno, montei desta forma a Classe:

  1. <?php
  2. /**
  3.  * Search Box
  4.  *
  5.  * @version    1.0
  6.  * @package    samples
  7.  * @subpackage tutor
  8.  * @author     Pablo Dall'Oglio
  9.  * @copyright  Copyright (c) 2006-2014 Adianti Solutions Ltd. (http://www.adianti.com.br)
  10.  * @license    http://www.adianti.com.br/framework-license
  11.  */
  12. class SearchBoxP extends TPage
  13. {
  14.     private $form;
  15.     
  16.     /**
  17.      * Constructor method
  18.      */
  19.     public function __construct()
  20.     {
  21.         parent::__construct('search_box');
  22.         $this->form = new TForm('form_box');
  23.         
  24.         $table = new TTable;
  25.         
  26.         $input = new TMultiSearch('input');
  27.         $input->setSize(240,28);
  28.         $input->addItemsTSession::getValue('programas'));
  29.         $input->setMinLength(1);
  30.         $input->setMaxSize(1);
  31.         $input->setChangeAction(new TAction(array('SearchBox''loadProgram')));
  32.         
  33.         $combo = new TDBCombo('estado''smart''Uf''id''ds_uf_nome');
  34.         $combo->setValue(TSession::getValue('estado'));
  35.         $table->addRowSet( new TLabel('Estado:'), $combo );
  36.         $table->addRowSet( new TLabel('Cidade:'), $input );
  37.         
  38.         $change_action = new TAction(array($this'getPrograms'));
  39.         $combo->setChangeAction($change_action);
  40.         
  41.         $this->form->add($table);
  42.         
  43.         $this->form->setFields(array($input,$combo));
  44.         parent::add($this->form);
  45.        
  46.     }
  47.     
  48.     /**
  49.      * Returns an indexed array with all programs
  50.      */
  51.     public static function getPrograms($param)
  52.     {
  53.         
  54.         
  55.         TSession::setValue('estado'$param['key']);
  56.          
  57.         TTransaction::open('smart');
  58.         $repository = new TRepository('Cidade');
  59.         $citys $repository->where('id_uf''='$param['key'])
  60.                                                      ->load();
  61.         $items = array();
  62.         foreach ($citys as $item)
  63.         {
  64.           $items[$item->id] = $item->name;
  65.         }
  66.         TTransaction::close();
  67.         
  68.         TSession::setValue('programas',$items);
  69.         
  70.         TApplication::loadPage('SearchBoxP');
  71.         
  72.         
  73.     }
  74.     
  75.    
  76. }
  77. ?>
AL

Felipe, tem como transformar o TDBMultiSearch em TText, para salvar os dados como TEXT?
AL

Felipe, já resolvi com o implode e salvou corretamente no sistema, a única coisa que falta é selecionar o estado e preencher os MultiSsearch com as cidades somente do estado.

AL

Felipe, boa tarde, agradeço imensamente sua paciência e ajuda, ainda não consegui fazer com que a TDBCombo separe as cidades por estado na TDBMultiSearch, sem problemas, vou seguir no sistema para não perder mais tempo.
Mais está fazendo tudo que preciso, pois não guardo o ID das Cidades e sim os Nomes, então a Classe abaixo funciona bem, muito obrigado pelas dicas.

  1. <?php
  2. class RegiaoFormDataGrid extends TPage
  3. {
  4.     private $form;
  5.     private $datagrid;
  6.     private $loaded;
  7.     
  8.     public function __construct()
  9.     {
  10.         parent::__construct();
  11.         
  12.         //cria formulário
  13.         $this->form = new TQuickForm('form_regiaogrid');
  14.         
  15.         //CSS Class
  16.         $this->form->class 'tform';
  17.         
  18.         //titulo do formulário
  19.         $this->form->setFormTitle('Regiões de Vendas');
  20.         
  21.         //Declara os Campos do formulário
  22.         $id = new TEntry('id');
  23.         $nome = new TEntry('nome_regiao');
  24.         $nome->addValidation('Nome da Região', new TRequiredValidator);
  25.         
  26.         $estado = new TDBCombo('uf''smart''Uf''ds_uf_sigla''ds_uf_sigla');
  27.         
  28.          //define as ações de estados
  29.         //$exit_action = new TAction(array($this, 'onChangeAction'));
  30.         //$estado->setChangeAction($exit_action);        
  31.        
  32.         $cidades = new TDBMultiSearch('cidades''smart''Cidade' ,'ds_cidade_nome''ds_cidade_nome');
  33.         $cidades->setMinLength(2);
  34.         $cidades->setSize(280,30);
  35.         $cidades->setValue('ds_cidade_nome'$this->cidades);
  36.         //echo '<pre>'.print_r($cidades).'</pre>';
  37.         
  38.         //adiciona os campos no formulário
  39.         $this->form->addQuickField('ID'$id40 );
  40.         $this->form->addQuickField('Nome da Região'$nome240 );
  41.         $this->form->addQuickField('Estados'$estado100); 
  42.         $this->form->addQuickField('Cidades da Região'$cidades220);
  43.         
  44.       
  45.         //define a ação do formulário
  46.         $this->form->addQuickAction('Salvar', new TAction(array($this'onSave')), 'ico_save.png');
  47.         $this->form->addQuickAction('Novo', new TAction(array($this'onClear')), 'ico_new.png');
  48.         
  49.         //torna o campo não editável
  50.         $id->setEditable(FALSE);
  51.         
  52.         //instancia objeto datagrid
  53.         $this->datagrid = new TQuickGrid;
  54.         $this->datagrid->style 'width: 100%';
  55.         $this->datagrid->setHeight(320);
  56.         
  57.         //adiciona as colunas
  58.         $this->datagrid->addQuickColumn('ID''id''center'50, new TAction(array($this'onReload')), array('order''id'));
  59.         $this->datagrid->addQuickColumn('Nome da Região''nome_regiao''left'250, new TAction(array($this'onReload')), array('order''nome_regiao'));
  60.         $this->datagrid->addQuickColumn('Estado''uf''center'20, new TAction(array($this'onReload')));
  61.         $this->datagrid->addQuickColumn('Cidades da Região''cidades' 'left'400, new TAction(array($this'onReload')));
  62.         
  63.         //adiciona ações
  64.         $this->datagrid->addQuickAction('Editar', new TDataGridAction(array($this'onEdit')), 'id''ico_edit.png');
  65.         $this->datagrid->addQuickAction('Deletar', new TDataGridAction(array($this'onDelete')), 'id''ico_delete.png');
  66.         
  67.         //cria a estrutura do Datagrid
  68.         $this->datagrid->createModel();
  69.         
  70.         //Cria um container para os objetos
  71.         $vbox = new TVBox;
  72.         $vbox->add($this->form);
  73.         parent::add($vbox);
  74.         
  75.         $vbox1 = new TVBox;
  76.         $vbox1->add($this->datagrid);
  77.         parent::add($vbox1);
  78.     }
  79.     function show()
  80.     {
  81.         if (!$this->loaded)
  82.         {
  83.             $this->onReloadfunc_get_arg(0) );
  84.         }
  85.         parent::show();
  86.     }
  87.     public static function onChangeAction($param)
  88.     {
  89.     
  90.         $key $param['key'];    
  91.         
  92.         TTransaction::open('smart');    
  93.         
  94.         $criteria = new TCriteria;
  95.         $criteria->add(new TFilter('id_uf''='$key ));
  96.         
  97.         $repository = new TRepository('Cidade');
  98.         $cidades $repository->load($criteria);
  99.         
  100.         foreach ($cidades as $cidade)
  101.         {
  102.             $options[$cidade->id] = $cidade->ds_cidade_nome;
  103.         }
  104.         
  105.         TTransaction::close();    
  106.         
  107.         //envia os dados ao formulário
  108.         TMultiSearch::treatData($options);
  109.     } 
  110.     
  111.     function onReload($param NULL)
  112.     {
  113.         try
  114.         {
  115.             //abre a base de dados
  116.             TTransaction::open('smart');
  117.             
  118.             //cria repositorio
  119.             $repository = new TRepository('Regiao');
  120.             
  121.             //cria criterio para selecao de registros
  122.             $criteria = new TCriteria;
  123.             $order    = isset($param['order']) ? $param['order'] : 'id';
  124.             $criteria->setProperty('order'$order);
  125.             
  126.             //carrega os dados
  127.             $regioes $repository->load($criteria);
  128.             
  129.             
  130.             //limpa datagrid
  131.             $this->datagrid->clear();
  132.             
  133.             if ($regioes)
  134.             {
  135.                 foreach($regioes as $regiao)
  136.                 {
  137.                     $this->datagrid->addItem($regiao);
  138.                 }
  139.             }
  140.             TTransaction::close();
  141.             
  142.             $this->loaded true;
  143.             
  144.         }
  145.         catch (Exception $e)
  146.         {
  147.             new TMessage('erros''<b>Error</b> ' $e->getMessage());
  148.             TTransaction::rollback();
  149.         }
  150.     }
  151.     
  152.     function onSave()
  153.     {
  154.         try
  155.         {
  156.             
  157.             //abre transação
  158.             TTransaction::open('smart');
  159.             
  160.             $regiao $this->form->getData('Regiao');
  161.             $regiao->cidades implode(", "$regiao->cidades);
  162.           
  163.             //mantém os dados no form após postagem
  164.             $this->form->setData($regiao);
  165.             
  166.             //salva os registros
  167.             $regiao->store();            
  168.             
  169.             //fecha a transação
  170.             TTransaction::close();
  171.             
  172.             new TMessage('info''Registro Salvo');
  173.             $this->onReload();
  174.         }
  175.         catch (Exception $e)
  176.         {
  177.             new TMessage('error'$e->getMessage());
  178.             TTransaction::rollback();
  179.         }
  180.     }
  181.     
  182.     public function onClear()
  183.     {
  184.         $this->form->clear();
  185.     }
  186.     
  187.     function onEdit($param)
  188.     {
  189.         try
  190.         {
  191.             if (isset($param['key']))
  192.             {
  193.                 $key $param['key'];
  194.                 TTransaction::open('smart');
  195.                 $regioes = new Regiao($key);
  196.                 $regioes->cidades explode(','$regioes->cidades);
  197.                 $this->form->setData($regioes);
  198.                 TTransaction::close();
  199.                 $this->onReload();
  200.             }
  201.             else
  202.             {
  203.                 $this->form->clear();
  204.             }
  205.         }
  206.         catch (Exception $e)
  207.         {
  208.             new TMessage('error'$e->getMessage());
  209.             TTransaction::rollback();
  210.         }
  211.     }
  212.     
  213.     function onDelete($param)
  214.     {
  215.         $action = new TAction(array($this'Delete'));
  216.         $action->setParameters($param);
  217.         new TQuestion('Deseja realmente excluir o registro'$action);
  218.     }
  219.     
  220.     function Delete($param)
  221.     {
  222.         try
  223.         {
  224.             $key $param['key'];
  225.             
  226.             TTransaction::open('smart');
  227.             $regioes = new Regiao($key);
  228.             $regioes->delete();
  229.             TTransaction::close();
  230.             $this->onReload$param );
  231.             new TMessage('info'"Registro Excluido");
  232.             
  233.         }
  234.         catch (Exception $e)
  235.         {
  236.             new TMessage('error'$e->getMessage());
  237.             TTransaction::rollback();
  238.         }
  239.     }    
  240. }
FC

É pq VC precisa usar a TMultisearch e não TDB testa aí o exemplo que passei fazia o filtro.
AL

Carrega uma Cidade, mais não carrega todas as cidades do Estado!
PD

Antonio,

Não é possível fazer a TDBCombo pré-filtrar a TDBMultiSearch, pois a TDBMultiSearch trabalha com filtros pré-definidos, não dinâmicos.
Eu respondi à isso de maneira mais completa neste outro post:
www.adianti.com.br/forum/pt/view_2041?filtragem-de-municipios-usando

A recomendação é usar somente TDBMultiSearch, apresentando o estado junto ao nome da cidade na busca, e usar apenas o ID da cidade.

Também sugiro usar um seek button para selecionar as cidades a partir de uma janela, como no cadastro de clientes:
www.adianti.com.br/framework_files/tutor/index.php?class=CustomerFor

Atenciosamente,
Pablo
AL

Muito obrigado pela informação, como o nome da cidade que é importante salvar no campo, não me importei com o id dela em acordo com o Estado, e funcionou bem, pois salvo no Banco de dados como campo TEXT.

Obrigado e até mais.