pessoal,
Estou com a seguinte questão… Tenho que fazer um Select para apresentar os dados de um relatório de vendas; que no caso tem que possuir os seguintes parâmetros: Data Inicial, Data Final e a Forma de Pagamento para apresentar o relatório. Quanto a busca somente com data inicial e final, eu consegui fazer o select
Que no caso é este: SELECT * FROM tb_venda WHERE (data,’%d-%m-%Y’) BETWEEN (?,’%d-%m-%Y’) AND (?,’%d-%m-%Y’)
Mas agora tenho que adicionar a minha coluna formaPagamento que tem as opções de dinheiro, débito e crédito para ser filtrada também conforme a escolha dentre as três formas para pagar.
Precisando de mais informações para me ajudarem, só pedir!
Agradeço a ajuda!
Isso não resolve?
... AND formaPagamento = ?
vc está usando alguma linguagem de programação pra colocar ? no lugar dos filtros, algo que evite SQL injection é isso?
ou ? faz parte da sintaxe do postgres? (não conheço postgres a fundo por isso minha dúvida)
então, eu estou usando java, e esta dessa maneira na minha JDBC para acessar o banco de dados e apresentar as informações.
public ArrayList<Venda> buscarVendaData(Venda dataI, Venda dataF) {
ArrayList<Venda> listaParaRetorno = new ArrayList<>();
try {
String sql = "SELECT * FROM tb_venda WHERE (data,'%d-%m-%Y') BETWEEN (?,'%d-%m-%Y') AND (?,'%d-%m-%Y')";
PreparedStatement preparacaoDaInstrucao = Conexao.retornaConexao().prepareStatement(sql);
preparacaoDaInstrucao.setString(1,dataI.getData());
preparacaoDaInstrucao.setString(2,dataF.getData());
ResultSet resultado = preparacaoDaInstrucao.executeQuery();
while (resultado.next()) {
Venda venda = transformaResultSetEmObjeto(resultado);
listaParaRetorno.add(venda);
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return listaParaRetorno;
}
ja havia feito o teste colocando mais um AND como vc falou:
String sql = “SELECT * FROM tb_venda WHERE (data,’%d-%m-%Y’) BETWEEN (?,’%d-%m-%Y’) AND (?,’%d-%m-%Y’) AND formaPagamento = ?”;
mas aí me apresente este erro:
org.postgresql.util.PSQLException: ERROR: column “formapagamento” does not exist
Dica: Perhaps you meant to reference the column “tb_venda.formaPagamento”.
segui essa dica do erro tb alterando o nome, mas não consegui resultado (ou eu que não entendi ela tb hehe)
De acordo com o erro a coluna formaPagamento
não existe na tb_venda
, por este motivo ele apresenta o erro.
Não faz parte da sintaxe do postgres, provavelmente ele tenha feito para evitar SQL Injection.
Sim, exatamente. Fiz para evitar SQL injection!
então, a partir desse erro é o que dá-se a entender. Mas a coluna existe sim.
Verifiquei a forma da escrita tb para ver se estão iguais, mudei o nome da coluna tb. Mas realmente não esta dando certo.
Mas para tirar a dúvida mesmo… esta seria a forma correta de eu fazer esse filtro entre as duas datas e a coluna forma de pagamento ?
String sql = “SELECT * FROM tb_venda WHERE (data,’%d-%m-%Y’) BETWEEN (?,’%d-%m-%Y’) AND (?,’%d-%m-%Y’) AND formaPagamento = ?”;
ou não, ainda possui erro ?
Obrigado
A Query está correta, a maneira de escrita seria essa mesma, aplicar todos os sets para os parâmetros e em tese deveria funcionar, não sei te dizer quanto ao uso disso: (?,’%d-%m-%Y’)
, pois nunca cheguei a utilizar.
Tenta executar essa sua query diretamente no PgAdmin e veja se obtem o retorno desejado, desta forma já consegue tirar a prova real do resultado.
Pessoal, consegui resolver.
o motivo era justamente a escrita do nome da coluna. esta assim formaPagamento, mas o PostgreSQL não reconhece letras maiúsculas para o nome da coluna, coloquei tudo em minúscula, alterei os get e set do código tb e deu certo.
Cada coisa simples dessa que da umas dor de cabeça nada a ver.
Muito obrigado a atenção de cada um!
para caso de mais alguém precisar… O select é dessa maneira mesmo:
String sql = “SELECT * FROM tb_venda WHERE (data,’%d-%m-%Y’) BETWEEN (?,’%d-%m-%Y’) AND (?,’%d-%m-%Y’) AND formapagamento = ?”;
apenas tudo me minúsculo nos nomes das colunas do banco.
O postgres por si só não faz essa distinção da sintaxe entre maiúsculas e minúsculas, se não me falha a memória basta colocar a coluna entre aspas duplas para que o mesmo ignore as letras maiúsculas e minúsculas e obtenha o mesmo resultado.
Entendi!
Depois irei fazer o teste assim tb. E ja tiro a prova e sano mais dúvidas quanto ao uso dessas consultas no postgre
Obrigado!
Foi o que imaginei, mas na duvida melhor perguntar…
1 curtida