 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
josedelima Profissional

Registrado: Quarta-Feira, 27 de Abril de 2005 Mensagens: 608
|
Enviada: Qui Mai 11, 2006 9:59 am Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Bom dia amigos Delphianos, queria fazer um filtro entre valores usando um query
É o seguinte tenho um dbgrid com o valor maior para o menor DESC que fica assim
12.500,00
11.450,00
10.000,00
Entaum quero usar dois edits para pegar por exemplo 12.500,00 a 11.450,00, mais naum consegui, olha como fiz
procedure TForm27.BitBtn2Click(Sender: TObject);
begin
dm.qtsaida.ACTIVE:=TRUE;
dm.qtsaida.refresh;
with dm.qtsaida do
begin
close;
sql.clear;
sql.add(\'select * from saidas\');
sql.add(\'WHERE(valor >= \'+StringReplace(StringReplace(MASKEDIT1.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll]) and (valor <= \'+StringReplace(StringReplace(MASKEDIT2.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll])\');
open;
if DM.QTSAIDA.isempty then
showmessage(\'Nâo a registro de dados para ser impresso. Por favor tente novamente\');
end;
Esses exemplos ja venho copiando de colegas que postam respostas pra mim aqui no forum, mais agora complicou, naum entendo quase nada de programar, mais to tentando aprender com ajuda de voçes.
Gradecido a ajuda de todos.
[Editado em 11/5/2006 por josedelima]
[Editado em 11/5/2006 por josedelima]
[Editado em 12/5/2006 por josedelima] _________________ JLima_Jrº. |
|
| Voltar ao Topo |
|
 |
Sufolk Moderador

Registrado: Terça-Feira, 26 de Agosto de 2003 Mensagens: 1996
|
Enviada: Qui Mai 11, 2006 10:15 am Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Olá José,
o que está errado é somente a forma como você escreveu o sql do where faltou abrir a string denovo, ajeitar os parenteses.....
sql.add(\'WHERE(valor >= \'+StringReplace(StringReplace(MASKEDIT1.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll]) + \' and valor <= \'+StringReplace(StringReplace(MASKEDIT2.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll])+\')\');
Acho que seria isso. |
|
| Voltar ao Topo |
|
 |
josedelima Profissional

Registrado: Quarta-Feira, 27 de Abril de 2005 Mensagens: 608
|
Enviada: Qui Mai 11, 2006 10:30 am Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Olá fera, verdade sempre me confundo com estes sinais, mais naum está filtrando do jeito que eu preciso.
Olha só se eu colocar assim
17.311,93 a 17.311,93 filtra o valor
agora se eu colocar assim
17.311,93 a 15.550,00 aparece a mensagem
showmessage(\'Nâo a registro de dados para ser impresso. Por favor tente novamente\');
Será que tenho que mudar no lugar do <= >= usar between? Já me falaram dele só que tambem naum sei como usar.
No mais fico grato pela ajuda Sufolk.
_________________ JLima_Jrº. |
|
| Voltar ao Topo |
|
 |
Sufolk Moderador

Registrado: Terça-Feira, 26 de Agosto de 2003 Mensagens: 1996
|
Enviada: Qui Mai 11, 2006 10:40 am Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Positivo Jose substitua o valor >= <= por between assim:
sql.add(\'WHERE(valor between \'+StringReplace(StringReplace(MASKEDIT1.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll]) + \' and \'+StringReplace(StringReplace(MASKEDIT2.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll])+\')\');
Abraço Sufolk. |
|
| Voltar ao Topo |
|
 |
josedelima Profissional

Registrado: Quarta-Feira, 27 de Abril de 2005 Mensagens: 608
|
Enviada: Qui Mai 11, 2006 11:27 am Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Muito obrigado Sufolk, valeu funcionou certinho.
Só mais uma perguntinha, tem como eu fazer um order by desc usando somente o ibquery? ou preciso do IBUpdateSQL.
Gradecido _________________ JLima_Jrº. |
|
| Voltar ao Topo |
|
 |
Sufolk Moderador

Registrado: Terça-Feira, 26 de Agosto de 2003 Mensagens: 1996
|
Enviada: Qui Mai 11, 2006 11:58 am Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Então, se você não for incluir alterar ou excluir nada dessa query ela não precisa do IBUpdateSQL, somente quando você for fazer alguma alteração no banco é necessário ligação com esse componente.
Até mais....
Sufolk. |
|
| Voltar ao Topo |
|
 |
josedelima Profissional

Registrado: Quarta-Feira, 27 de Abril de 2005 Mensagens: 608
|
Enviada: Qui Mai 11, 2006 2:42 pm Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Muito obrigado valeu.
Só tenho mais uma perguntinha pra ficar perfeito
tem como eu colocar um count(campo) somente dos valores apos filtrados?
fiz assim mais naum pega somente os filtrados pega todos
select count(campo) from tabela
Queria na hora do filtro aparecer quantos foram filtrados, ou tem que fazer na mesma query que fiz antes? Tentei mais ai da erro
sql.add(\'select cnpj,codigo,descricao,valor,taxa,ipi,count(cnpj) from saidas\');
sql.add(\'WHERE(valor between \'+StringReplace(StringReplace(MASKEDIT1.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll]) + \' and \'+StringReplace(StringReplace(MASKEDIT2.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll])+\')\');
sql.add(\'order by valor DESC\');
Naum aceita
Gradecido _________________ JLima_Jrº. |
|
| Voltar ao Topo |
|
 |
Sufolk Moderador

Registrado: Terça-Feira, 26 de Agosto de 2003 Mensagens: 1996
|
Enviada: Qui Mai 11, 2006 2:50 pm Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Se você for fazer a contagem por SQL você tem que usar a mesma sentença usada no where do script anterior. Nesse seu caso como o IBQuery retorna o nro de registros e você já está abrindo mesmo a query eu faria assim após o open da query.
....
ibquery.Open;
ibquery.FetchAll;
editNumeroRegistros.Caption := IntToStr(ibquery.RecordCount);
flw Abraço.
Sufolk. |
|
| Voltar ao Topo |
|
 |
josedelima Profissional

Registrado: Quarta-Feira, 27 de Abril de 2005 Mensagens: 608
|
Enviada: Qui Mai 11, 2006 3:06 pm Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Perfeito fera.
Muito bom, tu manja mesmo.
Caso resolvido, muito obrigado Sufolk _________________ JLima_Jrº. |
|
| Voltar ao Topo |
|
 |
josedelima Profissional

Registrado: Quarta-Feira, 27 de Abril de 2005 Mensagens: 608
|
Enviada: Qui Mai 11, 2006 4:01 pm Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Olá novamente,
Acho até importuno de minha parte, mais se eu naum perguntar nuca vou conseguir saber.
Neste caso porquê naum filtra?
dm.qcnpj.ACTIVE:=TRUE;
with dm.qcnpj do
begin
close;
sql.clear;
sql.add(\'select cnpj, sum(valor)as valor, sum(ipi)as ipi from saida\');
sql.add(\'WHERE(valor between \'+StringReplace(StringReplace(MASKEDIT1.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll]) + \' and \'+StringReplace(StringReplace(MASKEDIT2.Text,\'.\',\'\',[rfReplaceAll]),\',\',\'.\' ,[rfReplaceAll])+\')\');
sql.add(\'group by cnpj order by 2 DESC\');
open;
dm.qTSaida.FetchAll;
eNR.Caption := IntToStr(dm.qcnpj.RecordCount);
if DM.Qcnpj.isempty then
showmessage(\'Nao a registro de dados para ser impresso. Por favor tente novamente\');
end;
Repare que agora o select mudou e inclusive tem um group by.
Ou se é de outra maneira que se faz este select? _________________ JLima_Jrº. |
|
| Voltar ao Topo |
|
 |
Sufolk Moderador

Registrado: Terça-Feira, 26 de Agosto de 2003 Mensagens: 1996
|
Enviada: Qui Mai 11, 2006 4:53 pm Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Não entendi o por que não iria filtrar Jose, nesse script o sistema deve retornar a soma de todas as saídas entre maskedit1 e maskedit2 e agrupálas por cnpj tipo
cnpj valor ipi
1 10,00 1,00
1 15,00 1,00
1 22,00 1,00
2 13,00 1,00
2 17,00 2,00
se eu pegar no intervalo 10 a 20 ele tem que me retornar
cnpj sum1 sum2
1 25,00 2,00
2 30,00 3,00
Mas veja bem Jose se não está fazendo dessa forma.
Não há a necessidade de colocar esse código abaixo pois você vai fechar a query e abrir novamente abaixo.
dm.qcnpj.ACTIVE:=TRUE;
Aguardo retorno.
|
|
| Voltar ao Topo |
|
 |
josedelima Profissional

Registrado: Quarta-Feira, 27 de Abril de 2005 Mensagens: 608
|
Enviada: Qui Mai 11, 2006 5:07 pm Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Olá Sufolk, na dbgrid ja esta agrupada, agora num bitbtn queria que mostrasse somente os valores do intervalo entre tal valor a tal valor, e naum está me retornando nada, ja tirei o active do query no começo
me mostra a mesma mensagem de antes
showmessage(\'Nao a registro de dados para ser impresso. Por favor tente novamente\');
_________________ JLima_Jrº. |
|
| Voltar ao Topo |
|
 |
josedelima Profissional

Registrado: Quarta-Feira, 27 de Abril de 2005 Mensagens: 608
|
Enviada: Qui Mai 11, 2006 5:16 pm Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Fazendo uns testes aqui descobri algo estranho, veja
tenho na dbgrid valores acumulados por cnpj neste valor
102.000,00
85.000,00
80.000,00
assim ate 500,00
ai pedi para filtrar entre 80.000,00 a 103.000,00 (naum aparece nada, só a mensagem acima do showmessage)
agora se eu pésso de 10.000 a 103.000,00 aparece na dbgrid assim
20.985,00
até
10.088,00
Enquanto deveria filtrar de
102.801,00 //que é o maior valor
a
10.088,00 //que é o menor valor entre o intervalo
O quê pode ser caro amigo? _________________ JLima_Jrº. |
|
| Voltar ao Topo |
|
 |
Sufolk Moderador

Registrado: Terça-Feira, 26 de Agosto de 2003 Mensagens: 1996
|
Enviada: Qui Mai 11, 2006 5:39 pm Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
O que você tem que entender José é que o acumulado pode mostrar valores fora do intervalo pois ele vai acumular os valores que tiverem no intervalo mas a soma pode sair do intervalo
como o exemplo que postei:
cnpj valor ipi
1 10,00 1,00
1 15,00 1,00
1 22,00 1,00
2 13,00 1,00
2 17,00 2,00
se eu gerar
select *
from saida
where valor between 10 and 20 ele vai gerar para mim
1 10,00 1,00
1 15,00 1,00
2 13,00 1,00
2 17,00 2,00
se eu pedir
select cnpj, sum(valor), sum(ipi)
from saida
where valor between 10 and 20
group by cnpj
ele vai retornar
1 25,00 2,00
2 30,00 3,00
e 25 e 30 estão fora do limite mas o 25 e 30 é o acumulado por cnpj dos valores entre 10 e 20 agora se você quizer que o acumulado por cnpj fique no intervalo você vai ter que fazer o script assim
select cnpj, sum(valor), sum(ipi)
from vendas
group by cnpj
having sum(valor) between 35 and 40
ai o acumulado dos valores deve ser entre 35 e 40 e nos exemplos que te postei
1 47,00 3,00
pois o cnpj 1 é o único em que o acumulado do valor está entre 35 e 40 reais.
Não sei se fui bem claro Jose mas acho que é esse o caminho:
Sufolk. |
|
| Voltar ao Topo |
|
 |
josedelima Profissional

Registrado: Quarta-Feira, 27 de Abril de 2005 Mensagens: 608
|
Enviada: Qui Mai 11, 2006 5:52 pm Assunto: Filtrar com Query em intervalo de valores?(resolvido) |
|
|
Acho que entendi sim Sufolk, mais no meu caso a gird ja vem com a SQL pronta agrupada e somada por CNPJ, o que eu quero mesmo é fazer um intervalo entre elas e naum somar novamente por isso acho que estou errado com esta SQL.
Agora se já esta agrupada acho tambem que naum ha necessidade de agrupar novamente para filtrar só queria mostrar os intervalos que já estaum agrupados.
[Editado em 11/5/2006 por josedelima] _________________ JLima_Jrº. |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|