Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Criteria com filtro de subselect por login Estou tentando criar um filtro para um TDBCombo, onde o mesmo só pode trazer as informações referente ao login, no entanto o sistema me traz um erro que aparentemente não condiz. Abaixo segue uma parte do codigo, ...
MC
Criteria com filtro de subselect por login  
Fechado
Estou tentando criar um filtro para um TDBCombo, onde o mesmo só pode trazer as informações referente ao login, no entanto o sistema me traz um erro que
aparentemente não condiz.

Abaixo segue uma parte do codigo,

  1. <?php>
  2.         $login = TSession::getValue('login');
  3.         $critblc = new TCriteria;
  4.         $critblc->add(new TFilter('BLC_ID', 'IN', "( select LUN_BLOCO from TBL_LOGINXUNID where LUN_LOGIN = '{$login}' order by LUN_BLOCO )")); 
  5. //        $critblc->setProperty('order','BLC_ID');       
  6.         $OCO_BLOCO   = new TDBCombo('OCO_BLOCO','BD_MKSGC_SanMarco','TblBloco','BLC_ID','BLC_ID','BLC_ID', $critblc );
  7. ?>


Segue em anexo a mensagem de erro

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


AC

Porque na imagem mostra LUN_LOGIN = '01703' ? Essas "" não estão gerando o erro?

Testa: $critblc->add(new TFilter('BLC_ID', 'IN', '( select LUN_BLOCO from TBL_LOGINXUNID where LUN_LOGIN = '. $login .' order by LUN_BLOCO)'));
MC

Na verdade o Select esta correto por se tratar de um campo texto, se pegar o valor e levar para a base e consultar ele irá trazer o valor

O que esta faltando ai seria o array;

$critblc->add(new TFilter('BLC_ID', 'IN', array("( select LUN_BLOCO from TBL_LOGINXUNID where LUN_LOGIN = '{$login}' order by LUN_BLOCO )")));

para este tipo de criteria seria algo assim

$critblc->add(new TFilter('BLC_ID', 'IN', array("( select LUN_BLOCO from TBL_LOGINXUNID where LUN_LOGIN = '{$login}' order by LUN_BLOCO )")));


com o retorno do select deveria ficar algo assim

$critblc->add(new TFilter(BLC_ID', 'IN', array('1', '7', '10')));
AC

Era sobre as "barras invertidas" que eu falava, achei que elas estavam passando na query e gerando erro. Está funcionando agora? Chegou a testar o código que eu passei? Deu erro também?
MC

Bom dia

Sim alexandre tambem testei, o problema é que gera um select correto, mas quando não retorna nada ou da o erro.
MC

Alexandre, boa tarde

Consegui ver qual o select que o sistema esta gerando, segue abaixo

SELECT * FROM TBL_BLOCO WHERE (BLC_ID IN ('( select LUN_BLOCO from TBL_LOGINXUNID where LUN_LOGIN = '01703' order by LUN_BLOCO )')) ORDER BY BLC_ID


do jeito que esta não funciona, no entanto se tirarmos as aspas simples antes do segundo select e antes do order funciona. agora resta saber como tirar elas...
AC

As únicas vezes que usei esses filtros, fiz daquela forma que te passei como exemplo. Não tenho muita prática no adianti. Se tu mudar as aspas duplas para simples o que acontece?
MC

Fica a mesma coisa, o interessante é que o valor passado '01703' é uma string e como tal esta certa.

Já tentei varias formas, usando funções e tudo mais... do jeito que tá não retorna valores, vou mudar a forma de buscar esta informação;
MC

Alexandre,

Resolvi o problema.... kkkkk ;))))1

mas... de outra forma, criei View no banco para solucionar o problema até que algum dia alguém possa lucidar este caso.

Fica aberta a questão e espero que alguém possa nos ajudar.

Abraços e obrigado pela ajuda.
AC

Parabéns! É uma boa alternativa.
PD

People,

Tem soluções mais simples, está no livro e no tutor:
www.adianti.com.br/framework_files/tutor/index.php?class=CriteriaVie

Para funcionar subquery, ela deve começar com "abre parêntesis" e um SELECT maiúsculo colado:
$criteria->add(new TFilter('id', 'IN', '(SELECT customer_id FROM purchases)'));
daí ele não gera aspas.

Tem um outro caminho, que é usando o NOESC:
$criteria->add(new TFilter('birthdate', '<=', "NOESC:date(now()) - '2 years'::interval"));

abraço!