menu
Fórum Adianti
menu Menu
TCombo ou TDBCombo - Retornar valor anterior Boas, Alguém sabe como conseguir o valor anterior de um TCombo ou TDBCombo, ? Explico: Vamos supor que tenho 2 combos, um relacionado ao outro, onde através da setChangeAction do primeiro eu faça algo no segundo, no entanto preciso validar isto, que somente é possível conhecendo o valor anterior. Abraços ...
MC
TCombo ou TDBCombo - Retornar valor anterior  
Boas,

Alguém sabe como conseguir o valor anterior de um TCombo ou TDBCombo, ?

Explico:

Vamos supor que tenho 2 combos, um relacionado ao outro, onde através da setChangeAction do primeiro
eu faça algo no segundo, no entanto preciso validar isto, que somente é possível conhecendo o valor anterior.

Abraços


Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (7)


WP

Marco não entendi muito bem o que tu quer fazer, poderia tentar explicar com mais detalhes, ou até mesmo com Imagens, pode compartir a imagen em algum site como por exemplo (imgur.com)

MC

Boas Willian, Tudo de bom em 2018.

Vou dar um exemplo bem clássico, apesar de meu problema ser bem mais complexo.

Vamos supor que num TDBCombo voce carrega os Estados (SP, PR, RJ etc...) e num outro TDBCombo você irá carregar
de uma tabela os municípios destes estado conforme a escolha do Estado, como você faz isto

OBS: DADOS FICTICIOS


  1. <?php
  2. $criteria TCriteria::create([ 'CID_UFID => $uf ]);
  3. $uf         = new TDBCombo('UF',  BD, 'Tuf', 'UF_ID', UF_SIGLA''UF_SIGLA');
  4. $cidade = new TDBCombo('CIDADE'BD'Tcidade''CID_ID''CID_DESCRICAO, 'CID_DESCRICAO', $criteria);
  5. // Carrega as Cidades
  6. $uf->setChangeAction( new TAction( array( $this, 'onCidade' )));
  7. ?>


Abaixo o Action:

  1. <?php
  2.     /**
  3.      * Atualiza a Coluna Cidade
  4.      */
  5.     public static function onCidade$param )
  6.     {
  7.         try
  8.         {
  9.             if ( $param['UF'] )
  10.             {
  11.                 $criteria TCriteria::create([ 'CID_UF' => $param['UF'] ]);
  12.                 TDBCombo::reloadFromModel'form_'.__CLASS__'CIDADE'BD'Tcidade''CID_ID''CID_DESCRICAO, 'CID_DESCRICAO', $criteria, TRUE );
  13.             }
  14.         }
  15.         catch ( Exception $e )
  16.         {
  17.             new TMessage( 'error', $e->getMessage());
  18.         }
  19.     }
  20. ?>



No envento onEdit do Form

  1. <?php
  2.     public function onEdit$param )
  3.     {
  4.         try
  5.         {
  6.             if ( isset( $param['key'] ))
  7.             {
  8.                 $key $param['key']; 
  9.                 
  10.                 TTransaction::open'BD' );
  11.                 
  12.                 $object = new TBrasil$key );
  13.                 // Aqui comeca o problema, excplicacao abaixo
  14.                 // Campos - UF e CIDADE (int)
  15.                 
  16.                 $this->form->setData$object );
  17.                 
  18.                 TTransaction::close();
  19.             }
  20.             else
  21.             {
  22.                 $this->form->clear();
  23.             }
  24.         }
  25.         catch ( Exception $e )
  26.         {
  27.             new TMessage'error'$e->getMessage());
  28.             TTransaction::rollback();
  29.         }
  30.     }
  31. ?>



Dissecando o problema:

Dependendo de como a sua tabela ou modelo tenha sido criada, se por acaso o UF vier primeiro que a CIDADE
e você der var_dump no onCidade você terá valores diferentes,

UF -> CIDADE - CIDADE ficará em branco.
CIDADE -> UF - CIDADE conterá o valor.

O que acontece e que após ser atribuido os valores vindos da tabela e dado um show no form para apresentaçao
dos valores em tela, a função onCidade será startada. Assim ocorre que no Form independente da sequencia acima
o valor na tela da cidade ficará em branco.

Uma forma de resolver isto seria voce atribuir o valor da CIDADE no onCidade apos o reload do combo:


  1. <?php
  2.     /**
  3.      * Atualiza a Coluna Cidade
  4.      */
  5.     public static function onCidade$param )
  6.     {
  7.         try
  8.         {
  9.             if ( $param['UF'] )
  10.             {
  11.                 $criteria TCriteria::create([ 'CID_UF' => $param['UF'] ]);
  12.                 TDBCombo::reloadFromModel'form_'.__CLASS__'CIDADE'BD'Tcidade''CID_ID''CID_DESCRICAO, 'CID_DESCRICAO', $criteria, TRUE );
  13.                 if ( !empty( $param['CIDADE'] ))
  14.                 {
  15.                     $data = new stdClass;
  16.                     $data->CIDADE = $param['CIDADE'];
  17.                     TForm::sendData( 'form_'.__CLASS__, $data, FALSE, FALSE );
  18.                 }    
  19.             }
  20.         }
  21.         catch ( Exception $e )
  22.         {
  23.             new TMessage( 'error', $e->getMessage());
  24.         }
  25.     }
  26. ?>


Mas isso so funciona na condição "CIDADE -> UF" conforme descrito acima.

Agora a base da pergunta!

Se num var_dump alem do 'key' tivesse o valor 'old', eu poderia contornar o problema
acima ou fazer outros calculos que eh o meu caso.

No caso acima o primeiro onCidade o valor do UF seria "" assim eu impediria tambem o primeiro reload do TCombo Cidade.



Espero ter sido claro.

Abraços





MC

No meu caso, o segundo combo é condicional não somente a escolha atual, mas também da escolha anterior.
AG

Oi Marco!

Aqui já era tarde quando vi a tua dúvida e já estava meio a dormir ;-) por isso não sei se percebi bem, no entanto, vê se a resposta do Pablo ao seguinte post te pode ajudar

https://www.adianti.com.br/forum/pt/view_2235?combo-hierarquica-uf-cidade-client

Um abraço de Portugal!

Abel Gomes
MC

Abel, boas

Obrigado pela sua resposta, mas não eh esse o meu problema, o post do seu link e igual a minha solucao apartir da linha 15.

Todo combo, tem um valor carregado no edit, qdo vc clica nele ele abre pra voce as alternativas, vc escolhe e ele chama o ChanceAction.

Neste momento quero saber o valor que esta no combo, pois ele só me traz o valor escolhido. (key).

Abraços
MC

Correção valor que estava no combo
NR

Não entendi exatamente o motivo de você precisar do valor anterior da combo, mas se for só pra trazer ela com o valor selecionado corretamente no onEdit, use a função sendData dentro da onEdit:
  1. <?php
  2. //onEdit
  3. if ( isset( $param['key'] ))
  4. {
  5.       ...       
  6.       $object = new TBrasil$key );
  7.       
  8.       $this->form->setData$object );
  9.       $data = new stdClass;
  10.       $data->UF $object->UF;
  11.       $data->CIDADE $object->CIDADE;
  12.       TForm::sendData'form_'.__CLASS__$data ); // nao definir $fireEvents como false
  13. }
  14. ?>


Nesse caso, a função onCidade só deve recarregar a combo de cidades. O papel de atribuir valor a essa combo fica com as demais funções(onEdit, onSave).

No tutor tem um exemplo onde foi criada uma função fireEvents para fazer esse preenchimento através da sendData. Essa função é usada tanto pela onEdit como pela onSave:
adianti.com.br/framework_files/tutor/index.php?class=FormHierarchica

Agora, se precisar mesmo do valor anterior, aí na função onCidade você poderia salvar esse valor na sessão ou num hidden.