[RESOLVIDO]Como Alterar Dinamicamente o Filtro da Consulta

Bom dia a todos,
Primeiramente quero quero agradecer pois estou usando o fórum a 2 anos e essa é minha segunda pergunta aqui no grupo. Tudo o que tenho pensado em desenvolver encontro aqui na maior parte em dicas que me aperfeiçoaram. Muito obrigado, e sinto por ainda não poder ajudar outros, como sou ajudado. Todos vcs estão de parabéns !!!

Bem, eu tenho uma consulta e preciso mudar dinamicamente o filtro dela, pois pra não abrir os 600.000 registros é prioritário iniciar filtrando pelo menos a digitação do mes corrente:
preparei uma global no onApplicationInit:

$mes = date('m')-1; $ano = date('Y'); $dia = 1; $data = $ano.'/'.$mes.'/'.$dia; [glo_dt_culto] = date('Y-m-d',strtotime($data));

depois eu apliquei no SQL:

WHERE
    id_tipo_membro_triagem IN (2,7) AND culto_data >= '[glo_dt_culto]' 
ORDER BY 
    mb_nome

Até aqui tudo perfeito e funcionando.
Por uma questão de preferência, eu optei em não iniciar a consulta pelo filtro, pra não deixar de visualizar o botão “FILTRAR” dentro da consulta, pois como conheço o nível do usuário que vai consumir isso, preciso deixar tudo bem visível.

Abrindo então o filtro eu encontro minha tela com essas opções:

os campos selecionados {ft_igreja}=‘COM’ e {ft_rede}=‘SEM’ não são campos da minha tabela, foram criados para eu disparar o filtro.

no método onValidate do filtro coloquei:

$var_filtro_mb_triagem = '';
// Discipulador
if ( !empty({ft_discipulador}) ) {
	if ( {ft_discipulador} == 'COM' ){
		$var_filtro_mb_triagem .= " AND !empty(id_discipulador)";
	} else {
		$var_filtro_mb_triagem .= " AND empty(id_discipulador)";
	}
}
// Igreja
if ( !empty({ft_igreja}) ) {
	if ( {ft_igreja} == 'COM' ) {
		$var_filtro_mb_triagem .= " AND !empty(id_igreja)";
	} else {
		$var_filtro_mb_triagem .= " AND empty(id_igreja)";
	}
}
// rede
if ( !empty({ft_rede}) ) {
	if ( {ft_rede} == 'COM' ) {
		$var_filtro_mb_triagem .= " AND !empty(id_rede)";
	} else {
		$var_filtro_mb_triagem .= " AND empty(id_rede)";
	}
}
// distrito
if ( !empty({ft_distrito}) ) {
	if ( {ft_distrito} == 'COM' ) {
		$var_filtro_mb_triagem .= " AND !empty(id_distrito)";
	} else {
		$var_filtro_mb_triagem .= " AND empty(id_distrito)";
	}
}
// area
if ( !empty({ft_area}) ) {
	if ( {ft_area} == 'COM' ) {
		$var_filtro_mb_triagem .= " AND !empty(id_area)";
	} else {
		$var_filtro_mb_triagem .= " AND empty(id_area)";
	}
}
// setor
if ( !empty({ft_setor}) ) {
	if ( {ft_setor} == 'COM' ) {
		$var_filtro_mb_triagem .= " AND !empty(id_setor)";
	} else {
		$var_filtro_mb_triagem .= " AND empty(id_setor)";
	}
}
// celula
if ( !empty({ft_celula}) ) {
	if ( {ft_celula} == 'COM' ) {
		$var_filtro_mb_triagem .= " AND !empty(id_celula)";
	} else {
		$var_filtro_mb_triagem .= " AND empty(id_celula)";
	}
}

// Carrega o Filtro
if ( !empty($var_filtro_mb_triagem) ) {	
	sc_select_where(add) = $var_filtro_mb_triagem ;
}

Ja tentei de várias maneiras, colocando variaveis globais mais não consigo fazer isso funcionar.

uma situação que me ocorreu foi checar {sc_where_atual} !!! bem deveria estar carregada pq eu fiz isso no SQL.
Bem esgotaram as idéias… preciso de ajuda!

Seu filtro um um pouco complexo, mas é possível usando Jquery.

Obrigado pela dica Haroldo… vou pesquisar e descobrir como fazer com Jquery.

Você deve trocar os itens dos campos select via jquery, inspecione os ids dos elementos e usar $(’# id do elemento’).html(’ nova lista de options '); // dentro de tag html

Entendi… vou pegar os ID´s e montar o código… depois montar eu retorno…

O código eu publico no onFooter da minha consulta não é?

tem que ser num evento do filtro.

Então somente sobrou o onValidate do Filtro , porque é nele que vou capturar os valores dos campos…

voce teria uma dica de como posso recarregar o select do SQL da consulta?

inspecionei o botão FILTRAR e ele tem esse código:

<a href="javascript: document.F1.bprocessa.value='pesq'; 
setTimeout(function() {nm_submit_form()}, 200)" id="sc_b_pesq_bot" onclick="document.F1.bprocessa.value='pesq'; 
setTimeout(function() {nm_submit_form()}, 200); return false;" class="scButton_default" title="Pesquisar registros" style="vertical-align: middle; display:inline-block;">Filtrar
</a>

1-Como alterar o valor do filtro que vai ser carregado
2-Como recarregar o form: se é isso {nm_submit_form()}

Estou achando seu problema um pouco complicado. Vou te chamar em particular.

Consegui resolver com uma grande ajuda do professor Haroldo e ficou da seguinte forma:

bem pra completar peguei uma outra informação com o Jailton:

Parte do erro estava aqui, eu descobri da forma mais difícil que um campo “VIRTUAL” não entra na pesquisa do filtro de uma consulta, a não ser via Jquery e ai la vai tempo…

Preparei um filtro inicial, pois minha consulta não inicia pelo filtro, pois eu quero que quando o usuário abra a tela tenha a opção de ter o botão “FILTRAR” na tela, em onScriptInit coloquei o seguinte código:

$mes = date('m')-1;
$ano = date('Y');
$dia = 1;
$data = $ano.'/'.$mes.'/'.$dia;
[glo_dt_culto] = date('Y-m-d',strtotime($data));

// busca o uso do campo {culto_data} na expressão de {sc_where_atual} caso encontre ele remove para não conflitar com o Filtro da Consulta
$pos= strripos( {sc_where_atual}, 'culto_data');
if ($pos === false) {
	$filtro_inicial =  "id_tipo_membro_triagem IN (2,7) AND culto_data >= '[glo_dt_culto]'";
} else { 
	$filtro_inicial =  "id_tipo_membro_triagem IN (2,7) ";	
}

// inicio do filtro padronizado trazendo 1 mês de movimento
if (empty({sc_where_atual})){
	sc_select_where(add) = " WHERE ".$filtro_inicial;
}
else{
	sc_select_where(add) = " AND ".$filtro_inicial;
}

Bem, como campos “VIRTUAIS” não funcionam eu adicionei os campos ao meu SQL usando um ALIAS, criei 7 campos que agora estão na minha VIEW:

   MB_CONTATOWHATSAPP,
    CULTO_DATA,
    mb_discipula   as Sem_Discipulador,
    id_igreja         as Sem_Igreja,
    id_rede          as Sem_Rede,
    id_distrito       as Sem_Distrito,
    id_area          as Sem_Area,
    id_setor         as Sem_Setor,
    id_celula        as Sem_Celula 
FROM
    tbl_membro 

Bem, agora com os novos campos criados, eu fui até FILTROS e adicionei os novos campos e criei lá as condições necessárias pra trazer os valores, tomando cuidado pra não conflitar com o filtro padronizado que foi criado com sc_select_where(add).

Ficou perfeito!!