[RESOLVIDO] Filtro em campo group_concat

Fala pessoal!

Alguém pode me ajudar nesse caso?!

Tenho um campo que é um group_concat de vários cursos, então quero criar um filtro com vários checkboxs (um com o nome de cada curso) para filtrar valores nesse campo group_concat.

A princípio, criei vários checkboxs nesse único campo group_concat, porém, quando marco 2 ou mais opções dos checkboxs o WHERE não filtra aqueles registros como mais de um checkbox marcado.

Exemplo: O usuário tem cadastro em 2 cursos (Word e Excel), daí no filtro eu marco apenas Word e dá certo, mas quando marco os cursos Word e Excel, ele não é listado.

Então, depois disso, criei campos virtuais (curso1, curso2…) para filtrar o valor deles no campo group_concat… Fiz assim:

Evento onValidate:
[var_campoA] = {campoA};

Evento onScriptInit:
if ({campoA} = ‘valor’) {
if(empty({sc_where_current})){
sc_select_where(add) = " WHERE campoB = [var_campoA] ";
}else{
sc_select_where(add) = " AND campoB = [var_campoA] ";
}
}

Mas não faz o WHERE…

Logo, preciso de ajuda em algum dos dois casos ou algum outro norte…

Valeu!!

1 Curtida

Colocou em modo debug?

1 Curtida

Coloquei, porém a cláusula WHERE nem aparece no SELECT no caso da utilização da macro sc_select_where.

1 Curtida

E no caso dos checkboxs no próprio campo group_concat, o WHERE funciona, aparece assim:
nm_sel_esp where ( conhecimento_finalizado in (‘Word’,‘Excel’) ).

Porém, o registro que possui os 2 cursos não é listado e já alternei entre AND e OR, mas nada de listar.

1 Curtida

You are missing an =, it should be if ({fieldA} == ‘value’)

1 Curtida

i’ve made the modify, but nothing…

1 Curtida

you have an other syntax mistake

if (empty({sc_where_current})) {

1 Curtida

I checked, but still… doesn’t work

1 Curtida

onValidate is executed after onScriptInit, are you sure that the app is going back to onScriptInit after onValidate is call

1 Curtida

The app is a grid with filter and the filter is initial app… So I don’t know exactly (but i think) back to onScriptInit… or no? :confused:

1 Curtida

There is no onValidate on a grid, maybe you should try it in onHeader

1 Curtida

I applicated on filter… I need this on filter

1 Curtida

I don’t know if this macro is available there

Maybe you can try to set

[var_campoA] = ‘’; in onApplicationInit of the grid

Then in onScriptInit of the search

if (strlen([var_campoA]) == 0) {
    [var_campoA] = {fieldA};
}
if ({fieldA} == 'value') {
   if(empty({sc_where_current})){
      sc_select_where(add) = " WHERE campoB = [var_campoA] "; 
   } else{
     sc_select_where(add) = " AND fieldB = [var_campoA] ";
  }

}

1 Curtida

Humm… I’ll to try this, can be work!

1 Curtida

Didn’t work… The field receive the value of [var_campoA], but
continue without to show the clause WHERE on result of search.

1 Curtida

Não costumo interferir em um tópico com ajuda em andamento, mas como vi que se passou o dia e não chegaram em um resultado satisfatório, fiz um exemplo rápido aqui, mas não sei se é isso:

Link do exemplo logo abaixo.

Se for, posto o código do exemplo.

3 Curtidas

Thank you, I don’t see what he is doing wrong

2 Curtidas

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