RS
Duvida TDBSeekButton
Bom dia amigos,
Preciso de um auxilio se possivel,
Tenho uma tabela com a seguinte estrutura:
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?
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?
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:
Uma correção de um erro encontrado em testes:
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:
Override da função show() na classe TSeekButton:
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>