RV
Dúvida TDBUniqueSearch com TExpression::OR_OPERATOR
Bom dia,
acho que minha dúvida deve ser fácil, parece ser algum pequeno detalhe... :-)
Estou usando um TDBUniqueSearch, mas ao tentar usar um objeto TCriteria contendo OR_OPERATOR,
o filtro não está funcionando, retorna sempre todos os registros da tabela quando digita mais de 3 caractere...
Abaixo, até implementei uma simples função pra ver o comando SQL, e retorna corretamente o código esperado...
SELECT id,nome FROM funcionario WHERE (ativo = 'S' AND tipmov = 0 OR tipmov > 16) ORDER BY nome
Att
Ricardo
acho que minha dúvida deve ser fácil, parece ser algum pequeno detalhe... :-)
Estou usando um TDBUniqueSearch, mas ao tentar usar um objeto TCriteria contendo OR_OPERATOR,
o filtro não está funcionando, retorna sempre todos os registros da tabela quando digita mais de 3 caractere...
$criteria = new TCriteria();
$criteria->add(new TFilter('ativo', '=', 'S'));
$criteria->add(new TFilter('tipmov', '=', 0) );
$criteria->add(new TFilter('tipmov', '>', 16), TExpression::OR_OPERATOR );
$criteria->setProperty('order', 'nome');
$matricula = new TDBUniqueSearch('matricula[]', 'efetividade', 'FuncionarioRecord', 'id', 'nome', 'nome', $criteria);
Abaixo, até implementei uma simples função pra ver o comando SQL, e retorna corretamente o código esperado...
SELECT id,nome FROM funcionario WHERE (ativo = 'S' AND tipmov = 0 OR tipmov > 16) ORDER BY nome
public function testeCriteria()
{
$criteria = new TCriteria();
$criteria->add(new TFilter('ativo', '=', 'S'));
$criteria->add(new TFilter('tipmov', '=', 0) );
$criteria->add(new TFilter('tipmov', '>', 16), TExpression::OR_OPERATOR );
$criteria->setProperty('order', 'nome');
$sql = new TSqlSelect();
$sql->setEntity('funcionario');
$sql->addColumn('id');
$sql->addColumn('nome');
$sql->setCriteria($criteria);
TTransaction::open('intranet');
$s = $sql->getInstruction();
TTransaction::close();
parent::add($s);
}
Att
Ricardo
Bom dia ricardo, para conseguir o que pretente é necessario utilizar mais de um TCriteria veja:
Na dúvida execute:
Resultado:
no seu select:
SELECT id,nome FROM funcionario WHERE (ativo = 'S' AND tipmov = 0 OR tipmov > 16)
você não organizou com parenteses :
pois podemos ter varias interpretações:
(ativo = 'S' AND tipmov = 0) OR (tipmov > 16)
(ativo = 'S') AND (tipmov = 0 OR tipmov > 16)
Blz....
valeu valeu... eu to muito louco... :-)
como eu disse, parecia ser simples mesmo...
A consulta mesmo (regra de outro sistema de onde vêm as informações) que eu precisava era essa
SELECT id,nome FROM funcionario WHERE ((ativo = 'S') AND (tipmov = 0 OR tipmov > 16))
E consegui resolver o problema assim...
Att
Ricardo