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
<?phpclass SeekPessoas extends TWindow{    function __construct(); // define o form de buscas e a datagrid    function onSearch();    // cria o filtro usado pelo usuário na busca    function onReload($param = NULL);   // carrega a datagrid de buscas    function onSelect($param); // chamado para fechar a janela e preencher o formulário-pai    function show();}?>


É 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.

<?php    function onSelect($param)    {        try        {            $key = $param['key'];            TTransaction::open('samples');            $pessoa = new Pessoa($key);            TTransaction::close();                        $object = new StdClass;            $object->id_pessoa   = $pessoa->id;            $object->nome_pessoa = $pessoa->nome;                        TForm::sendData('form_pessoas', $object);            parent::closeWindow(); // closes the window        }        .// ...    }?>


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.

<?phpclass SeekPessoasPedido extends SeekPessoas{    function onSelect($param)    {        try        {            $key = $param['key'];            TTransaction::open('samples');            $pessoa = new Pessoa($key);            TTransaction::close();                        // ...                        TForm::sendData('form_pedidos', $object);            parent::closeWindow(); // closes the window        }        .// ...    }}?>


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:

<?php function setInteractionForm($formulario)    {     TSession::setValue('CidadeBusca_InteractionForm', $formulario);    }        public function getInteractionForm()     {     return TSession::getValue('CidadeBusca_InteractionForm');    }?>


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

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


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

<?php //...        $obj = new CidadeBusca;        $obj->setInteractionForm('Parceiro_Form');        $action = new TAction(array($obj, 'onReload'));        $CID_NOM->setAction($action);?>

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.

<?php/** * 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 = $product->amount; $obj->discount = $product->discount; $obj->total = (($product->sale_price*$product->amount)-$product->discount); TTransaction::close(); TForm::sendData('form_pos', $obj); } catch (Exception $e) { // does nothing } } ?>