menu
Fórum Adianti
menu Menu
Duvida TDBSeekButton Bom dia amigos, Preciso de um auxilio se possivel, Tenho uma tabela com a seguinte estrutura: ID int PK auto_increment, CODIGO int, EMPRESA int, CLASSIFICACAO varchar(15), DESCRICAO varchar(60) os dados apos inseridos ficam dessa maneira: 752 1 3 1 ...
RS
Duvida TDBSeekButton  
Bom dia amigos,

Preciso de um auxilio se possivel,

Tenho uma tabela com a seguinte estrutura:

ID int PK auto_increment, CODIGO int, EMPRESA int, CLASSIFICACAO varchar(15), DESCRICAO varchar(60)


os dados apos inseridos ficam dessa maneira:
752 1 3 1 ATIVO
873 1 17 1 ATIVO
753 2 3 1.1 CIRCULANTE
874 2 17 1.1 CIRCULANTE
754 2 3 1.1.1 CAIXA
875 2 17 1.1.1 CAIXA

Se observarem, existe a mesma conta para cada empresa, o que diferencia é o ID e EMPRESA, (nem todas as contas existem em todas as empresas)

Eu criei uma view desconsiderando o ID pois o que gravo no sistema é o campo CODIGO pois isso facilita a integração com o contábil depois,

o resultado da consulta SELECT * FROM SEL_PLANO WHERE EMPRESA = 17 só me traz as contas da empresa 17,

Criei um model SELPLANO e nele coloquei o campo CODIGO como PK (não estou usando o ID que é PK real)

<php>class SelPlano extends TRecord
{
const TABLENAME = 'sel_plano';
const PRIMARYKEY= 'CODIGO';
const IDPOLICY = 'max';

public function __construct($id = NULL, $callObjectLoad = TRUE)
{
parent::__construct($id, $callObjectLoad);
parent::addAttribute('EMPRESA');
parent::addAttribute('CLASSIFICACAO');
parent::addAttribute('DESCRICAO');
parent::addAttribute('DISPLAY');
}
</php>

Criei um TDBseekButton e adicionei a ele um TCriteria('EMPRESA','=',17) e quando clico no botao e abro grid de pesquisa funciona perfeitamente,

Porém quando digito o codigo da conta ao inves de abrir a grid de pesquisa, o framework nao considera o criteria e pega uma conta que nem existe no plano da
empresa, ou seja, ele nao filtra a empresa, ele procura em toda a tabela e o primeiro codigo que encontrar ele traz.

Há alguma forma de corrigir ou contornar isso?

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


RS

Pessoal não sei se é a melhor forma, mais a quem interessar, eu consegui resolver alterando o TStandardSeek,

Foi a solução mais rapida e simples, e eu considerei que a consulta irá resultar em apenas um linha por isso o "Objects[0]", mais a quem se interessar em aprimorar, pode-se criar uma exception "Multiple Rows in Singleton" e etc...

Como eu disse não sei se é a melhor forma, e se alguém tiver uma solução melhor que atenda a minha necessidade sem eu ter que alterar todo meu sistema, pode me passar, realizei testes e está funcionando como deveria, mais se encontrarem algum problema me avisem também.

Segue abaixo o trecho implementado na classe lib/Adianti/Base/TStandardSeek.php função onSelect:
  1. <?php     
  2.  public static function onSelect($param)
  3.     {
  4.         $key $param['key'];
  5.         $database      = isset($param['database'])      ? $param['database']      : TSession::getValue('standard_seek_database');
  6.         $receive_key   = isset($param['receive_key'])   ? $param['receive_key']   : TSession::getValue('standard_seek_receive_key');
  7.         $receive_field = isset($param['receive_field']) ? $param['receive_field'] : TSession::getValue('standard_seek_receive_field');
  8.         $display_field = isset($param['display_field']) ? $param['display_field'] : TSession::getValue('standard_seek_display_field');
  9.         $parent        = isset($param['parent'])        ? $param['parent']        : TSession::getValue('standard_seek_parent');
  10.         $seek_mask     = isset($param['mask'])          ? $param['mask']          : TSession::getValue('standard_seek_mask');
  11.         
  12.         try
  13.         {
  14.             TTransaction::open($database);
  15.             // load the active record
  16.             $model = isset($param['model']) ? $param['model'] : TSession::getValue('standard_seek_model');
  17.             
  18.             $pk constant("{$model}::PRIMARYKEY");
  19.                     
  20. // ************************************************************************************************** 
  21. // * Trecho de código alterado para considerar TCriteria no onChange do TDBSeekButton               *
  22. // ************************************************************************************************** 
  23.             $repository = new TRepository($model);
  24.             
  25.             $criteria = new TCriteria();
  26.             
  27.             if (isset($param['criteria']))
  28.             {
  29.                 $criteria unserialize(base64_decode($param['criteria']));    
  30.             }
  31.             
  32.             $criteria->add(new TFilter($pk'='$key));
  33.             
  34.             $objects $repository->load($criteria);
  35.             
  36.             if (isset($objects[0]))
  37.             {
  38.                 $activeRecord $objects[0];
  39.             } 
  40.             else
  41.             {
  42.                 $activeRecord = new $model(NULL); 
  43.             }
  44. // ************************************************************************************************** 
  45. // * Fim da alteração                                                                               *
  46. // **************************************************************************************************             
  47.             
  48.             // $activeRecord = new $model($key); //Original
  49.             
  50.             $object = new StdClass;
  51.             $object->$receive_key = isset($activeRecord->$pk) ? $activeRecord->$pk '';
  52.             
  53.             if (!empty($seek_mask))
  54.             {
  55.                 $object->$receive_field $activeRecord->render($seek_mask);
  56.             }
  57.             else
  58.             {
  59.                 $object->$receive_field = isset($activeRecord->$display_field) ? $activeRecord->$display_field '';
  60.             }
  61.             
  62.             TTransaction::close();
  63.             
  64.             TForm::sendData($parent$object);
  65.             parent::closeWindow(); // closes the window 
  66.         }
  67.         catch (Exception $e// in case of exception
  68.         {
  69.             // clear fields
  70.             $object = new StdClass;
  71.             $object->$receive_key   '';
  72.             $object->$receive_field '';
  73.             TForm::sendData($parent$object);
  74.             
  75.             // undo all pending operations
  76.             TTransaction::rollback();
  77.         }
  78.     }
  79. ?>

RS

Uma correção de um erro encontrado em testes:
  1. <?php
  2.    public static function onSelect($param)
  3.     {
  4.         $key $param['key'];
  5.         $database      = isset($param['database'])      ? $param['database']      : TSession::getValue('standard_seek_database');
  6.         $receive_key   = isset($param['receive_key'])   ? $param['receive_key']   : TSession::getValue('standard_seek_receive_key');
  7.         $receive_field = isset($param['receive_field']) ? $param['receive_field'] : TSession::getValue('standard_seek_receive_field');
  8.         $display_field = isset($param['display_field']) ? $param['display_field'] : TSession::getValue('standard_seek_display_field');
  9.         $parent        = isset($param['parent'])        ? $param['parent']        : TSession::getValue('standard_seek_parent');
  10.         $seek_mask     = isset($param['mask'])          ? $param['mask']          : TSession::getValue('standard_seek_mask');
  11.         
  12.         try
  13.         {
  14.             TTransaction::open($database);
  15.             // load the active record
  16.             $model = isset($param['model']) ? $param['model'] : TSession::getValue('standard_seek_model');
  17.             
  18.             $pk constant("{$model}::PRIMARYKEY");
  19.                     
  20. // ************************************************************************************************** 
  21. // * Trecho de código alterado para considerar TCriteria no onChange do TDBSeekButton               *
  22. // ************************************************************************************************** 
  23.             $repository = new TRepository($model);
  24.             
  25.             if (isset($param['criteria']))
  26.             {
  27.                 $criteria unserialize(base64_decode($param['criteria']));    
  28.             }
  29.             
  30.             if(empty($criteria)) 
  31.             {
  32.                 $criteria = new TCriteria();            
  33.             }
  34.             
  35.             $criteria->add(new TFilter($pk'='$key));
  36.             
  37.             $objects $repository->load($criteria);
  38.             
  39.             if (isset($objects[0]))
  40.             {
  41.                 $activeRecord $objects[0];
  42.             } 
  43.             else
  44.             {
  45.                 $activeRecord = new $model(NULL); 
  46.             }
  47. // ************************************************************************************************** 
  48. // * Fim da alteração                                                                               *
  49. // **************************************************************************************************             
  50.             
  51.             // $activeRecord = new $model($key); //Original
  52.             
  53.             $object = new StdClass;
  54.             $object->$receive_key = isset($activeRecord->$pk) ? $activeRecord->$pk '';
  55.             
  56.             if (!empty($seek_mask))
  57.             {
  58.                 $object->$receive_field $activeRecord->render($seek_mask);
  59.             }
  60.             else
  61.             {
  62.                 $object->$receive_field = isset($activeRecord->$display_field) ? $activeRecord->$display_field '';
  63.             }
  64.             
  65.             TTransaction::close();
  66.             
  67.             TForm::sendData($parent$object);
  68.             parent::closeWindow(); // closes the window 
  69.         }
  70.         catch (Exception $e// in case of exception
  71.         {
  72.             // clear fields
  73.             $object = new StdClass;
  74.             $object->$receive_key   '';
  75.             $object->$receive_field '';
  76.             TForm::sendData($parent$object);
  77.             
  78.             // undo all pending operations
  79.             TTransaction::rollback();
  80.         }
  81.     }
  82.     
  83.     /**
  84.      * Show page
  85.      */
  86.     public function show()
  87.     {
  88.         parent::setIsWrapped(true);
  89.         $this->run();
  90.         $this->render();
  91.         $this->fill();
  92.         parent::show();
  93.     }
  94. }
  95. ?>
RS

Olá pessoal,

Acredito que momento ninguém se interessou em colaborar comigo,

porém se algum dia precisar não vai quebrar a cabeça, segue resolução completa e corrigida.

Toda a solução foi por injection, não criei nenhuma nova função e não alterei nenhuma variavél das classes, apenas injetei um código adicional.

*Da correção: Ocorreu que quando carregava a página também não executava os filtros TCriteria, então foi necessário o TSeekButton,

Substituindo as funções abaixo nas suas respectivas classes deve funcionar.

Override da função onSelect() na classe TStandardSeek:
  1. <?php
  2.     public static function onSelect($param)
  3.     {
  4.         $key $param['key'];
  5.         $database      = isset($param['database'])      ? $param['database']      : TSession::getValue('standard_seek_database');
  6.         $receive_key   = isset($param['receive_key'])   ? $param['receive_key']   : TSession::getValue('standard_seek_receive_key');
  7.         $receive_field = isset($param['receive_field']) ? $param['receive_field'] : TSession::getValue('standard_seek_receive_field');
  8.         $display_field = isset($param['display_field']) ? $param['display_field'] : TSession::getValue('standard_seek_display_field');
  9.         $parent        = isset($param['parent'])        ? $param['parent']        : TSession::getValue('standard_seek_parent');
  10.         $seek_mask     = isset($param['mask'])          ? $param['mask']          : TSession::getValue('standard_seek_mask');
  11.         try
  12.         {  
  13.             TTransaction::open($database);
  14.             // load the active record
  15.             $model = isset($param['model']) ? $param['model'] : TSession::getValue('standard_seek_model');
  16.             //$activeRecord = new $model($key);
  17.             
  18.             $pk constant("{$model}::PRIMARYKEY");     
  19.                    
  20. // ************************************************************************************************** 
  21. // * Trecho de código alterado para considerar TCriteria no onExit do TDBSeekButton               *
  22. // ************************************************************************************************** 
  23.             $repository = new TRepository($model);
  24.             
  25.             if (isset($param['criteria']))
  26.             {
  27.                $criteria unserialize(base64_decode($param['criteria']));    
  28.             }
  29.             
  30.             if(empty($criteria)) 
  31.             {
  32.                  $criteria TSession::getValue('standard_seek_criteria');            
  33.             }
  34.             
  35.             if(empty($criteria)) 
  36.             {
  37.                  $criteria = new TCriteria();            
  38.             }
  39.             
  40.             $criteria->add(new TFilter($pk'='$key));
  41.             
  42.             $objects $repository->load($criteria);
  43.             
  44.             if (isset($objects[0]))
  45.             {
  46.                 $activeRecord $objects[0];
  47.             } 
  48.             else
  49.             {
  50.                 $activeRecord = new $model(NULL); 
  51.             }
  52. // ************************************************************************************************** 
  53. // * Fim da alteração                                                                               *
  54. // **************************************************************************************************             
  55.             
  56.             $object = new StdClass;
  57.             $object->$receive_key   = isset($activeRecord->$pk) ? $activeRecord->$pk '';
  58.             
  59.             if (!empty($seek_mask))
  60.             {
  61.                 $object->$receive_field $activeRecord->render($seek_mask);
  62.             }
  63.             else
  64.             {
  65.                 $object->$receive_field = isset($activeRecord->$display_field) ? $activeRecord->$display_field '';
  66.             }
  67.             
  68.             TTransaction::close();
  69.             
  70.             TForm::sendData($parent$object);
  71.             parent::closeWindow(); // closes the window
  72.         }
  73.         catch (Exception $e// in case of exception
  74.         {
  75.             // clear fields
  76.             $object = new StdClass;
  77.             $object->$receive_key   '';
  78.             $object->$receive_field '';
  79.             TForm::sendData($parent$object);
  80.             
  81.             // undo all pending operations
  82.             TTransaction::rollback();
  83.         }
  84.     }
  85. ?>


Override da função show() na classe TSeekButton:
  1. <?php
  2. public function show()
  3.     {  
  4.         // check if it's not editable
  5.         if (parent::getEditable())
  6.         {
  7.             if (!TForm::getFormByName($this->formName) instanceof TForm)
  8.             {
  9.                 throw new Exception(AdiantiCoreTranslator::translate('You must pass the ^1 (^2) as a parameter to ^3'__CLASS__$this->name'TForm::setFields()') );
  10.             }
  11.             
  12.             $serialized_action '';
  13.             if ($this->action)
  14.             {
  15.                 // get the action class name
  16.                 if (is_array($callback $this->action->getAction()))
  17.                 {
  18.                     if (is_object($callback[0]))
  19.                     {
  20.                         $rc = new ReflectionClass($callback[0]);
  21.                         $classname $rc->getShortName();
  22.                     }
  23.                     else
  24.                     {
  25.                         $classname  $callback[0];
  26.                     }
  27.                     
  28.                     if ($this->useOutEvent)
  29.                     {
  30.                         $inst       = new $classname;
  31.                         $ajaxAction = new TAction(array($inst'onSelect'));
  32.                         
  33.                         if (in_array($classname, array('TStandardSeek')))
  34.                         {
  35.                             $ajaxAction->setParameter('parent',  $this->action->getParameter('parent'));
  36.                             $ajaxAction->setParameter('database',$this->action->getParameter('database'));
  37.                             $ajaxAction->setParameter('model',   $this->action->getParameter('model'));
  38.                             $ajaxAction->setParameter('display_field'$this->action->getParameter('display_field'));
  39.                             $ajaxAction->setParameter('receive_key',   $this->action->getParameter('receive_key'));
  40.                             $ajaxAction->setParameter('receive_field'$this->action->getParameter('receive_field'));
  41.                             $ajaxAction->setParameter('criteria',      $this->action->getParameter('criteria'));
  42.                             $ajaxAction->setParameter('mask',          $this->action->getParameter('mask'));
  43.                             $ajaxAction->setParameter('operator',      $this->action->getParameter('operator') ? $this->action->getParameter('operator') : 'like');                                             
  44.                         }
  45.                         else
  46.                         {
  47.                             if ($actionParameters $this->action->getParameters())
  48.                             {
  49.                                 foreach ($actionParameters as $key => $value
  50.                                 {
  51.                                     $ajaxAction->setParameter($key$value);
  52.                                 }                            
  53.                             }                                          
  54.                         }
  55.                         $ajaxAction->setParameter('form_name',  $this->formName);
  56.                         
  57.                         $string_action $ajaxAction->serialize(FALSE);
  58.                         $this->setProperty('seekaction'"__adianti_post_lookup('{$this->formName}', '{$string_action}', '{$this->id}', 'callback')");
  59.                         $this->setProperty('onBlur'$this->getProperty('seekaction'), FALSE);
  60.                     }
  61.                 }
  62.                 $this->action->setParameter('field_name'$this->name);
  63.                 $this->action->setParameter('form_name',  $this->formName);
  64.                 $serialized_action $this->action->serialize(FALSE);
  65.             }
  66.             
  67.             $this->button->{'onclick'} = "javascript:serialform=(\$('#{$this->formName}').serialize());__adianti_append_page('engine.php?{$serialized_action}&'+serialform)"
  68.             
  69. // ************************************************************************************************** 
  70. // * Trecho de código alterado para considerar TCriteria no onshow do TDBSeekButton               *
  71. // ************************************************************************************************** 
  72.             $model        $this->action->getParameter('model');
  73.             $database     $this->action->getParameter('database');
  74.             $pk           constant("{$model}::PRIMARYKEY"); 
  75.             $receivefield $this->action->getParameter('receive_field'); 
  76.             $display      $this->action->getParameter('display_field');
  77.             $key          $this->value;
  78.             $criteria     = new TCriteria();
  79.             
  80.             TTransaction::open($database);
  81.             
  82.             $repository = new TRepository($model);
  83.             
  84.             if (unserialize(base64_decode($this->action->getParameter('criteria'))))
  85.             {
  86.                $criteria unserialize(base64_decode($this->action->getParameter('criteria'))); 
  87.             }             
  88.             $criteria->add(new TFilter($pk'='$key));
  89.             $objects $repository->load($criteria);
  90.         
  91.             if (isset($objects[0]))
  92.             {
  93.                 $activeRecord $objects[0];
  94.             } 
  95.             else
  96.             {
  97.                 $activeRecord = new $model(NULL); 
  98.             }  
  99.             
  100.             if ($this->hasAuxiliar())
  101.             {
  102.                 $this->auxiliar->{'value'} = $activeRecord->$display;
  103.             }
  104.             
  105.             TTransaction::close();
  106.             
  107. // ************************************************************************************************** 
  108. // * Fim da alteração                                                                               *
  109. // **************************************************************************************************                   
  110.                   
  111.             $wrapper = new TElement('div');
  112.             $wrapper->{'class'} = 'tseek-group';
  113.             $wrapper->open();
  114.             parent::show();
  115.             $this->button->show();
  116.             if ($this->auxiliar)
  117.             {
  118.                 $this->auxiliar->show();
  119.             }
  120.             $wrapper->close();
  121.         }
  122.         else
  123.         {
  124.             parent::show();
  125.         }
  126.     }
  127. ?>
DE

I know this is one of the most meaningful information for me. And I'm animated reading your article. But it's a good thing, the website is perfect; the articles are great. Thanks for the tone of tangible and possible help.
<a href="https://www.thedubai2020.com/skydive-dubai/">Sky Dive Dubai</a>