Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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... $criteria = new TCriteria(); $criteria->add(new TFilter('ativo', '=', 'S')); $crite...
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...

$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

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (3)


LG

Bom dia ricardo, para conseguir o que pretente é necessario utilizar mais de um TCriteria veja:

  1. <?php
  2.     $criteria1 = new TCriteria();
  3.     $criteria1->add(new TFilter('ativo''=''S'));
  4.     $criteria1->add(new TFilter('tipmov''='0) );
  5.     
  6.     $criteria2 = new TCriteria();
  7.     $criteria2->add(new TFilter('tipmov''>'16));
  8.     
  9.     $criteria = new TCriteria();
  10.     $criteria->add($criteria1TExpression::OR_OPERATOR );
  11.     $criteria->add($criteria2TExpression::OR_OPERATOR );
  12. ?>


Na dúvida execute:
  1. <?php 
  2. echo $criteria->dump();
  3. ?>

Resultado:
((ativo = 'S' AND tipmov = 0) OR (tipmov > 16))

LG

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)
RV

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...
$criteria1 = new TCriteria(); $criteria1->add(new TFilter('ativo', '=', 'S')); $criteria2 = new TCriteria(); $criteria2->add(new TFilter('tipmov', '=', 0) ); $criteria2->add(new TFilter('tipmov', '>', 16), TExpression::OR_OPERATOR); $criteria = new TCriteria(); $criteria->add($criteria1 ); $criteria->add($criteria2 );


Att
Ricardo