menu
Fórum Adianti
menu Menu
Reaproveitando a mesma seek em formulários diferentes No framework, podemos criar seeks para localização de registros de maneira automática, por meio do componente TDBSeekButton. Entretanto, o TDBSeekButton permite apenas um campo de buscas na janela que se abre. Caso seja necessário abrir uma janela de busca de registros com vários campos de buscas e também listando várias colunas, é necessário construir uma seek manual, usando o componente...
PD
Reaproveitando a mesma seek em formulários diferentes  
Fechado
No framework, podemos criar seeks para localização de registros de maneira automática, por meio do componente TDBSeekButton. Entretanto, o TDBSeekButton permite apenas um campo de buscas na janela que se abre. Caso seja necessário abrir uma janela de busca de registros com vários campos de buscas e também listando várias colunas, é necessário construir uma seek manual, usando o componente TSeekButton e vinculando à uma controller que irá ser aberta na janela de buscas. Ambos exemplos podem ser vistos aqui:
www.adianti.com.br/framework_files/tutor/index.php?class=FormSeekBut

Para criar uma seek manual, basta olhar a classe TestCitySeek do tutor.

Uma classe de busca de registros possui métodos como
  1. <?php
  2. class SeekPessoas extends TWindow
  3. {
  4.     function __construct(); // define o form de buscas e a datagrid
  5.     function onSearch();    // cria o filtro usado pelo usuário na busca
  6.     function onReload($param NULL);   // carrega a datagrid de buscas
  7.     function onSelect($param); // chamado para fechar a janela e preencher o formulário-pai
  8.     function show();
  9. }
  10. ?>


É comum a necessidade de termos de reaproveitar uma seek manual em formulários diferentes. Uma seek de pessoas é necessária em vários pontos do sistema. Vejamos que o método onSelect() da seek manual usa o nome do formulário-pai para enviar os dados. Entretanto este nome de formulário-pai muda de caso para caso, veja a seguir "form_pessoas". Esta dependência dificulta o reaproveitamento da seek manual.

  1. <?php
  2.     function onSelect($param)
  3.     {
  4.         try
  5.         {
  6.             $key $param['key'];
  7.             TTransaction::open('samples');
  8.             $pessoa = new Pessoa($key);
  9.             TTransaction::close();
  10.             
  11.             $object = new StdClass;
  12.             $object->id_pessoa   $pessoa->id;
  13.             $object->nome_pessoa $pessoa->nome;
  14.             
  15.             TForm::sendData('form_pessoas'$object);
  16.             parent::closeWindow(); // closes the window
  17.         }
  18.         .// ...
  19.     }
  20. ?>


Para resolver esse problema, podemos definir uma classe básica de buscas (Ex: busca de pessoas). Ex: SeekPessoas. Em seguida, deve-se criar classes-filhas específicas conforme o formulário em que a busca de pessoas é necessária. Como no exemplo a seguir. Assim, a classe SeekPessoas possuiria todos os métodos necessários para a busca, com exceção do método onSelect(), que por sua vez seria definido nas classes filhas. A classe-base SeekPessoas ainda pode ser definida como classe abstrata, assim como o método onSelect(), para forçar sua definição nas classes filhas.

  1. <?php
  2. class SeekPessoasPedido extends SeekPessoas
  3. {
  4.     function onSelect($param)
  5.     {
  6.         try
  7.         {
  8.             $key $param['key'];
  9.             TTransaction::open('samples');
  10.             $pessoa = new Pessoa($key);
  11.             TTransaction::close();
  12.             
  13.             // ...
  14.             
  15.             TForm::sendData('form_pedidos'$object);
  16.             parent::closeWindow(); // closes the window
  17.         }
  18.         .// ...
  19.     }
  20. }
  21. ?>


Assim, em cada formulário que a seek de pessoas fosse necessária, só teríamos de criar uma classe filha com um método onSelect(), definindo o nome do formulário-pai e quais campos gostaríamos de enviar para esse formulário.

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


AM

Eu resolvi o problema de outra forma, como a questão basicamente era a indicação do formulário que deveria receber dos dados, criei inicialmente dois outros métodos na classe de busca que servem para indicar o formulário de iteração e para buscar tal informação. O nome do formulário fica registrado na TSession:

  1. <?php 
  2. function setInteractionForm($formulario)
  3.     {
  4.      TSession::setValue('CidadeBusca_InteractionForm'$formulario);
  5.     }
  6.     
  7.     public function getInteractionForm() 
  8.     {
  9.      return TSession::getValue('CidadeBusca_InteractionForm');
  10.     }
  11. ?>


Após, realizei uma pequena alteração no método onSelect:

  1. <?php 
  2.        //...
  3.       TForm::sendData(TSession::getValue('CidadeBusca_InteractionForm'), $object);
  4. ?>


Por fim, ao criar o objeto CidadeBusca, utilizei o método para registrar o formulário de interação.

  1. <?php 
  2. //...
  3.         $obj = new CidadeBusca;
  4.         $obj->setInteractionForm('Parceiro_Form');
  5.         $action = new TAction(array($obj'onReload'));
  6.         $CID_NOM->setAction($action);
  7. ?>

JA

Prezados , boa tarde ,estou precisando de ajuda , tenho um formulário com 3 campos o id,nome e código. Usei o Método "TDBSeekButton",mas não obtive exite pois só foi retornado o id e nome, o terceiro campo não consegui,ficando em branco. O Pablo me informou pro email mas tambem nao tive exito:



"POSFormView. O onExitProduct() é definido pelo setExitAction().
Lá tem o TForm::sendData() que manda os dados para form.
Basta definir mais atributos para enviar...

/**
* Exit action for the field product
* Fill some form fields (sale_price, amount, discount, total)
*/
public static function onExitProduct($param)
{
$product_id = $param['product_id']; // get the product code
try
{
TTransaction::open('samples');
$product = new Product($product_id); // reads the product

$obj = new StdClass;
$obj->sale_price = number_format($product->sale_price, 2, '.', ',');
$obj->amount = 1;
$obj->discount = 0;
$obj->total = number_format($product->sale_price, 2, '.', ',');
TTransaction::close();
TForm::sendData('form_pos', $obj);
}
catch (Exception $e)
{
// does nothing
}
}
"
Alguém pode me ajudar?
EB

Olá Jonas, conseguiu resolver sua dúvida, se não, veja se o código abaixo funciona.
Atenção para criação das variáveis "sale_price, amount, discount, total"
no formulário que chama a SeekBusca.

  1. <?php
  2. /** 
  3. * Exit action for the field product 
  4. * Fill some form fields (sale_price, amount, discount, total) 
  5. */ 
  6. public static function onExitProduct($param
  7. $product_id $param['product_id']; // get the product code 
  8. try 
  9. TTransaction::open('samples'); 
  10. $product = new Product($product_id); // reads the product 
  11. $obj = new StdClass
  12. $obj->sale_price number_format($product->sale_price2'.'','); 
  13. $obj->amount $product->amount
  14. $obj->discount $product->discount
  15. $obj->total = (($product->sale_price*$product->amount)-$product->discount); 
  16. TTransaction::close(); 
  17. TForm::sendData('form_pos'$obj); 
  18. catch (Exception $e
  19. // does nothing 
  20. ?>