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,
$login = TSession::getValue('login'); $critblc = new TCriteria; $critblc->add(new TFilter('BLC_ID', 'IN', "( select LUN_BLOCO from TBL_LOGINXUNID where LUN_LOGIN = '{$login}' order by LUN_BLOCO )")); // $critblc->setProperty('order','BLC_ID'); $OCO_BLOCO = new TDBCombo('OCO_BLOCO','BD_MKSGC_SanMarco','TblBloco','BLC_ID','BLC_ID','BLC_ID', $critblc ); ?>
Segue em anexo a mensagem de erro
aparentemente não condiz.
Abaixo segue uma parte do codigo,
- <?php>
Segue em anexo a mensagem de erro
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)'));
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')));
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?
Bom dia
Sim alexandre tambem testei, o problema é que gera um select correto, mas quando não retorna nada ou da o erro.
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...
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?
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;
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.
Parabéns! É uma boa alternativa.
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!