filtro dinamico

boa tarde pessoal,

pesquisei no forum e continuo a encontrar dificuldade para implementar.

a consulta nao tem um filtro inicial. É um “SELECT campos FROM tabela;” sem nada mais.

dependendo do filtro (é uma opção radio com 3 itens) quero que a grid faça a filtragem.

porem o debug me retorna a sentença sql inalterada em qualquer lugar que a coloco.

vejam, coloquei o codigo abaixo no evento onrecord da consulta, e tambem no onValidate do filtro, de qualquer modo nao muda nada.

por favor, sugestoes… já pesquisei no forum, na ajuda…

[filtro_sql_processos_parados]=" EXISTS (SELECT processoid
FROM lm003procandam
WHERE lm003processos.id = lm003procandam.processoid
AND (DATE(NOW()) - data_movimento)<=30 )";

if (empty({sc_where_atual})){
sc_select_where(add) = "WHERE ".[filtro_sql_processos_parados];
}
else{
sc_select_where(add) = "AND ".[filtro_sql_processos_parados];
}

eta coisa verde dificil de engolir…

se alguem tiver ideas, aceito…

Crie uma aplicação controle e passe a variavel para o select conforme a seleção.

Luiz,

Experimente tirar esse filtro do OnRecord, deixe no OnValidate do filtro, mas desta forma:

if (empty({sc_where_current})){
     sc_select_where(add) = "WHERE ".[filtro_sql_processos_parados];
}
else{
     sc_select_where(add) = "AND ".[filtro_sql_processos_parados];
}

eis a questao… seguinte o que vi no forum, fiz nos conformes.

o sql NAO MUDA… continua normal, ignorando o codigo acima nos devidos eventos.

ele NAO ANEXA UMA CLAUSULA WHERE EM LUGAR ALGUM…

conforme expliquei acima, está correto o evento ?

obrigado george por contestar minha dificuldade

keyber,

ele retorna "SELECT id, tipoprocesso, processo, clienteid, advrespid, contrariaid, arquivado, sigilo from lm003processos LIMIT 0,12 " sem anexar o where.

Luiz,

Desculpa… o correto seria isto:

if (empty({sc_where_orig})){
     sc_select_where(add) = "WHERE ".[filtro_sql_processos_parados];
}
else{
     sc_select_where(add) = "AND ".[filtro_sql_processos_parados];
}

OBS.: Não estou em meu computador que tem o SC, mas assim que chegar em casa vejo isto pra você, pois já fiz isto e foi mais simples.

o codigo abaixo esta no evento onValidade do Filtro e retorna o sql "SELECT id, tipoprocesso, processo, clienteid, advrespid, contrariaid, arquivado, sigilo from lm003processos LIMIT 0,12 "

[filtro_sql_processos_parados]=" EXISTS (SELECT processoid
FROM lm003procandam
WHERE lm003processos.id = lm003procandam.processoid
AND (DATE(NOW()) - data_movimento)<=30 )";

if (empty({sc_where_orig})){
sc_select_where(add) = "WHERE ".[filtro_sql_processos_parados];
}
else{
sc_select_where(add) = "AND ".[filtro_sql_processos_parados];
}

A Proposito… a instrução montada no sql funciona e retorna 35 registros corretamente.

Luiz, coloque o comando na onscriptinit da consulta, pois essa é executada antes da consulta realizar o select.

boa noite haroldo. obrigado pelo socorro…

coloquei no onscripinit (do filtro) e tirei do onValidate (ou deixando, nao faz diferenca) retorna "SELECT id, tipoprocesso, processo, clienteid, advrespid, contrariaid, arquivado, sigilo from lm003processos LIMIT 0,12 ", ou seja, o WHERE nao é anexado à sentença.

pergunta: o que faz uma aplicação ignorar a sentença ? erro do sc ?

haroldo,

colocando no onscriptinit da consulta, nao do filtro, o where funciona, porem, nao posso alterá-lo em nenhuma outra parte do filtro…

conforme os radio buttons, posso ter variação de 30, 90 dias ou outro intervalo que afeta a clausula sql em questao.

como pode uma coisa tao simples manter por horas tal escravidao mental ? eu devia ter sido medico…

o comando em questão só vai funcionar nesse evento (OnscriptInit da Consulta).
Você seleciona o filtro, submete o filtro, e o filtro chama a consulta passando os parametros de filtragem.
Para alterar as condições do where, terá que acionar o filtro, mudar a condições e submeter o filtro para o where aceitar os novos parametros de filtragem.

Não consegui entender sua questão.

voce resumiu maravilhosamente bem a questao. leia acima no que esta em destaque.

não há necessidade de colocar isso numa variável global. remova os enter’s da condição, e vamos testar.

[code]$filtro_sql_processos_parados=" EXISTS (SELECT processoid FROM lm003procandam WHERE lm003processos.id = lm003procandam.processoid AND (DATE(NOW()) - data_movimento)<=30 )";

if (empty({sc_where_orig})){
sc_select_where(add) = "WHERE ".$filtro_sql_processos_parados;
}
else{
sc_select_where(add) = "AND ".$filtro_sql_processos_parados;
}[/code]

mas espera aí, cadê o campo do filtro? você criou um campo manualmente? cadê esse campo no seu código?

haroldo
para testar coloquei no onscriptinit da consulta o teu codigo, com variavel global com 30 dias.

no onvalidate do filtro coloquei a variavel global alterando o conteudo da filtragem de 30 dias para 90.

ele permance com 30 dias apos o onvalidate.

te adicionei no meu msn para te passar um link da aplicação mencionada. quando quiser olhar me avise.