[RESOLVIDO] Filtro em campo group_concat

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

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