[RESOLVIDO] Grid consulta com LIKE

Pessoal, eu tenho uma Consulta que tem um campo “cod_cc_r”. No Sql da consulta eu coloquei:

SELECT IDMOVIMENTACAO_BANCARIA, IDCENTRO_CUSTO_R, DATA_BAIXA, VALOR_MOVIMENTACAO, COD_CC_R, IDCONTA_BANCARIA, BANCO, HISTORICO, IDUNIDADE FROM rel_cc_receita WHERE cod_cc_r LIKE '$var%'

Onde tenho uma variável $var.

O problema que inicio essa consulta com um Filtro, onde no eventos do filtro em onSave coloco um select:

$var = sc_exec_sql("select cod_cc_r from centro_custos_r where idcentro_custo_r = {idcentro_custo_r}");

Porém não esta funcionando essa variável.

Pergunta:

Como eu posso colocar essa variável no Sql da aplicação, onde sempre que eu mudar o filtro (que é um campo select) ele mude tbm a variável de acordo com o select?

Abraço a todos!

Fred,

Já testou transformando a variável em global?

Fred,

Eu usaria no SELECT da consulta o [var] e não $var.

Fred, em consultas eu gosto de tratar os SQL fora do escopo do próprio SQL, no onScriptInit, pois tenho mais controle. Usando as macros de where como
sc_select_where(add).

Já usei como variável sim! Mas no debug mostra que a variável não esta sendo carregada.
Almeida vou da uma olhada nessa macro! Daqui a pouco vou postar os testes. (OBS, você tem algum exemplo?)

Abração!

Fred,

Por que ao invés de usar o SC_EXEC_SQL() pra atribuir a variável, você não tenta usar o SC_LOOKUP() e jogar o resultado na variável $var e depois usar como [var] na consulta?

Boa Kleyber, não tinha pensado nisso! Também vou fazer os testes, me me bateu uma dúvida: O meu filtro é da própria consulta, peço pra aplicação iniciar com o filtro, essa variável pela lógica tem que ser de saída. Será que após filtrado pelo próprio filtro da consulta ele manda os valores para essa variável de saída? Pois no meu pensamento a “Saída” pra mim é a finalização (fechamento) da aplicação. Você tem esse mesmo pensamento?

Almeida usei a macro assim:

sc_select_where(add)=“where cod_cc_r LIKE ‘[var]%’”; // no evento onScriptinit

E no evento do FILTRO em onValidate (tbm testei no onSave) coloquei como o Kleyber sugeriu:

$check_sql = “select cod_cc_r from centro_custos_r where idcentro_custo_r = ‘{idcentro_custo_r}’”;
sc_lookup(rs, $check_sql);

if (isset({rs[0][0]}))
{
[var] = {rs[0][0]};

}
else
{
echo ‘Erro!’;

}

Até agora nada. =/

A lógica é a seguinte:

Eu tenho um centro de custo no campo que é um select, por exemplo:

Ao clicar no campo select aparece:

1 - Receitas
10 - Vendas
1001 - Software
1002 - Equipamentos
20 - Serviços
2001 - Desenvolvimento
2002 - Manutenção
2003 - Hospedagem

A lógica do “Like” é jutamente percorrer o cod_cc_r que são aqueles números (1, 10, 1001, etc.) me trazendo apenas a listagem de acordo com o where.

Vocês tem alguma sugestão para que eu possa realizar isso?

no modo Debug o where(add) funcionou? adicionou o where, manda o debug como ficou o sql final da grid pra gente dar uma olhada.

Tenho um exemplo que usei esse jeito que você precisa.

OnValidade do Filtro:

[code]if(!empty({IDCLIENTE})){
[CONSIGNADO_CLIENTE] = {IDCLIENTE};
$sql = “SELECT NOME FROM CLIENTES WHERE CODIGO=”.{IDCLIENTE};
sc_lookup(rs, $sql, “BDDIGISAT”);
[CONSIGNADO_EXIBECLIENTE] = "CLIENTE: ".strtoupper({rs[0][0]});
}
else{
[CONSIGNADO_CLIENTE] = “todos”;
[CONSIGNADO_EXIBECLIENTE] = “CLIENTE: EXIBINDO TODOS OS CLIENTES”;
}

[SALVA_FILTRO] = “SIM”;[/code]

onScriptIni da Gird:

[code]$where = “”;
if([SALVA_FILTRO] == “SIM”){
[CONSIGNADO_FILTRO] = {sc_where_filter};
if(empty({sc_where_filter}))
$where = “WHERE STATUS = 1”;
else{
$where = “AND STATUS = 1”;
}
}
else if([CONSIGNADO_CLIENTE] != “todos” && empty({sc_where_current}))
$where = " WHERE ".[CONSIGNADO_FILTRO];
else if([CONSIGNADO_CLIENTE] != “todos”)
$where = " AND ".[CONSIGNADO_FILTRO];

//adiciona o where
sc_select_where(add) = $where;[/code]

PS: Preste atenção so na variavel [CONSIGNADO_FILTRO], ela que faz a consulta filtra de acordo com o filtro, as outras uso pra outras coisas

Fred, tava analisando seu código, você vai precisar de algum where feito pelo filtro, a não ser o que você esta movendo para a [VAR].

Porque ao utilizar o filtro sc já adiciona uma filtragem na consulta, então oque vc vai ter que fazer e ver o where que o filtro está gerando pra vc e fazer uma lógica em cima desse where adicionando o seu filtro personalizado, fazendo a consulta trazer os que desejar.

A macro sc_select_where(add) adiciona um filtro a clausula where, então se a mesma já conter algo vc vai ter que concatenar o seu ao existente.

No exemplo que postei uso umas variaveis que o SC me fornece para verifica se já tem algum where feito, e adiciono o meu na frente deles.

Almeida, eu adaptei seu código a minha necessidade mas tbm não funfou!

No onValidate do filtro:

[code]if(!empty({IDCENTRO_CUSTO_R})){
$sql = “select cod_cc_r from centro_custos_r where idcentro_custo_r =”.{IDCENTRO_CUSTO_R};
sc_lookup(rs, $sql);
[var] = {rs[0][0]};
}
else{

echo 'Erro!';

}[/code]

No onScriptinit da Grid:

[code]$where = “”;
if([var] == “”){
[filtro] = {idcentro_custo_r};
if(empty({idcentro_custo_r}))
$where = “WHERE LIKE = ‘[var]%’”;
}

sc_select_where(add) = $where;[/code]

DEBUG:

mysqlt): select count(*), sum(VALOR_MOVIMENTACAO) as sum_valor_movimentacao from rel_cc_receita where IDCENTRO_CUSTO_R = 12 and DATA_BAIXA between ‘2013-05-01’ and ‘2013-08-30’ (mysqlt): SELECT IDCENTRO_CUSTO_R, DATA_BAIXA, VALOR_MOVIMENTACAO, BANCO, HISTORICO from rel_cc_receita where IDCENTRO_CUSTO_R = 12 and DATA_BAIXA between ‘2013-05-01’ and ‘2013-08-30’ order by DATA_BAIXA asc LIMIT 0,12

1 - $where = “”;
2 -if([var] == “”){
3- [filtro] = {idcentro_custo_r};
4- if(empty({idcentro_custo_r}))
5- $where = “WHERE LIKE = ‘[var]%’”;
6- }

7 - sc_select_where(add) = $where;

1 Linha: Cria uma variavel
2 Linha: Verifica se a [var] está com conteudo == “”
3456 Linha vai fazer só se a var estiver vazia.
7 linha: Adiciona o $where a clausula, mais pelo que vi sua [var] não vai estar vazia, então o $where vai estar vazio.

Pode verificar que no debug não adicinou seu where WHERE LIKE = ‘[var]%’".

apaga esses if e coloca só a macro
sc_select_where(add) = “AND IDCENTRO_CUSTO LIKE ‘[var]%’”;

Pra gente ver.

Qlquer coisa me add no skype ai eliezeralmeidago@hotmail.com

Creio que nessa caso não é pra sair da aplicação, mas sim da função que estás, no caso o filtro. Mas é sempre bom testar pra saber se dá certo.

Após várias horas de estudo (Banco, Aplicações, Dados…) e com uma grande ajuda do Eliezer remotamente conseguimos resolver esse problema.

Fico grato a todos. Muito obrigado mesmo! Abração.

Lições aprendidas:

[ul][li]Quando se cria um campo virtual, o mesmo não influencia no SQL principal da aplicação.[/li]
[li]As variáveis globais de “Saída” recebe sim o valor do próprio filtro quando este pertence a sua própria aplicação de consulta.[/li]
[li]É bem mais vantajoso manipular o SQL da aplicação pela macro “sc_select_where”.[/li][/ul]