Programa gerando parcelas com mesma data de vencimento (RESOLVIDO)

Bom dia,

Galera preciso de uma ajuda, meu programa estava funcionando certinho até eu precisar fazer umas atualizações, o programa gera as parcelas e mostra na tela as datas corretas mas na hora der salvar no banco ele salva todas com a mesma data, rodei a versão final sem as alterações e aconteceu a mesma coisa.

código para salvar as parcelas:

package Controle;

import Modelo.ModeloAcordo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class ControleAcordo {

private String InsereAcordo = "insert into acordo (nome, valortotal, dataacordo, qtdparcelas, valorparcela, numeroparcela, vencimento, codacordo) values (?,?,?,?,?,?,?,?)";
private String AlteraAcordo = "update acordo set nome=?,endereco=?,bairro=?,cep=?,cnpj=?,fone=?,cod_cidade=? where codcli = ?  ";
private String ExcluiAcordo = "delete from acordo where codaej = ?";

private Statement st;

private ResultSet tab_uf;

private Statement stm;
private Connection con;
private PreparedStatement pst;

public void InsereAcordo(ModeloAcordo aux) {
ConectaBanco cb = new Controle.ConectaBanco();
con = cb.conectaPostgreSql(“Test Banco Carlos”);
try {
pst = con.prepareStatement(InsereAcordo);
pst.setString(1, aux.getNome());
pst.setDouble(2, aux.getValortotal());
pst.setString(3, aux.getDataacordo());
pst.setInt(4, aux.getQtdparcelas());
pst.setDouble(5, aux.getValorparcela());
pst.setInt(6, aux.getNumeroparcela());
pst.setString(7, aux.getVencimento());
pst.setInt(7, aux.getCodacordo());

        pst.executeUpdate();
        JOptionPane.showMessageDialog(null, "Cadastro Realizado com sucesso!!!");
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "erro de sql" + ex);
    }
}

public void AlteraAcordo(ModeloAcordo aux) {
    ConectaBanco cb = new ConectaBanco();
    con = cb.conectaPostgreSql("Test Banco Carlos");
    try {
        pst = con.prepareStatement(AlteraAcordo);
       pst.setString(1, aux.getNome());
        pst.setDouble(2, aux.getValortotal());
        pst.setString(3, aux.getDataacordo());
        pst.setInt(4, aux.getQtdparcelas());
        pst.setDouble(5, aux.getValorparcela());
        pst.setInt(6, aux.getNumeroparcela());
        pst.setString(7, aux.getVencimento());
        pst.setInt(7, aux.getCodacordo());

        
        pst.executeUpdate();
        JOptionPane.showMessageDialog(null, "Cadastro Alterado com sucesso!!!");
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "erro de sql" + ex);
    }
}

public void ExcluAcordo(ModeloAcordo aux) {
    ConectaBanco cb = new ConectaBanco();
    con = cb.conectaPostgreSql("Test Banco Carlos");
    try {
        pst = con.prepareStatement(ExcluiAcordo);
        pst.setInt(1, aux.getCodacordo());
        pst.executeUpdate();
        JOptionPane.showMessageDialog(null, "Cadastro Excluido com sucesso!!!");
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "erro de sql" + ex);
    }
}

public ArrayList<ModeloAcordo> buscarAcordo(int codigo) {
    String sql = "select * from cliente where id = " + codigo;
    ArrayList<ModeloAcordo> retorn = new ArrayList<ModeloAcordo>();
    try {
        ConectaBanco cb = new Controle.ConectaBanco();
        con = cb.conectaPostgreSql("Test Banco Carlos");
        Statement state = con.createStatement();
        ResultSet rs = state.executeQuery(sql);
        while (rs.next()) {
            retorn.add(getAcordo(rs));
        }
        state.close();
    } catch (SQLException e) {
        System.err.println(e);
    }
    return retorn;
}

    public ArrayList<ModeloAcordo> buscarAcordo() {
    String sql = "select ; ";
    ArrayList<ModeloAcordo> retorn = new ArrayList<ModeloAcordo>();
    try {
        ConectaBanco cb = new Controle.ConectaBanco();
        con = cb.conectaPostgreSql("Test Banco Carlos");
        Statement state = con.createStatement();
        ResultSet rs = state.executeQuery(sql);
        while (rs.next()) {
            retorn.add(getAcordo(rs));
        }
        state.close();
    } catch (SQLException e) {
        System.err.println(e);
    }
    return retorn;


    }
 
private ModeloAcordo getAcordo(ResultSet rs) throws SQLException {

    ModeloAcordo Acordo = new ModeloAcordo();
    Acordo.setNome(rs.getString("nome"));
    Acordo.setValortotal(rs.getDouble("valortotal"));
    Acordo.setDataacordo(rs.getString("dataacordo"));
    Acordo.setQtdparcelas(rs.getInt("qtdparcelas"));   
    Acordo.setValorparcela(rs.getDouble("valorparcela"));
    Acordo.setNumeroparcela(rs.getInt("numeroparcela"));
    Acordo.setVencimento(rs.getString("vencimento"));
    Acordo.setCodacordo(rs.getInt("codacordo"));
   
   
    


    return Acordo;
}
private static Controle.ControleAcordo c_acordo;

public static Controle.ControleAcordo getInstanceacordo() {
    if (c_acordo == null) {
        c_acordo = new Controle.ControleAcordo();
    }

    return c_acordo;
}

}

Porque é que a data é String e não Date? Eventualmente está a haver aqui algum problema com o formato da data, porque ele muda para 2017 a certa altura. O mes deve estar a ser trocado com outro campo.

Eu acho q é um problema de indice, ambos estão com 7

    pst.setString(7, aux.getVencimento());
    pst.setInt(7, aux.getCodacordo());

Como falou o amigo Diego. No índice você esta declarando 8 atributos e está setando 7 e o 7 novamente no oitavo atributo.

Corrigi isto mas o problema continua.

O problema acontece ao inserir ou ao alterar?

Na hora de inserir.

O insert está correto. Verifica essa class aux, como esta data vencimento esta vindo ? Pelo que eu vi aqui o ano ta mudando, deve ser o tratamento dentro desta class "ModeloAcordo ".

não acho que seja na classe modelo, segue o código que ele executa ao clicar em parcelar (aqui deveria pegar as datas de vencimento e ir salvando uma a uma até a ultima)

     valorid = Integer.parseInt(txtID.getText());
    try {
        for (int x = 0;x < Integer.parseInt(txtQuantidadedeparcelas1.getText());x++) {
            ConectaBanco cb = new Controle.ConectaBanco();
            Connection con = cb.conectaPostgreSql("Test Banco Carlos");
    
            PreparedStatement Update = con.prepareStatement("insert into parcelas ( fk_cod_acordo,vencimento,situação,valor,parcela) values (?,?,?,?,?)");
            //PreparedStatement Update = ConectaBanco.con.prepareStatement();
            
            Update.setInt(1, valorid);
            Update.setDate(2, new java.sql.Date(Metodos.StringToDate(jtblParcela.getValueAt(x, 1).toString(), "DD/MM/yyyy").getTime()));
            Update.setString(3, "A PAGAR");
            Update.setDouble(4, Double.parseDouble(Metodos.Conversor(jtblParcela.getValueAt(x, 2).toString(), 1))); 
            Update.setInt(5, Integer.parseInt(jtblParcela.getValueAt(x, 0).toString()));
             Update.executeUpdate();
        }
    } catch (SQLException ex) {
        Logger.getLogger(Cadastro_de_cliente.class.getName()).log(Level.SEVERE, null, ex);
    }
  
    
    JOptionPane.showMessageDialog(null,"Parcelamento realizado com sucesso!!!");
    this.dispose();

Coloque um Sysout no metodo de inserir para verificar se os dados estão entrando estaõ corretos, assim vai dá para saber se é um problema de persistência ou da aplicação

public void InsereAcordo(ModeloAcordo aux) {
System.out.print(aux.getNome());
System.out.print("\t");
System.out.println(aux.getVencimento());
ConectaBanco cb = new Controle.ConectaBanco();
  • O problema do indice aparecem no Inserir e no Alterar.

  • A imagem da tabela do banco não parece que foi gerado pelo código q postou.

o código que salva as informações naquela tabela é este ultimo que postei, o restante da tabela é preenchido ao realizar o pagamento das parcelas.

Testa com “dd/MM/yyyy”, acho q com “DD/MM/yyyy” não funciona.

Muito Obrigado a todos pela ajuda!!! Realmente o problema era este mesmo “DD/MM/yyyy” que não estava funcionando.