Conheça as melhorias da versão 8.0, 8.1, 8.2!
Clique aqui para saber mais
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 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 (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. try
  12. {
  13. TTransaction::open($database);
  14. // load the active record
  15. $model = isset($param['model']) ? $param['model'] : TSession::getValue('standard_seek_model');
  16. $pk = constant("{$model}::PRIMARYKEY");
  17. // **************************************************************************************************
  18. // * Trecho de código alterado para considerar TCriteria no onChange do TDBSeekButton *
  19. // **************************************************************************************************
  20. $repository = new TRepository($model);
  21. $criteria = new TCriteria();
  22. if (isset($param['criteria']))
  23. {
  24. $criteria = unserialize(base64_decode($param['criteria']));
  25. }
  26. $criteria->add(new TFilter($pk, '=', $key));
  27. $objects = $repository->load($criteria);
  28. if (isset($objects[0]))
  29. {
  30. $activeRecord = $objects[0];
  31. }
  32. else
  33. {
  34. $activeRecord = new $model(NULL);
  35. }
  36. // **************************************************************************************************
  37. // * Fim da alteração *
  38. // **************************************************************************************************
  39. // $activeRecord = new $model($key); //Original
  40. $object = new StdClass;
  41. $object->$receive_key = isset($activeRecord->$pk) ? $activeRecord->$pk : '';
  42. if (!empty($seek_mask))
  43. {
  44. $object->$receive_field = $activeRecord->render($seek_mask);
  45. }
  46. else
  47. {
  48. $object->$receive_field = isset($activeRecord->$display_field) ? $activeRecord->$display_field : '';
  49. }
  50. TTransaction::close();
  51. TForm::sendData($parent, $object);
  52. parent::closeWindow(); // closes the window
  53. }
  54. catch (Exception $e) // in case of exception
  55. {
  56. // clear fields
  57. $object = new StdClass;
  58. $object->$receive_key = '';
  59. $object->$receive_field = '';
  60. TForm::sendData($parent, $object);
  61. // undo all pending operations
  62. TTransaction::rollback();
  63. }
  64. }
  65. ?>

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. try
  12. {
  13. TTransaction::open($database);
  14. // load the active record
  15. $model = isset($param['model']) ? $param['model'] : TSession::getValue('standard_seek_model');
  16. $pk = constant("{$model}::PRIMARYKEY");
  17. // **************************************************************************************************
  18. // * Trecho de código alterado para considerar TCriteria no onChange do TDBSeekButton *
  19. // **************************************************************************************************
  20. $repository = new TRepository($model);
  21. if (isset($param['criteria']))
  22. {
  23. $criteria = unserialize(base64_decode($param['criteria']));
  24. }
  25. if(empty($criteria))
  26. {
  27. $criteria = new TCriteria();
  28. }
  29. $criteria->add(new TFilter($pk, '=', $key));
  30. $objects = $repository->load($criteria);
  31. if (isset($objects[0]))
  32. {
  33. $activeRecord = $objects[0];
  34. }
  35. else
  36. {
  37. $activeRecord = new $model(NULL);
  38. }
  39. // **************************************************************************************************
  40. // * Fim da alteração *
  41. // **************************************************************************************************
  42. // $activeRecord = new $model($key); //Original
  43. $object = new StdClass;
  44. $object->$receive_key = isset($activeRecord->$pk) ? $activeRecord->$pk : '';
  45. if (!empty($seek_mask))
  46. {
  47. $object->$receive_field = $activeRecord->render($seek_mask);
  48. }
  49. else
  50. {
  51. $object->$receive_field = isset($activeRecord->$display_field) ? $activeRecord->$display_field : '';
  52. }
  53. TTransaction::close();
  54. TForm::sendData($parent, $object);
  55. parent::closeWindow(); // closes the window
  56. }
  57. catch (Exception $e) // in case of exception
  58. {
  59. // clear fields
  60. $object = new StdClass;
  61. $object->$receive_key = '';
  62. $object->$receive_field = '';
  63. TForm::sendData($parent, $object);
  64. // undo all pending operations
  65. TTransaction::rollback();
  66. }
  67. }
  68. /**
  69. * Show page
  70. */
  71. public function show()
  72. {
  73. parent::setIsWrapped(true);
  74. $this->run();
  75. $this->render();
  76. $this->fill();
  77. parent::show();
  78. }
  79. }
  80. ?>
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. $pk = constant("{$model}::PRIMARYKEY");
  18. // **************************************************************************************************
  19. // * Trecho de código alterado para considerar TCriteria no onExit do TDBSeekButton *
  20. // **************************************************************************************************
  21. $repository = new TRepository($model);
  22. if (isset($param['criteria']))
  23. {
  24. $criteria = unserialize(base64_decode($param['criteria']));
  25. }
  26. if(empty($criteria))
  27. {
  28. $criteria = TSession::getValue('standard_seek_criteria');
  29. }
  30. if(empty($criteria))
  31. {
  32. $criteria = new TCriteria();
  33. }
  34. $criteria->add(new TFilter($pk, '=', $key));
  35. $objects = $repository->load($criteria);
  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. $object = new StdClass;
  48. $object->$receive_key = isset($activeRecord->$pk) ? $activeRecord->$pk : '';
  49. if (!empty($seek_mask))
  50. {
  51. $object->$receive_field = $activeRecord->render($seek_mask);
  52. }
  53. else
  54. {
  55. $object->$receive_field = isset($activeRecord->$display_field) ? $activeRecord->$display_field : '';
  56. }
  57. TTransaction::close();
  58. TForm::sendData($parent, $object);
  59. parent::closeWindow(); // closes the window
  60. }
  61. catch (Exception $e) // in case of exception
  62. {
  63. // clear fields
  64. $object = new StdClass;
  65. $object->$receive_key = '';
  66. $object->$receive_field = '';
  67. TForm::sendData($parent, $object);
  68. // undo all pending operations
  69. TTransaction::rollback();
  70. }
  71. }
  72. ?>


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