F
TDBCombo hierarquia
Boa tarde, estou com dificuldades em fazer esse TDBCombo hierarquia funcionar, atê segui um exemplo no tutor, mas deu certo.
Ele está dando erro de ficar dando reload tipo de 2 em 2 segundos, e então não dá para selecionar a área. Pois ai, somente após ser selecionado uma filial, listará o combo das áreas, e após selecionar as áreas liberará o campo de sub-área, porém isso é posterior para ser feito.
Imagino eu que seja alguma besteira que esqueci de fazer, mas não estou conseguindo encontrar, se alguém puder tentar ajudar ficarei grato.
- <?php>
- $ar_item_ar_cod_fil = new TDBCombo('ar_item_ar_cod_fil', $this->database, 'TFilial', 'cod_fil', '{sigla_fil} - {nome_fil}', 'nome_fil asc');
- $ar_item_ar_cod_fil->enableSearch();
- $filter = new TCriteria;
- $filter->add(new TFilter('cod_area', '<', '0'));
- $ar_item_ar_cod_area = new TDBCombo('ar_item_ar_cod_area', $this->database, 'TArea', 'cod_area', 'area', 'area', $filter);
- $ar_item_ar_cod_area->enableSearch();
- ?>
- <?php>
- public function fireEvents( $object )
- {
- $obj = new stdClass;
- $obj->ar_item_ar_cod_fil = $object->ar_item_ar_cod_fil;
- $obj->ar_item_ar_cod_area = $object->ar_item_ar_cod_area;
- TForm::sendData(self::$formName, $obj);
- }
-
- public static function onAreaChange($param)
- {
- try
- {
- TTransaction::open(TSession::getValue('pConfig'));
- if (!empty($param['ar_item_ar_cod_fil']))
- {
- $criteria = TCriteria::create( ['cod_fil' => $param['ar_item_ar_cod_fil'] ] );
-
- // formname, field, database, model, key, value, ordercolumn = NULL, criteria = NULL, startEmpty = FALSE
- TDBCombo::reloadFromModel(self::$formName, 'ar_item_ar_cod_area', TSession::getValue('pConfig'), 'TArea', 'cod_area', '{cod_area} - {area}', 'area', $criteria);
- }
- else
- {
- TCombo::clearField(self::$formName, 'ar_item_ar_cod_area');
- }
-
- TTransaction::close();
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- }
- }
- public function onSave($param = null)
- {
- try
- {
- TTransaction::open($this->database);
- $messageAction = null;
- $this->form->validate();
- $object = new TCCusto();
- $data = $this->form->getData();
- $object->fromArray( (array) $data);
- $object->store();
- $ar_item_ar_items = $this->storeItems('TCCustoArea', 'cod_ccusto', $object, 'ar_item_ar',
- function($masterObject, $detailObject){}
- );
- $data->cod_ccusto = $object->cod_ccusto;
- $this->form->setData($data);
- $this->fireEvents( $object );
- TTransaction::close();
- new TMessage('info', AdiantiCoreTranslator::translate('Record saved'), $messageAction);
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- $this->form->setData( $this->form->getData() );
- TTransaction::rollback();
- }
- }
- public function onEdit( $param )
- {
- try
- {
- if (isset($param['key']))
- {
- $key = $param['key'];
- TTransaction::open(TSession::getValue('pConfig'));
- $object = new TCCusto($key);
- $ar_item_ar_items = $this->loadItems('TCCustoArea', 'cod_ccusto', $object, 'ar_item_ar',
- function($masterObject, $detailObject){}
- );
-
- $this->form->setData($object);
- $this->onReload();
- TTransaction::close();
- $this->fireEvents( $object );
- }
- else
- {
- $this->form->clear();
- }
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- TTransaction::rollback();
- }
- }
- ?>
Ele está dando erro de ficar dando reload tipo de 2 em 2 segundos, e então não dá para selecionar a área. Pois ai, somente após ser selecionado uma filial, listará o combo das áreas, e após selecionar as áreas liberará o campo de sub-área, porém isso é posterior para ser feito.
Imagino eu que seja alguma besteira que esqueci de fazer, mas não estou conseguindo encontrar, se alguém puder tentar ajudar ficarei grato.
Não entendi, o programa fica em loop? Poste o resto do código do construtor
Deixa ver se consigo explicar, se eu fizer o mesmo código para atributos da tabela principal, dá tudo certinho, porém se eu eu tentar fazer o mesmo em aba detalhe, ele não deixa eu mudar no tdbcombo, fica em loop sim, ai por isso não estou entendendo, pois fiz em 3 class diferente na aba principal, e esse da aba de detalhe não está funcionando...
eu uso esse código no construtor também para chamar a função que faz o tdb funcionar somente se a filial estiver selecionada:
Dei uma resumida no codigo, está tudo aqui agora:
Testei seu código e rodou normal aqui. Só fiz um pequeno ajuste nas chamadas das exitAction:
Você estava vinculando uma ação de saída(onAreaChange) ao campo $cod_area, e dentro da função onAreaChange estava verificando pelo campo cod_fil para preencher o próprio campo $cod_area. Imagino que o vínculo com onAreaChange deva ser com o campo $cod_fil, assim ao escolher uma filial o campo área será recarregado filtrando pela filial escolhida.
Nossa, verdade... Obrigado Nataniel, ajudou muito!
Resolvido.
Abraço.