Galera, estou aprendendo a fazer um sisteminha PDV em java e preciso fazer uma consulta na tabela de vendas por periodo. Criei o método para retornar a lista de vendas e gostaria de implementá-lo mas estou com dificuldades. Vi aqui que é preciso pegar a data dos campos datainicio e datafinal e converte-la. Não sei como fazer isso. Uso a versão 7 do Java. Vi alguns exemplos mas que só podem ser usados a partir da versão 8 do java.
Alguem poderia me ajudar ?
No Java 7 vc pode usar o ThreeTen Backport, um excelente backport da API do Java 8. Basicamente, basta pegar os exemplos que vc viu em Java 8 e trocar os import
’s de java.time
para org.threeten.bp
. Claro que pode ter uma diferença ou outra, mas a maior parte das principais funcionalidades poderão ser usadas sem problemas.
Se bem que o ideal era tentar atualizar a versão do Java mesmo - tem algum motivo para usar a 7?
Claro que vc também poderia usar SimpleDateFormat
, mas sinceramente, esta API está obsoleta e só deveria ser usada se não tiver jeito (por exemplo, em sistemas legados que daria muito trabalho migrar todo o código). Em projetos novos, prefira usar a API nova, em uma versão mais atual da iinguagem. Caso tenha uma justificativa muito forte para usar o Java 7, prefira o uso do backport.
Como já dito, os casos de uso mais comum estão disponíveis no ThreeTen Backport. Claro que tem algumas poucas diferenças, já que para algumas coisas do Java 8 não vai ser possível usar no 7. Para mais detalhes, dê uma olhada aqui, em especial a seção no final (“Alternativas para Java < 8”).
Bem, eu estou aprendendo Java e instalei essa versão. Gostaria primeiro de compreender nesta versão. Depois eu atualizaria.
No caso, eu tenho os campos DataInicial e DataFinal no meu formulario. O método que retorna a lista tem como parametros DataInicio e DataFim, como a seguir:
public List<Vendas> listarVendasPorData(String DataInicio, String DataFim){
Preciso implementar este método no botão pesquisar do formulário, mas não estou sabendo como. Sei que o retorno será uma String, mas no banco de dados o formato em que as datas estão salvas está “aa-MM-dd”, então não vai dar certo. A pergunta é como devo implementar. Já vi aqui que posso usar o simpledateformat para esta versão. Só não sei é fazer.
Eu até comecei, mas logo que apareceu o erro parei.
SimpleDateFormat DataBr = new SimpleDateFormat("dd/MM/yyyy");
Date DataInicio = DataBr.parse(TxtDataInicial.getText());
Date DataFim = DataBr.parse(TxtDataFinal.getText());
Bom, vamos lá:
Versão
Se está aprendendo, não vejo muito sentido em usar uma versão antiga. Compensa muito mais começar com uma mais nova, sugiro baixar daqui.
Não tem nada de relevante no Java 7 que vc não vá encontrar nas mais novas. Inclusive, nas atuais pode ter várias coisas eram do 7 e hoje estão obsoletas. Na minha opinião não vale a pena começar por uma versão tão velha, ainda mais uma que nem tem mais suporte.
Datas não têm formato
Uma data é apenas um ponto específico na linha do tempo. No caso, são 3 valores numéricos que indicam o dia, mês e ano. O que acontece é que esses valores podem ser representados de diferentes maneiras. Por exemplo, a data de hoje pode ser escrita como:
- 09/01/2024 - formato comum em vários países
- 1/9/2024 - o irritante formato americano, invertendo dia e mês
- 2024-09-01 - o formato definido pela norma ISO 8601
- “nove de janeiro de dois mil e vinte e quatro”, “9th January, 2024”, “2024 年 1 月 9 日” - por extenso, em vários idiomas diferentes (português, inglês e japonês)
Todos os formatos acima são diferentes, mas todos representam a mesma data.
Então quando uma data está gravada no banco de dados (assumindo que o tipo da coluna é DATE
, TIMESTAMP
ou algum outro tipo de data, e não como VARCHAR
), internamente ele gravou somente o valor numérico. Quando a data é exibida (por exemplo, como resultado de um SELECT
), claro que ela é mostrada em algum formato. Mas isso não quer dizer que ela está naquele formato (não está).
Esta é uma distinção importante para o seu problema. Se a data está no banco como um DATE
, TIMESTAMP
ou algum outro tipo de data/hora, então bastaria obter o valor como data diretamente (por exemplo, se estiver usando JDBC, um getDate()
é o suficiente). E aí vc já teria a data prontinha para usar.
Somente se ela estiver gravada como texto (VARCHAR
), aí vc teria que fazer o parsing. Neste caso, tem que ver o que getText()
retorna. Se está no formato “aa-MM-dd”, então deveria ser new SimpleDateFormat("yy-MM-dd");
.
Aliás, outra dica: sempre que vc disser que deu erro, coloque a mensagem de erro que apareceu, senão a gente não tem como adivinhar o que está acontecendo. E informe também o que é retornado por TxtDataInicial.getText()
pra gente saber o formato exato.
Veja bem, na verdade o que está acontecendo é muito estranho. Primeiramente eu estava tentando implementar um método que faz a busca de registros por período, então, no formulário tenho os campos datainicio e datafinal. Para implementar o método eu entendo que deveria faze-lo no evento do botão Pesquisar. Blza. Em todos os exemplos que vi a implementação de um método como este deveria ser feita através do DateTimeFormatter, que só existe a partir da versão 8 do java.
Daí, comecei a tentar uma alternativa no proprio java 7, utilizando por exemplo o seguinte:
SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
VendasDAO dao = new VendasDAO();
List<Vendas>lista = dao.listarVendasPorData(DataInicio, DataFim);
DefaultTableModel dados = (DefaultTableModel)TabelaHistorico.getModel();
dados.setNumRows(0);
for (Vendas v:lista){
dados.addRow(new Object[]{
Ocorre que estranhemente, e eu nem imagino o porque, o netbeans agora não reconhece sequer o nome dos campos. No meu formulário eu tenho o campo DataInicio e DataFim, que são vampos de texto. Tambem tenho uma tabela que chamei de TabelaHistorico. E para minha surpresa, as linhas nas quais cito esses componentes estão marcadas com a bolinha vermelha e o erro indicado é: “cannot find symbol. Symbol: Variable DataInicio.”. A mesma coisa está acontecendo com a tabela, diz que não pode encontrar a variavel TabelaHistorico.
Então, para alem da dificuldade em saber como implementar o método, agora me deparei com isso ai.
Posta o fonte da sua classe.
Já falei e insisto: por que continuar no Java 7?
Se está aprendendo, comece em uma versão mais atual, por vários motivos:
- as funcionalidades mais novas estarão disponíveis
- Java 7, como já dito, nem tem mais suporte
- vc pode aproveitar os exemplos que viu do Java 8, pois a API
java.time
é muito melhor e corrige vários problemas da API antiga (SimpleDateFormat
)
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.projeto.view;
import br.com.projeto.dao.VendasDAO;
import br.com.projeto.model.Vendas;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.awt.event.KeyEvent;
import static java.util.Collections.list;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
/**
*
* @author Usuario
*/
public class frmHistorico extends javax.swing.JFrame {
/**
* Creates new form frmHistorico
*/
public frmHistorico() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jPanel2 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
TabelaHistorico = new javax.swing.JTable();
jLabel10 = new javax.swing.JLabel();
TxtDataInicial = new javax.swing.JFormattedTextField();
TxtDataFinal = new javax.swing.JFormattedTextField();
jLabel11 = new javax.swing.JLabel();
btnPesquisar = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Histórico de Vendas");
jPanel1.setBackground(new java.awt.Color(0, 51, 153));
jLabel1.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
jLabel1.setForeground(new java.awt.Color(255, 255, 255));
jLabel1.setText("Histórico de Vendas");
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(21, 21, 21)
.addComponent(jLabel1)
.addContainerGap(482, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(26, 26, 26)
.addComponent(jLabel1)
.addContainerGap(23, Short.MAX_VALUE))
);
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Consulta por Data"));
TabelaHistorico.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"Código", "Data da Venda", "Cliente", "Total", "Observação"
}
));
jScrollPane1.setViewportView(TabelaHistorico);
jLabel10.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
jLabel10.setText("Data Inicial:");
try {
TxtDataInicial.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
} catch (java.text.ParseException ex) {
ex.printStackTrace();
}
TxtDataInicial.setName("TxtDataInicial"); // NOI18N
TxtDataInicial.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
TxtDataInicialKeyPressed(evt);
}
});
try {
TxtDataFinal.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
} catch (java.text.ParseException ex) {
ex.printStackTrace();
}
TxtDataFinal.setName("TxtDataFinal"); // NOI18N
TxtDataFinal.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
TxtDataFinalKeyPressed(evt);
}
});
jLabel11.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
jLabel11.setText("Data Final:");
btnPesquisar.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
btnPesquisar.setText("Pesqsuisar");
btnPesquisar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnPesquisarActionPerformed(evt);
}
});
btnPesquisar.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
btnPesquisarKeyPressed(evt);
}
});
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(jLabel10)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(TxtDataInicial, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(42, 42, 42)
.addComponent(jLabel11)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(TxtDataFinal, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(37, 37, 37)
.addComponent(btnPesquisar)
.addGap(0, 163, Short.MAX_VALUE))
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel10, javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(TxtDataInicial, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel11, javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(TxtDataFinal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnPesquisar)))
.addGap(53, 53, 53)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(184, Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(87, Short.MAX_VALUE))
);
pack();
setLocationRelativeTo(null);
}// </editor-fold>
private void TxtDataInicialKeyPressed(java.awt.event.KeyEvent evt) {
// TODO add your handling code here:
//Programacao do keypress
}
private void TxtDataFinalKeyPressed(java.awt.event.KeyEvent evt) {
// TODO add your handling code here:
}
private void btnPesquisarActionPerformed(java.awt.event.ActionEvent evt) {
// Metodo Buscar vendas por período
// É necessário fazer a conversão de datas
// Primeiro passo: Receber a data
SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
VendasDAO dao = new VendasDAO();
List<Vendas>lista = dao.listarVendasPorData(DataInicio, DataFim);
DefaultTableModel dados = (DefaultTableModel)TabelaHistorico.getModel();
dados.setNumRows(0);
for (Vendas v:lista){
dados.addRow(new Object[]{
v.getId(),
v.getData_venda(),
v.getCliente().getNome(),
v.getTotal_venda(),
v.getObservacao()
});
}
}
}
private void btnPesquisarKeyPressed(java.awt.event.KeyEvent evt) {
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("WINDOWS".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(frmHistorico.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(frmHistorico.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(frmHistorico.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(frmHistorico.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new frmHistorico().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JTable TabelaHistorico;
private javax.swing.JFormattedTextField TxtDataFinal;
private javax.swing.JFormattedTextField TxtDataInicial;
private javax.swing.JButton btnPesquisar;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
// End of variables declaration
}
Vamos por partes. Tenho o NetBeans 8.02 e o Java 7 na minha máquina. Entao eu devo baixar o Java 8 e qual versão do NetBeans ? Preciso desinstalar os demais ?
Na instalação do Java 8 está dizendo que manter a versão 7 é um risco à segurança, mas como faço para não perder meu projeto ? Como faço uma cópia dele ?
NetBeans 8 suporta Java 8.
Mas eu sugiro tentar versões mais novas, aí tem que atualizar o NetBeans também. No site deles sempre diz qual versão da linguagem é suportada.
Se reinstalar o Java vc não perde o seu projeto. Talvez só precise reconfigurar a versão, mas não tem “risco de segurança”.
Cara, agora confundiu tudo aqui. Eu instalei a Versão 8 do Java. Eu tenho instalado o NetBeans 8.02 e o NetBeans 16. Antes de instalar a versão 8 o projeto estava rodando normalmente nos dois. Ocorria o erro que havia falado, não reconhecia o nome dos componentes etc.
Agora nao reconhece o DateTimeFormatter, tambem dando erro, a biblioteca que faz a conexao com MySql que é a mysql-conector 5.4.1, não reconhece o serviço de busca de Cep, webservice, o Dom4j-1.6.1…
Enfim, para quem já tava confuso agora piorou.
Entre nas configurações do NetBeans e veja qual JVM está lá. Depois vá nas configs do projeto e veja se ele está usando a mesma JVM.
Não tem porque simplesmente parar do nada se vc só atualizou a versão, provavelmente é problema de configuração (sem mais detalhes de como está o projeto, é o que dá pra sugerir).
Tambem pensei nisso. De repente o NetBeans ainda está usando a versao 7
Entrei no Netbeans.Conf e vi que a variavel está apontando para o JDK 19.
netbeans_jdkhome=“C:\Program Files\Java\jdk-19”