Bom dia galera!
Preciso de ajuda para conseguir um código para filtrar uma consulta de soma no bd(mysql) cujo índice “valor” é um double retornando por exemplo o resultado das receitas de um mês. Já consigo a soma total através do código abaixo:
<%@ page import=“java.sql.*”%>
<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=ISO-8859-1”>
<title>Listar</title>
</head>
<body>
<%
try {
Class.forName(“com.mysql.jdbc.Driver”).newInstance();
}catch (Exception e){
out.println(“Driver não Carregado!”);
}
try {
Connection conexao=
DriverManager.getConnection(“jdbc:mysql://localhost/projetosomar”,“root”,“root”);
PreparedStatement
sql=conexao.prepareStatement("SELECT SUM(preco) from produtos");
ResultSet resultado=sql.executeQuery();
%>
<center>
<table width="20%" border="1">
<tr>
<td>Preço</td>
</tr>
<%
while(resultado.next()){
%>
<tr>
<td><%=resultado.getDouble(1)%>
</td>
</tr>
<h3>
<%out.println("Total: " + resultado.getDouble(1));%></h3>
<%
}
%>
<%
resultado.close();
conexao.close();
}catch (SQLException e){
out.println("erro sql:"+e.getMessage());
}
%>
</table>
</center>
</body>
</html>
Desde já agradeço aos que me ajudarem e espero que este código também ajude os demais colegas que precisarem.
Abraço!
Albert
Não ficou claro o que você deseja filtrar.
Então Rafael,
desejo filtrar um período que via de regra representa por exemplo a soma das vendas de um mês.
Prefiro um código que filtre apresentando a lista do período com os ítens: “codigo”, “descricao”, “preco”, “data” e imprime na tela a soma do ítem “preco”.
Estou tentando com um PreparedStatement para listar a tabela e outro para apresentar o resultado da soma do ítem “preco”, na mesma página.
Sei que pode-se fazer também a partir de uma classe com método get, utilizando até mesmo JavaBeans. Ainda tenho dificuldades, insistindo muito até acabo conseguindo, mas se puder me dar uma dica eu agradeço.
Grato pela atenção
Abraço!
Entendi que você deseja mostrar a soma de vendas de um determinado período. Posso sugerir o seguinte código:PreparedStatement pstmt = conexao.prepareStatement(
"select sum(preco) from produtos where data between ? and ?");
pstmt.setDate(1, <dataInicial>);
pstmt.setDate(2, <dataFinal>);
ResultSet resultado = pstmt.executeQuery();Onde e são as datas que compreendem o período.
Bom dia Rafael,
Agradeço muito sua sugestão, tenho certeza que funciona, e vou compartilhar com vc e os demais colegas a solução que encontrei ontem:
//filtro para listar
PreparedStatement
sql=coneccao.prepareStatement("Select * from receitas where data like ?");
String palavra=request.getParameter("palavra");
sql.setString(1,"%"+palavra+"%");
ResultSet resultado=sql.executeQuery();
/*nesta mesma página no final, um form action apontando para
a página onde está o código-filtro responsável pela soma onde o usuário
digita por ex.:2008-02 idêntico ao form que filtra o relatório do periodo
*/
//código para filtrar a soma
PreparedStatement
sql=conexao.prepareStatement("SELECT SUM(valor) from receitas where data like ? ");
String palavra=request.getParameter("palavra");
sql.setString(1,"%"+palavra+"%");
ResultSet resultado=sql.executeQuery();
coloquei ainda um <@include file"filtraListaReceita.jsp"" no início do <body> desta página para que a lista apareça juntamente com o resultado da soma abaixo para imprimir no papel o relatório.
O único inconveniente é que o form aparece junto, mas acho que dá pra resolver com javascript.
Valeu Rafael!
Embora funcione, não concordo com a utilização do operador like num campo do tipo data. Tenho pelo menos três motivos para não implementar dessa forma:
1º) você ficará dependente que o banco de dados faça a conversão implícita da data para string no formato aaaa-mm-dd;
2º) o banco de dados ignorará o índice da coluna data caso exista – já pensou essa tabela com milhões de registros?
3º) fica parecendo uma “gambiarra”.
A minha sugestão para o seu SQL é a seguinte:
select * from receitas where data between ? and ?
Ok Rafael,
Valeu pela dica, vou testar as duas maneiras durante um tempo, mas tenho certeza que sua sugestão é mais específica. Com relação à tabela data, ela existe e está setada como DATE no mysql que por sua vez só aceita o formato YYYY-MM-DD até no caso de usarmos “between” vc sabe, a data precisa estar neste formato para funcionar corretamente.
Enfim, reconheço que o código que enviou é o mais adequado por oferecer maior precisão.
Valeu!
Ei conterraneo…porq não usa um comando sql mais amigável para o usuário preencher a data:
Select to_date('data', 'dd/mm/yyyy') as data from reeitas where data between ? and ?
pode colocar o to_date ou to_char e também no formato “dd/mm/yyyy hh:mm:ss” e etc…
Valeu irmão,
Não sabia dessa possibilidade ainda, e agradeço.
Continuo implementando esse meu sistema que já me ajuda muito, ao mesmo tempo que aprendo os truques da programação em Java.
Pela quantidade de visitas vejo que o tópico interessa a muitos, isso é bom.
Até mais!