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. $object = new StdClass;
  11. $object->id_pessoa = $pessoa->id;
  12. $object->nome_pessoa = $pessoa->nome;
  13. TForm::sendData('form_pessoas', $object);
  14. parent::closeWindow(); // closes the window
  15. }
  16. .// ...
  17. }
  18. ?>


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. TForm::sendData('form_pedidos', $object);
  14. parent::closeWindow(); // closes the window
  15. }
  16. .// ...
  17. }
  18. }
  19. ?>


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 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 (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. public function getInteractionForm()
  7. {
  8. return TSession::getValue('CidadeBusca_InteractionForm');
  9. }
  10. ?>


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. {
  8. $product_id = $param['product_id']; // get the product code
  9. try
  10. {
  11. TTransaction::open('samples');
  12. $product = new Product($product_id); // reads the product
  13. $obj = new StdClass;
  14. $obj->sale_price = number_format($product->sale_price, 2, '.', ',');
  15. $obj->amount = $product->amount;
  16. $obj->discount = $product->discount;
  17. $obj->total = (($product->sale_price*$product->amount)-$product->discount);
  18. TTransaction::close();
  19. TForm::sendData('form_pos', $obj);
  20. }
  21. catch (Exception $e)
  22. {
  23. // does nothing
  24. }
  25. }
  26. ?>