Javafree
Página Inicial do Fórum > Java Básico

Java.util.Date não pode ser convertido em java.sql.Date



Criar novo tópico   Responder tópico


  1. clever53
    Posts:11


    Comment Arrow

    Publicado em: 12/07/2016 11:23:15

    Olá
    Sou iniciante em java e estou criando um sistema de cálculo que envolve várias datas sobre as quais terei que fazer vários cálculos. Uso banco de dados Postgresql e lá, na tabela, os campos de datas estão formatados com o tipo Date. Isso porque, só assim, consegui realizar cálculos com o Joda.
    O meu programa está em 3 camadas: Controle, Modelo e Visão (MVC).

    Na camada Modelo, onde estão os Get e Set, tenho as variáveis definidas assim:


    public class ModeloInterrupcao {
    private int idInterrupcao;
    private int matricula;
    private String apenado;
    private String motivo;
    private int idCondenacao;
    private Date dataInicial;
    private Date dataFinal;

    Na camada Visão, no botão Salvar, do formulário, tenho:

    private void jButtonSalvarActionPerformed(java.awt.event.ActionEvent evt) {

    mod.setMatricula(Integer.parseInt(jTextFieldMatricula.getText()));
    mod.setApenado(jTextFieldApenado.getText());
    mod.setDataInicial((java.sql.Date) jDateChooserDataInicial.getDate());
    mod.setDataFinal((java.sql.Date) jDateChooserDataFinal.getDate());
    mod.setMotivo((String) jComboBoxMotivo.getSelectedItem());
    mod.setIdInterrupcao(Integer.parseInt(jTextFieldId.getText()));

    control.inserirInterrupcao(mod);
    }



  1. staroski
    Posts:4599


    Comment Arrow

    Publicado em: 12/07/2016 17:02:35

    Cast não é uma conversão, é uma coersão.
    Você faz cast quando tem uma variável de tipo mais genérico, mas sabe que a referência dela é para um tipo de dado especifico.
    java.util.Date e java.sql.Date são classes incompatíveis, por isso o código abaixo está errado:


    O JDateChooser retorna objetos do tipo java.util.Date e o banco espera objetos do tipo java.sql.Date
    Terás que criar instâncias de java.sql.Date a partir do java.util.Date recebido

    Se eu fosse você, mudaria a implementação dos métodos setDataInicial e setDataFinal para receber um java.util.Date
    Assim, só na hora de persistir você converte para java.sql.Date
    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    Faço seu trabalho Java,
    clique aqui

    Acesse http://www.guj.com.br/



  1. clever53
    Posts:11


    Comment Arrow

    Publicado em: 12/07/2016 19:25:27

    Entendi. Mas como faço isso?



  1. staroski
    Posts:4599


    Comment Arrow

    Publicado em: 13/07/2016 08:56:44

    Pôxa, poderias ao menos dar uma lida na documentação da classe java.sql.Date...


    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    Faço seu trabalho Java,
    clique aqui

    Acesse http://www.guj.com.br/



  1. clever53
    Posts:11


    Comment Arrow

    Publicado em: 13/07/2016 10:14:02

    Já olhei a documentação Java e vi que o Banco de Dados espera um java.sql.date. Por isso, lá no Controle, continuei com o sql.date. Mas ver um método como este que você, gentilmente, sugeriu não resolve meu problema porque não sei onde colocá-lo e como aplicá-lo.
    Para o novato e inexperiente tudo é mistério. Eu não sei nem mesmo o que é "persistir".
    E depois, como faço para aproveitar no botão Salvar, Editar etc.?. Tenho que alterar alguma linha de comando?



  1. staroski
    Posts:4599


    Comment Arrow

    Publicado em: 13/07/2016 12:58:56

    Linguagem Java não dispõe de comandos, basicamente você instancia classes e invoca métodos dessas instâncias ( ou desses objetos, instanciar uma classe é sinônimo de criar um objeto ).
    Sim, você vai precisar alterar seu código, ele não vai se arrumar automagicamente.

    "Persistir", neste contexto, é sinônimo de "salvar no banco de dados".

    Nos códigos abaixo, você está fazendo um cast incompatível:



    O método "getDate()" da classe JDateChooser retorna um objeto do tipo "java.util.Date".
    Seus métodos "setDataInicial" e "setDataFinal" esperam receber objetos do tipo "java.sql.Date".

    Então das duas uma:

    Opção 1 - você muda a assinatura dos seus métodos "setDataInicial" e "setDataFinal" para receber um "java.util.Date" e na parte onde você vai "salvar no banco de dados", você converte o "java.util.Date" para "java.sql.Date";

    Opção 2 - você cria um objeto "java.util.Date" a partir do objeto "java.sql.Date" recebido do "JDateChooser" e passa ele como parâmetro para o "setDataInicial" e "setDataFinal"

    Nas duas alternativas você terá de como converter um "java.util.Date" para "java.sql.Date".
    Você já viu como se faz isso no código que postei, de qualquer forma, aqui vai de uma outra forma, que pode parecer mais legível:


    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    Faço seu trabalho Java,
    clique aqui

    Acesse http://www.guj.com.br/



  1. clever53
    Posts:11


    Comment Arrow

    Publicado em: 13/07/2016 15:08:26

    staroski, obrigado pela tentativa, mas eu estou entregando a toalha. Há uma semana estou tentando resolver isso. Não sei como fazer. Desisto do java. Volto pro VBA mesmo que pobre.
    Para quem entende é muito fácil. Para o novato, tudo é enígma.
    Por exemplo: você diz:
    " muda a assinatura dos seus métodos "setDataInicial" e "setDataFinal" para receber um "java.util.Date" e na parte onde você vai "salvar no banco de dados", você converte o "java.util.Date" para "java.sql.Date".
    Como mudar assinatura? Onde? Qual é a parte que salva no banco de dados? Onde colocar a conversão para java.util.Date?
    E assim são todos os exemplos que se acha na Internet. Nada vai de encontro à parte prática para mim que sou iniciante...
    Desisto, mas obrigado, assim mesmo.



  1. staroski
    Posts:4599


    Comment Arrow

    Publicado em: 13/07/2016 17:46:19

    Não desanima rapaz, você está aprendendo, isso não acontece de uma hora pra outra.

    Posta o código completo das suas classes, senão também não tem como nós adivinharmos onde voc~e implementou cada parte do software.

    Como mudar assinatura? Onde?
    Você deve ter uma classe que tem um método mais ou menos assim:


    Pois bem, nesta classe, você está fazendo import de java.sql.Date ou java.sql.*
    Estou pedindo para você mudar a assinatura para ficar assim:


    O que define a assinatura de um método é:
    - os modificadores de acesso (public, protected, private, abstract, native, static...)
    - tipo de retorno (void, byte, boolean, short, char, int, float, long, double, ou um tipo de classe, interface ou enum)
    - nome do método
    - tipos de parâmetros, no seu caso, é só alterar de java.sql.Date para java.util.Date


    Qual é a parte que salva no banco de dados?
    Pôxa, você não postou o código completo, não temos como responder isso pra ti...
    Mas se você está usando java.sql.Date, então em algum lugar de seu código você provavelmente vai salvar isso em um banco de dados.

    Onde colocar a conversão para java.util.Date?
    Exatamente no lugar onde está acontecendo seu ClassCastException.
    Você não postou o StackTrace do erro, mas provavelmente está acontecendo aqui:



    Se você se basear no código que postei, pode alterar as duas linhas acima para ficarem conforme abaixo:



    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    Faço seu trabalho Java,
    clique aqui

    Acesse http://www.guj.com.br/



  1. clever53
    Posts:11


    Comment Arrow

    Publicado em: 14/07/2016 14:04:58

    Confesso que fiquei decepcionado com o java. Se apresenta essa dificuldade para uma simples data, o que será de outras coisas mais complicadas?
    Fiz esse mesmo programa em VBA e tudo funcionou sem problemas. Mas pediram-me para fazer também em java. Daí minha desventura atual...

    Como disse, tenho 3 camadas: Controle, Modelo e Visão.
    No modelo, onde estão as variáveis, o meu código está assim:

    [ModeloInterrupcao.java

    import java.util.Date;

    public class ModeloInterrupcao {
    private int idInterrupcao;
    private int matricula;
    private String apenado;
    private String motivo;
    private int idCondenacao;
    private Date dataInicial;
    private Date dataFinal;
    ]
    Ali, onde está java.util.Date estava java.sql.Date. Alterei para eliminar a mensagem de Cast.
    Isso resolveu o problema da conversão da data entre java.sql e java.util.

    Na camada controle tenho o seguinte código:

    [ControleInterrupcao.java

    package Controle;

    import Modelo.ModeloInterrupcao;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;
    import javax.swing.JOptionPane;


    public class ControleInterrupcao {
    ConectaBanco conex = new ConectaBanco();
    ModeloInterrupcao mod = new ModeloInterrupcao();
    ConectaBanco conexCondenacao = new ConectaBanco();

    public void inserirInterrupcao(ModeloInterrupcao mod){
    conex.conexao();

    try {
    PreparedStatement pst = conex.conn.prepareStatement("insert into interrupcoes (matricula,apenado,data_inicial, data_final, motivo) values(?,?,?,?,?)";
    pst.setInt(1, mod.getMatricula());
    pst.setString(2,mod.getApenado());
    pst.setDate(3, (java.sql.Date) mod.getDataInicial()); //conversão para java.sql.Date realizada pelo próprio NetBeans
    pst.setDate(4, (java.sql.Date) mod.getDataFinal());
    pst.setString(5,mod.getMotivo());
    pst.execute();

    JOptionPane.showMessageDialog(null,"Interrupção cadastrada com sucesso!";

    } catch (SQLException ex) {
    JOptionPane.showMessageDialog(null,"Erro ao cadastrar interrupção!\nErro:" +ex);
    }
    conex.desconecta();
    }


    public void alterarInterrupcao(ModeloInterrupcao mod){
    conex.conexao();

    try {
    PreparedStatement pst = conex.conn.prepareStatement("update interrupcoes set matricula=?, apenado=?,data_inicial=?, data_final=?, motivo=? where id_interrupcao=?";
    pst.setInt(1, mod.getMatricula());
    pst.setString(2, mod.getApenado());
    pst.setDate(3, (java.sql.Date) mod.getDataInicial()); //conversão para java.sql.Date realizada pelo próprio NetBeans
    pst.setDate(4, (java.sql.Date) mod.getDataFinal());
    pst.setString(5, mod.getMotivo());
    pst.setInt(6, mod.getIdInterrupcao());
    pst.execute();

    JOptionPane.showMessageDialog(null,"Interrupção alterada com sucesso!";
    } catch (SQLException ex) {
    JOptionPane.showMessageDialog(null,"Erro ao alterar a Interrupção!\nErro:"+ex);
    }
    }

    public void excluirInterrupcao(ModeloInterrupcao mod){
    conex.conexao();
    try {
    PreparedStatement pst = conex.conn.prepareStatement("delete from interrupcoes where id_interrupcao=?";
    pst.setInt(1, mod.getIdInterrupcao());
    pst.execute();
    JOptionPane.showMessageDialog(null,"Cadastro excluído com sucesso!";
    } catch (SQLException ex) {
    JOptionPane.showMessageDialog(null,"Erro ao excluir o cadastro!\nErro:"+ex);
    }
    conex.desconecta();
    }
    ]

    no formulário, na camada visão, tenho:

    [FrmInterrupcoes.java

    package Visao;

    import Controle.ConectaBanco;
    import Controle.ControleConverteData;
    import Controle.ControleInterrupcao;
    import Modelo.ModeloInterrupcao;
    import Modelo.ModeloTabela;
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import javax.swing.JOptionPane;
    import javax.swing.ListSelectionModel;


    public class FrmInterrupcoes extends javax.swing.JFrame {

    ConectaBanco conex = new ConectaBanco();
    ConectaBanco conexCondenacao = new ConectaBanco();
    ModeloInterrupcao mod = new ModeloInterrupcao();
    ControleInterrupcao control = new ControleInterrupcao();

    public FrmInterrupcoes() {
    initComponents();
    }

    private void jButtonNovoActionPerformed(java.awt.event.ActionEvent evt) {

    jTextFieldMatricula.setEnabled(true);
    jTextFieldApenado.setEnabled(true);
    jDateChooserDataInicial.setEnabled(true);
    jDateChooserDataFinal.setEnabled(true);

    jTextFieldMatricula.setText("";
    jTextFieldApenado.setText("";



    jButtonSalvar.setEnabled(true);

    }

    private void jButtonSalvarActionPerformed(java.awt.event.ActionEvent evt) {

    mod.setMatricula(Integer.parseInt(jTextFieldMatricula.getText()));
    mod.setApenado(jTextFieldApenado.getText());
    mod.setDataInicial(jDateChooserDataInicial.getDate());
    mod.setDataFinal(jDateChooserDataFinal.getDate());
    mod.setMotivo((String) jComboBoxMotivo.getSelectedItem());
    mod.setIdInterrupcao(Integer.parseInt(jTextFieldId.getText()));
    control.inserirInterrupcao(mod);

    }
    private void jButtonEditarActionPerformed(java.awt.event.ActionEvent evt) {

    mod.setMatricula(Integer.parseInt(jTextFieldMatricula.getText()));
    mod.setApenado(jTextFieldApenado.getText());
    mod.setDataInicial(jDateChooserDataInicial.getDate());
    mod.setDataFinal(jDateChooserDataFinal.getDate());
    mod.setMotivo((String) jComboBoxMotivo.getSelectedItem());
    mod.setIdInterrupcao(Integer.parseInt(jTextFieldId.getText()));

    control.alterarInterrupcao(mod);
    }


    public void preencherTabela(String SQL){

    ArrayList dados = new ArrayList();

    String[] Colunas = new String[]{"Matrícula","Apenado","Início","Final","Motivo"};
    conex.conexao();
    conex.executaSQL(SQL);

    try {
    conex.rs.first();
    do{
    dados.add(new Object[]{conex.rs.getString("matricula",conex.rs.getString("apenado",conex.rs.getString("data_inicial",conex.rs.getString("data_final",conex.rs.getString("motivo"});

    }while(conex.rs.next());

    } catch (SQLException ex) {
    JOptionPane.showMessageDialog(null, "Erro ao preencher o arraylist!\n ERRO:"+ex);
    }

    ModeloTabela modelo = new ModeloTabela(dados,Colunas);

    jTableInterrupcao.setModel(modelo);

    jTableInterrupcao.getColumnModel().getColumn(0).setPreferredWidth(80);
    jTableInterrupcao.getColumnModel().getColumn(0).setResizable(false);

    jTableInterrupcao.getColumnModel().getColumn(1).setPreferredWidth(180);
    jTableInterrupcao.getColumnModel().getColumn(1).setResizable(false);

    jTableInterrupcao.getColumnModel().getColumn(2).setPreferredWidth(80);
    jTableInterrupcao.getColumnModel().getColumn(2).setResizable(false);

    jTableInterrupcao.getColumnModel().getColumn(3).setPreferredWidth(80);
    jTableInterrupcao.getColumnModel().getColumn(3).setResizable(false);

    jTableInterrupcao.getColumnModel().getColumn(4).setPreferredWidth(80);
    jTableInterrupcao.getColumnModel().getColumn(4).setResizable(false);

    jTableInterrupcao.getTableHeader().setReorderingAllowed(false);
    jTableInterrupcao.setAutoResizeMode(jTableInterrupcao.AUTO_RESIZE_OFF);
    jTableInterrupcao.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    conex.desconecta();
    }

    private void jButtonPesquisarActionPerformed(java.awt.event.ActionEvent evt) {

    preencherTabela("select * from interrupcoes where apenado like'%"+jTextFieldPesquisar.getText()+"%'";
    }

    private void jTableInterrupcaoMouseClicked(java.awt.event.MouseEvent evt) {
    String apenado = "" + jTableInterrupcao.getValueAt(jTableInterrupcao.getSelectedRow(), 1);
    conex.conexao();

    conex.executaSQL("select * from interrupcoes where apenado='" + apenado + "'";
    try {
    conex.rs.first();

    jTextFieldId.setText(String.valueOf(conex.rs.getInt("id_interrupcao"));
    jTextFieldMatricula.setText(String.valueOf(conex.rs.getInt("matricula"));
    jTextFieldApenado.setText(conex.rs.getString("apenado");
    jDateChooserDataInicial.setDate(conex.rs.getDate("data_inicial");
    jDateChooserDataFinal.setDate(conex.rs.getDate("data_final");
    jComboBoxMotivo.setSelectedItem(conex.rs.getString("motivo");

    conex.desconecta();

    jTextFieldMatricula.setEnabled(true);
    jTextFieldApenado.setEnabled(true);
    jDateChooserDataInicial.setEnabled(true);
    jDateChooserDataFinal.setEnabled(true);

    jButtonSalvar.setEnabled(!true);
    jButtonEditar.setEnabled(true);
    jButtonExcluir.setEnabled(true);
    jButtonNovo.setEnabled(true);
    jButtonCancelar.setEnabled(true);

    } catch (SQLException ex) {
    JOptionPane.showMessageDialog(null, "Erro ao selecionar os dados da tabela!\nErro:" + ex);
    conex.desconecta();
    //conexaopesq.desconecta();
    }
    }

    private void jButtonExcluirActionPerformed(java.awt.event.ActionEvent evt) {
    mod.setIdInterrupcao(Integer.parseInt(jTextFieldId.getText())); //passa para a classe de controle
    control.excluirInterrupcao(mod);
    jTextFieldMatricula.setEnabled(true);
    jTextFieldApenado.setEnabled(true);
    jDateChooserDataInicial.setEnabled(true);
    jDateChooserDataFinal.setEnabled(true);
    jComboBoxMotivo.setEnabled(true);

    preencherTabela("select * from interrupcoes where apenado like'%"+jTextFieldPesquisar.getText()+"%'";
    }


    private void jButtonSairActionPerformed(java.awt.event.ActionEvent evt) {
    dispose();
    }

    private void jButtonCancelarActionPerformed(java.awt.event.ActionEvent evt) {
    jTextFieldMatricula.setEnabled(false);
    jTextFieldApenado.setEnabled(false);
    jDateChooserDataInicial.setEnabled(false);
    jDateChooserDataFinal.setEnabled(false);
    jTextFieldMatricula.setText("";
    jTextFieldApenado.setText("";
    jButtonSalvar.setEnabled(false);
    }

    private void jButtonObterDataActionPerformed(java.awt.event.ActionEvent evt) {
    //Coletando a data a partir do datachooser.
    SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy";
    java.util.Date dataRecebidaDoDateChooser = jDateChooserDataInicial.getDate();
    JOptionPane.showMessageDialog(this, "A data selecionada é:"+formato.format(dataRecebidaDoDateChooser));
    } ]

    O que fiz:
    Como pode ver, criei um botão JButtonObterData, para testar a saída da data do jDateChooser. Após a devida conversão, está correta: 14/07/2016 (a data impostada no objeto saí corretamente).
    Alterei, lá no pacote ModeloInterrupcao, as variáveis DataInicial e DataFinal para java.util.Date. Fiz isso simplesmente apagando a importação do java.sql.Date e colocando java.util.Date. Elas assumiram de pronto como java.util.Date. Com isso, desaparece a ocorrência da conversão ou coerção entre java.sql e java.util (cast). Aliás, isso também ocorre se substituir as linhas de comando das datas por aquelas que você mes sugeriu. Mas aparece este outro erro:

    [Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:592)
    at java.lang.Integer.parseInt(Integer.java:615)
    at Visao.FrmInterrupcoes.jButtonSalvarActionPerformed(FrmInterrupcoes.java:280)
    at Visao.FrmInterrupcoes.access$100(FrmInterrupcoes.java:24)
    at Visao.FrmInterrupcoes$2.actionPerformed(FrmInterrupcoes.java:140)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:234
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6535)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6300)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4891)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:488
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:75
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:72
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    CONSTRUÍDO COM SUCESSO (tempo total: 23 segundos) ]

    O que falta agora? Conververter para jogar para o banco de dados. Ou a ocorrência de String vazia não se refere mais às datas?

    [/code]



  1. staroski
    Posts:4599


    Comment Arrow

    Publicado em: 15/07/2016 10:58:18

    Dica para interpretar o StackTrace abaixo:



    Na primeira linha vem o nome da classe de exceção que foi lançada seguida de ": " e a mensagem da exceção.



    NumberFormatException significa que você tentou converter uma String para um tipo numérico, mas não foi possível
    Neste caso, não foi possível converter a String "" para um número, ( vazio, não é um texto numérico )
    Vamos analisar a próxima linha do StackTrace pra descobrir onde aconteceu o problema


    Aconteceu no método "forInputString" da classe "java.lang.NumberFormatException", mais precisamente na linha número 65 do arquivo "NumberFormatException.java"
    Como o código fonte do "NumberFormatException.java" não foi escrito por você, vamos analisar a próxima linha para saber quem chamou o método "forInputString":


    O "forInputString" foi chamado pelo "parseInt" da classe "java.lang.Integer", precisamente na linha 592 do arquivo "Integer.java", vamos para a próxima linha da pilha de chamadas:


    Ainda estamos no fonte da classe "java.lang.Integer", vamos para a próxima linha:


    Opa, o "Integer.parseInt" foi chamado pelo método "jButtonSalvarActionPerformed" da classe "Visao.FrmInterrupcoes", precisamente na linha 280 do arquivo "FrmInterrupcoes.java"

    É lá que você está tentando converter uma String vazia para um número.

    o StackTrace te traz toda a pilha de chamadas desde o método main da sua aplicação.
    Assim, basta ir seguindo as chamadas até chegar no código fonte de sua autoria.


    Sobre você fazer em Java o seu sistema que está em VB, isso não é uma tarefa trivial tá?

    O ideal seria primeiro aprender e entender bem a programação orientada à objetos.
    Você citou que tem 3 camadas: Controle, Modelo e Visão.
    Isso na verdade não são camadas, você está tentando desenvolver seguindo o padrão de projeto MVC - Model-View-Control
    É comum professores e profissionais confundirem MVC com desenvolvimento multicamadas

    Sensacional procurar desenvolver usando MVC
    Mas não é algo trivial, teria que rever algumas coisas

    Por exemplo, na classe de Controle você está usando "JOptionPane.showMessageDialog", ou seja, você está apresentando uma tela, na classe responsável pelo Controle.
    Telas só deveriam ser apresentadas na Visão

    Ou na sua camada de visão você está tentando converter as String para números, e está implementando uma série de lógicas que deveriam estar no Controle

    Você também está acessando o banco diretamente na sua Tela, isso também deveria ser responsabilidade do Controle, ou, melhor ainda, o Controle deveria conversar com uma camada de Persistência

    Enfim, acredito que você esteja apenas ficando confuso com alguns padrões de desenvolvimento, não com o Java em si, até porque MVC e desenvolvimento multicamada é algo que pode ser feito em qualquer linguagem

    Poucos fazem, pois não é algo fácil, o desenvolvimento é demorado, mas o ganho está na manutenção futura, exatamente o oposto do que acontece com quem desenvolve super rápido fazendo um "macarrão de código" mas quando precisa realizar manutenção no software vai transformando o sistema em um monstro.

    Bons estudos


    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    Faço seu trabalho Java,
    clique aqui

    Acesse http://www.guj.com.br/



  1. clever53
    Posts:11


    Comment Arrow

    Publicado em: 16/07/2016 11:47:38

    Que aula!
    Nem acredito que depois de quase 2 semanas estou conseguindo salvar e alterar registros na tabela interrupcoes.
    Pelo visto, teria que fazer umas aulas de lógica de programação.
    O que fiz para solucionar o problema:
    - o problema de string vazia, você matou na mosca. Eu estava tentando pegar o Id do formulário, que não existe porque é auto-incrementado pelo Banco de Dados, e salvar. Exclui a linha e tudo certo.
    - alterei as assinaturas dos métodos da DataInicial e DataFinal;
    - converti o que está sendo recebido dos DataChoosers para java.sq, conforme sua orientação. Deu certo.
    Muito obrigado pela ajuda, pois sem ela eu teria desistido do java. Agora vêm os outros cálculos. rsrsrs



  1. clever53
    Posts:11


    Comment Arrow

    Publicado em: 30/07/2016 10:58:52

    Eu novamente.

    O problema foi resolvido apenas para o botão salvar, mas não para o editar/alterar. Usando a mesma conversão, dá uma mensagem de erro:
    "coluna data_inicial é do tipo Date, mas a expressão é do tipo character varying. Você precisa reescrever ou converter a expressão.
    No banco de dados é mesmo tipo date porque preciso fazer cálculos com ela.
    Para alterar, eu busco na tabela os dados que eu quero alterar e jogo para o formulário. Até aí, tudo bem. Altero os dados e tento salvar. Vem a mensagem de erro acima.
    Que eu saiba, o JDateChooser não é uma string, mas o sistema diz que sim.

    Comandos utilizados para conversão:

    java.util.Date dataRecebidaDoDateChooser = jDateChooserDataInicial.getDate();
    java.sql.Date dataParaSalvarNoBanco = new java.sql.Date(dataRecebidaDoDateChooser.getTime());
    mod.setDataInicial(dataParaSalvarNoBanco);
    dataRecebidaDoDateChooser = jDateChooserDataFinal.getDate() ;
    dataParaSalvarNoBanco = new java.sql.Date( dataRecebidaDoDateChooser.getTime()) ;
    mod.setDataFinal( dataParaSalvarNoBanco);

    Alguém tem uma luz?



  1. staroski
    Posts:4599


    Comment Arrow

    Publicado em: 01/08/2016 15:41:36

    Em princípio seu problema não está no código postado acima.

    O problema deve ser no momento onde você passa os parâmetros para seu Statement ou PreparedStatement

    Tens como postar o StackTrace do erro?
    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    Faço seu trabalho Java,
    clique aqui

    Acesse http://www.guj.com.br/



  1. clever53
    Posts:11


    Comment Arrow

    Publicado em: 01/08/2016 17:02:25

    A mensagem de erro é:
    Erro ao alterar interrupcão!
    Errorg.postgresql.util.PSQLException:ERRO:coluna"data_inicial" é do tipo date mas a expressão é do tipo character varyubg.
    Dica: Você precisará reescrever ou converter a expressão.
    Posição: 63

    Pensei que fosse problema na hora de preencher a tabela porque dela os dados são setados no formulário. Então alterei o comando getString para getDate e formatei a data para aparecer no nosso formato brasileiro. Não resolveu.

    [public void preencherTabela(String SQL){
    ArrayList dados = new ArrayList();

    String[] Colunas = new String[]{"Id","Matrícula","Apenado","Motivo","Início","Final"};
    conex.conexao();
    conex.executaSQL(SQL);

    try {
    conex.rs.first();
    do{
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy";
    dados.add(new Object[]{conex.rs.getString("id_interrupcao",conex.rs.getString("matricula",conex.rs.getString("apenado",conex.rs.getString("motivo",df.format(conex.rs.getDate("data_inicial"),df.format(conex.rs.getDate("data_final")});

    }while(conex.rs.next());

    } catch (SQLException ex) {
    JOptionPane.showMessageDialog(null, "Erro ao preencher o arraylist!\n ERRO:"+ex);
    }
    ]

    O método Alterar/Editar está assim:

    [public void alterarInterupcao(ModeloInterrupcao mod){

    conex.conexao();
    try {
    PreparedStatement pst = conex.conn.prepareStatement("update interrupcoes set matricula=?, apenado=?,data_inicial=?,data_final=?,motivo=? where id_interrupcao=?";
    pst.setInt(1,mod.getMatricula());
    pst.setString(2,mod.getApenado());
    pst.setString(3,mod.getMotivo());
    pst.setDate(4, (java.sql.Date) mod.getDataInicial());
    pst.setDate(5, (java.sql.Date) mod.getDataFinal());
    pst.setInt(6, mod.getId());
    pst.execute();
    JOptionPane.showMessageDialog(null,"Interrupção alterada com sucesso!";
    } catch (SQLException ex) {
    JOptionPane.showMessageDialog(null,"Erro ao alterar interrupção!\nErro:"+ex);
    }
    }
    ]

    No evento da Tabela que seta os dados para o formulário o código está assim:

    [ private void jTableInterrupcaoMouseClicked(java.awt.event.MouseEvent evt) {
    String id = ""+jTableInterrupcao.getValueAt(jTableInterrupcao.getSelectedRow(),0);
    conex.conexao();
    conex.executaSQL("select * from interrupcoes where id_interrupcao='"+id+"'";

    try {
    conex.rs.first();
    jTextFieldId.setText(String.valueOf(conex.rs.getInt("id_interrupcao"));
    jTextFieldMatricula.setText(String.valueOf(conex.rs.getInt("matricula"));
    jTextFieldApenado.setText(conex.rs.getString("apenado");
    jComboBoxMotivo.setSelectedItem(conex.rs.getString("motivo");
    jDateChooserDataInicial.setDate(conex.rs.getDate("data_inicial");
    jDateChooserDataFinal.setDate(conex.rs.getDate("data_final");
    } catch (SQLException ex) {
    Logger.getLogger(FrmInterrupcoes.class.getName()).log(Level.SEVERE, null, ex);
    }
    jButtonSalvar.setEnabled(true);
    }
    ]

    Ao preencher a tabela, busco os dados no BD e as datas vêm em formato de data. Seleciono na tabela o dado que quero alterar e, ao clicar, são setados para o formulário. Altero e clico em editar. Aí vem a mensagem de erro.
    [/code]



  1. staroski
    Posts:4599


    Comment Arrow

    Publicado em: 01/08/2016 17:33:28

    Só um pouco de falta de atenção

    Veja os índices dos parâmetros de sua query


    Agora compare com os valores que você está atribuindo em cada indice

    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    Faço seu trabalho Java,
    clique aqui

    Acesse http://www.guj.com.br/



  1. clever53
    Posts:11


    Comment Arrow

    Publicado em: 02/08/2016 10:32:24

    Que vergonha. E a gente olha, olha e nada vê.
    Obrigado, mais uma vez. Espero que agora eu decole de vez.



  1. Relacionados