[RESOLVIDO] Filtro em campo group_concat

Bom dia.

Como o colega disse que possui um group_concat nos cursos dos alunos, imagino que o registro se repete para cada aluno conforme o curso então criei a seguinte tabela:

CREATE TABLE `alunos` (
	`aluno` VARCHAR(50) NULL DEFAULT NULL,
	`curso` VARCHAR(15) NULL DEFAULT NULL 
)
ENGINE=InnoDB
;

Inseri alguns dados como demonstra a figura:

Para montar a grid criei uma view em cima da tabela alunos, isso facilitará alguns processos:

CREATE OR REPLACE 
 ALGORITHM  = UNDEFINED  VIEW  view_alunos  AS 
SELECT
a.aluno as Aluno,
(    
      SELECT GROUP_CONCAT (b.curso) 
      FROM alunos b 
      WHERE b.aluno = a.aluno
) AS Cursos,
a.curso AS Curso
FROM alunos a
ORDER BY a.aluno, a.curso

SQL da aplicação Grid:

SELECT 
aluno, 
cursos,
curso
FROM view_alunos
GROUP BY aluno

Criar campo manual no filtro avançado:

onScriptInit:

//echo "<pre>";
//print_r({cursosSel});
//echo "</pre>";

$where = '';
$cursos = '';
if ({cursosSel}) {
	foreach ({cursosSel} as $valor) {
            $curso = explode('##@@',$valor);
            $cursos .= "'{$curso[0]}',";
	}

    $cursos = trim($cursos,',');
    $where = " curso in ($cursos) ";
}

if ($where) {
	if(empty({sc_where_current})){
 		sc_select_where(add) = " WHERE $where ";
	}else{
  		sc_select_where(add) = " AND $where";
	}
}

onRecord: (frescura)

$_cursos = {cursos};

if ({cursosSel}) {
	foreach ({cursosSel} as $valor) {
		$curso = explode('##@@',$valor);
		$_curso = $curso[0];
		$_cursos = str_replace($_curso,'<b>'.$_curso.'</b>', $_cursos );
	}
}

{cursos} = $_cursos;
2 Curtidas

Jean-Luc, I’d like to thank you for all your help!! :handshake:

1 Curtida

Caro Haroldo, primeiramente, gostaria de expressar minha admiração por sua pessoa, não apenas pela ajuda que sempre presta a todos por aqui, mas também pelo seu profissionalismo de alto nível e altruísmo raro… Hoje em dia, com o tempo cada vez mais escasso, encontrar pessoas assim renova as esperanças por dias melhores, além de nos incentivar a fazer o mesmo, a levar o belo exemplo em frente.
Quanto ao meu problema, você não só entendeu perfeitamente o que eu tentei explicar, como dispendeu seu precioso tempo pra fazer um exemplo que resolveu em 100% a questão.
Muito obrigado pela ajuda, paciência e atenção de sempre.
Agora vou cuidar em implementar em meu projeto.
Forte abraço!

3 Curtidas

Fala Haroldo!

Estou querendo colocar outros campos com a mesma estrutura, porém não estou conseguindo, pois o filtro sempre traz apenas o último WHERE marcado e não traz os outros marcados…
O motivo eu até sei que foi porque eu apenas acrescentei a mesma estrutura de if em sequência, porém não sei como encaixaria na mesma condição que você criou.
Como devo fazer?

Obrigado!

1 Curtida

Condições de filtro?

Basta usar a macro sc_select_filter no evento onscriptinit para melhorar a criação do Where.

Ao pensar em uma aplicação faça análise detalhada e completa dela para que a estratégia aplicada funcione definitivamente.

Implementações posteriores podem requerer refazer tudo que já funcionava.

1 Curtida

Opa! Farei isso!

Obrigado mais uma vez!!

1 Curtida

Boa noite, Haroldo!

Tentei implementar essa solução que você apresentou em outro projeto com seis campos virtuais do filtro, mas até agora não consegui concatenar os Where.

Poderia me dar um norte?

PS: Tentei utilizar a cláusula sc_where_filter, mas ela não retorna o Where dos campos virtuais.

1 Curtida

Campos virtuais no filtro?

A macro só retorna a condição Where criado por colunas no filtro válidas no SQL.

Precisa descrever claramente a analise de sua necessidade.

Tudo é questão de lógica.

O exemplo inicial que criei para vc foi baseado nas informações iniciais que postou no tópico.

Necessidades adicionais precisa ver se não entram em conflito com o que foi feito inicialmente.

1 Curtida

Nesse meu caso, criei uma view para uma grid contendo seis campos concatenados (idioma, deficiencia, habilitacao, atividades, ferramentas, transporte), daí criei os seis campos virtuais (checkbox) no filtro para que estes possam filtrar os valores selecionados.
Foi então que estagnei na lógica… não soube concatenar os campos selecionados para adicionar Where ou AND e formar a condição Where principal.

Não sei se consegui explicar bem…

1 Curtida

O exemplo que criei não ajuda não lógica para criação de outras apps?

1 Curtida

Ajudou demais, inclusive conclui um projeto pegando seu exemplo e já estou utilizando ele nesse outro, porém a dúvida é como aplicar a lógica que vc criou em mais de um campo no mesmo projeto, é nisso que estou batendo cabeça agora.

1 Curtida

Quando replico o código, implementando outra condição, a aplicação só implementa o último campo selecionado. Não estou conseguindo montar uma lógica em que a aplicação execute todos os filtros selecionados e forme um só Where principal.

1 Curtida

com ifs para ver se o campo está vazio e concatenando a condição

1 Curtida

Então, se eu fizer um if(empty({sc_where_current} && {campo_virtual_do_filtro})) a aplicação consegue identificar também se o checkbox {campo_virtual_do_filtro} foi marcado ou não?

1 Curtida

antes de mais nada de um var_dump nos campos dos filtros para vc saber como eles são marcados e como o SC monta seus valores

1 Curtida

Pronto! farei isso e vou tentar construir as condições a partir dos campos virtuais e volto a falar depois das tentativas. Obrigado!!

1 Curtida

Bom dia, Haroldo!
Depois de muita luta, consegui implementar uma lógica que me atendeu…
Joguei as variáveis contendo o Where de cada campo virtual, acrescentando um AND ao final de cada, em seguida coloquei tais variáveis numa nova variável e ocultei o último AND da string gerada.
E está rodando bacana demais, porém, estão aparecendo mensagens acima da consulta, referentes às variáveis indefinidas antes dos campos selecionados:
“Atenção Undefined variable: $variavel”

Como posso ocultar essas mensagens?

1 Curtida

crie essa variável vazia na primeira linha do evento.
Feliz por ter chegado a uma lógica que atenda sua necessidade, com isso, sobe uma patamar na programação e terá mais facilidade no desenvolvimento de outras aplicações com situações parecidas.

1 Curtida

Opa! Farei isso!!
Aproveito pra agradecer as felicitações, vindo de um mestre, representa muito.
Agradeço também a todos aqueles que contribuem com quem apresenta suas dificuldades neste fórum extremamente funcional.

Forte abraço!!

1 Curtida

Exemplo da utilização de campos virtuais e como tratar seus valores para filtrar corretamente na consulta.

TAGS [ HAROLDO CAMPOS VIRTUAL VIRTUAIS FILTRO GRID] .

1 Curtida