Ir ao conteúdo
  • Cadastre-se

Parte Java do Banco de Dados não funciona


Air-Gear

Posts recomendados

Olá pessoal!

Bem, a parte de SQL eu já arrumei, agora preciso fazer a parte em java. O códgo faço seguinte, cadastra novos dados numa tabela e atualiza um dado numa outra tabela.

O código ficou assim:

public void adiciona(HistoricoEntrada historico, Controle controle) throws SQLException {

String sql = "insert into historico_entrada(dado, data_movimentacao, valor_entrada, saldo_atual, valor_bruto)" +

"values(?,?,?,?,?)";

PreparedStatement stmt = conexao.prepareStatement(sql);

stmt.setString(1, historico.getDado());

stmt.setString(2, historico.getDataMovimentacao());

stmt.setFloat(3, historico.getValorEntrada());

stmt.setFloat(4, historico.getSaldoAtual());

stmt.setFloat(5, historico.getValorBruto());

stmt.execute();

stmt.close();

String sql2 = "UPDATE controle_vencimento C INNER JOIN historico_entrada H" +

"SET C.saldo_atual = C.saldo_atual - H.valor_entrada" +

"WHERE H.dado = ? AND C.dado = H.dado";

PreparedStatement stmt2 = conexao.prepareStatement(sql2);

stmt2.setFloat(1,controle.getSaldoAtual());

stmt2.setFloat(2,controle.getSaldoAtual());

stmt2.setFloat(3,historico.getValorEntrada());

stmt2.setString(4,historico.getDado());

stmt2.setString(5,controle.getDado());

stmt2.setString(6,historico.getDado());

stmt2.execute();

stmt2.close();

}

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...
  • 4 semanas depois...

Desculpem o up do tópico, mas ainda estou no mesmo problema e já tentei de tudo e procurei ajuda com colegas e professores e nada.

Eu entendi que precisa usar os GETs na mesma ordem dos dados inseridos no SQL. Não sei se quando repete os dados no SQL repete também no Java.

Será que tem haver que não tem chave estrangeira nas tabelas ou não utiliza a chave primaria na associação das tabelas?

Link para o comentário
Compartilhar em outros sites

Olha...sugestão...usa stored procedure no banco e chama ele...vai ficar mais elegante e robusto....aí é só chamar pelo java...

Ok! Eu pesquisei no Google pra ver o stored procedure e pelo que entendi devo colocar assim a minha query:


USE Northwind

GO

CREATE PROCEDURE atualiza_valor_dado

@ dado float

AS

UPDATE controle_vencimento C INNER JOIN historico_entrada H" +
"SET C.saldo_atual = C.saldo_atual - H.valor_entrada" +
"WHERE H.dado = dado AND C.dado = H.dado

É isso mesmo?

Link para o comentário
Compartilhar em outros sites

Bem, agora as coisas começaram a se esclarecer. Eu vi que getSaldoAtual estava retornando uma valor errado e um outro get também. Eu arrumei os dois aqui e agora já salva, mas ainda tá dando erro, conferem:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

at DAO.DAOHistoricoEntrada.adiciona(DAOHistoricoEntrada.java:50)

at telas.FrmHistoricoEntrada.cadastro(FrmHistoricoEntrada.java:388)

at telas.FrmHistoricoEntrada.jBSalvarActionPerformed(FrmHistoricoEntrada.java:299)

at telas.FrmHistoricoEntrada.access$300(FrmHistoricoEntrada.java:30)

at telas.FrmHistoricoEntrada$4.actionPerformed(FrmHistoricoEntrada.java:122)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)

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:6504)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)

at java.awt.Component.processEvent(Component.java:6269)

at java.awt.Container.processEvent(Container.java:2229)

at java.awt.Component.dispatchEventImpl(Component.java:4860)

at java.awt.Container.dispatchEventImpl(Container.java:2287)

at java.awt.Component.dispatchEvent(Component.java:4686)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)

at java.awt.Container.dispatchEventImpl(Container.java:2273)

at java.awt.Window.dispatchEventImpl(Window.java:2713)

at java.awt.Component.dispatchEvent(Component.java:4686)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)

at java.awt.EventQueue.access$000(EventQueue.java:101)

at java.awt.EventQueue$3.run(EventQueue.java:666)

at java.awt.EventQueue$3.run(EventQueue.java:664)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)

at java.awt.EventQueue$4.run(EventQueue.java:680)

at java.awt.EventQueue$4.run(EventQueue.java:678)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Tá retornando um valor nulo, acredito que o erro deve ser porque a coluna SALDO_ATUAL não existia antes até o gerente pedir as modificações. Se for isso, eu acrescentei os dados no SALDO_ATUAL com os valores do VALOR, mas ainda tem alguns que estão nulos.

O erro da linha 50 é referente ao stmt2.setFloat(1,controle.getSaldoAtual()); eu verifiquei se tinha algum erro na classe, mas não achei.

Já estamos conseguindo achar o problema principal.

Link para o comentário
Compartilhar em outros sites

Bom, pesquisei o Google pra aprender como executa o debug corretamente e fiz o teste. Coloquei os breakpoints neste pedaço do código:


String sql2 = "UPDATE controle_vencimento_cpr AS C"+
"SET C.saldo_atual = C.saldo_atual - H.valor_entrada"+
"INNER JOIN historico_de_entrada AS H ON H.cpr = C.cpr"+
"WHERE H.cpr = ?";

PreparedStatement stmt2 = conexao.prepareStatement(sql2);

stmt2.setFloat(1,controle.getSaldoAtual());
stmt2.setFloat(2,controle.getSaldoAtual());
stmt2.setFloat(3,historico.getValorEntrada());
stmt2.setString(4,historico.getCpr());
stmt2.setString(5,controle.getCpr());
stmt2.setString(6,historico.getCpr());

stmt2.execute();
stmt2.close();

Beleza. Executei o debug e deu essa mensagem de erro:

Ouvindo em javadebug

Executando programa do usuário

Não foi possível enviar o ponto de interrupção LineBreakpoint DAOHistoricoEntrada.java : 46, razão: Não há local executável disponível na linha 46 da classe DAO.DAOHistoricoEntrada.

Inválido LineBreakpoint DAOHistoricoEntrada.java : 46

Não foi possível enviar o ponto de interrupção LineBreakpoint DAOHistoricoEntrada.java : 45, razão: Não há local executável disponível na linha 45 da classe DAO.DAOHistoricoEntrada.

Inválido LineBreakpoint DAOHistoricoEntrada.java : 45

Não foi possível enviar o ponto de interrupção LineBreakpoint DAOHistoricoEntrada.java : 44, razão: Não há local executável disponível na linha 44 da classe DAO.DAOHistoricoEntrada.

Inválido LineBreakpoint DAOHistoricoEntrada.java : 44

LineBreakpoint DAOHistoricoEntrada.java : 43 enviado com êxito.

LineBreakpoint DAOHistoricoEntrada.java : 58 enviado com êxito.

LineBreakpoint DAOHistoricoEntrada.java : 57 enviado com êxito.

LineBreakpoint DAOHistoricoEntrada.java : 55 enviado com êxito.

LineBreakpoint DAOHistoricoEntrada.java : 54 enviado com êxito.

LineBreakpoint DAOHistoricoEntrada.java : 53 enviado com êxito.

LineBreakpoint DAOHistoricoEntrada.java : 52 enviado com êxito.

LineBreakpoint DAOHistoricoEntrada.java : 51 enviado com êxito.

LineBreakpoint DAOHistoricoEntrada.java : 50 enviado com êxito.

LineBreakpoint DAOHistoricoEntrada.java : 48 enviado com êxito.

Ponto de interrupção na linha 43 na classe DAO.DAOHistoricoEntrada pela thread AWT-EventQueue-0.

Thread AWT-EventQueue-0 parada em DAOHistoricoEntrada.java:43.

Executando programa do usuário

Ponto de interrupção na linha 48 na classe DAO.DAOHistoricoEntrada pela thread AWT-EventQueue-0.

Thread AWT-EventQueue-0 parada em DAOHistoricoEntrada.java:48.

Executando programa do usuário

Ponto de interrupção na linha 50 na classe DAO.DAOHistoricoEntrada pela thread AWT-EventQueue-0.

Thread AWT-EventQueue-0 parada em DAOHistoricoEntrada.java:50.

Executando programa do usuário

Programa do usuário finalizado

Nas linhas 43 à 46 são da query UPDATE e das 48 à 58 são o resto do código testado. O programa não executa os códigos depois da linha 50.

Link para o comentário
Compartilhar em outros sites

  • mês depois...

Desculpa pelo UP novamente. Ainda não resolvi, porêm achei o que pode ser o problema.

No getSaldoAtual a váriavel foi declaro com a primeira letra maiuscula. Não falo o nome da váriavel, mas sim a própria. Em fez de declarar float foi declarado Float. Até aí tudo bem, mas quando faço a alteração não busca o valor no banco de dados.

Foi bem neste getSaldoAtual que está dando valor nulo e pula os outros GET para atualização do "valor atual".

Como resolvo isso?

Link para o comentário
Compartilhar em outros sites

Não entendi uma coisa

"UPDATE controle_vencimento_cpr AS C"+

"SET C.saldo_atual = C.saldo_atual - H.valor_entrada"+

"INNER JOIN historico_de_entrada AS H ON H.cpr = C.cpr"+

"WHERE H.cpr = ?";

Tem somente um "?", onde estão os outros 5 que você está setando? além do 1 e 2 serem iguais.

stmt2.setFloat(1,controle.getSaldoAtual());

stmt2.setFloat(2,controle.getSaldoAtual());

stmt2.setFloat(3,historico.getValorEntrada());

stmt2.setString(4,historico.getCpr());

stmt2.setString(5,controle.getCpr());

stmt2.setString(6,historico.getCpr());

Está muito confuso, pelo que entendi você precisa inserir um valor de entrada na tabela historico_de_entrada e depois chamar esse update passando somente o ID da entrada adicionada e mesmo assim não seria a melhor maneira de fazer.

Link para o comentário
Compartilhar em outros sites

Não entendi uma coisa

"UPDATE controle_vencimento_cpr AS C"+

"SET C.saldo_atual = C.saldo_atual - H.valor_entrada"+

"INNER JOIN historico_de_entrada AS H ON H.cpr = C.cpr"+

"WHERE H.cpr = ?";

Tem somente um "?", onde estão os outros 5 que você está setando? além do 1 e 2 serem iguais.

stmt2.setFloat(1,controle.getSaldoAtual());

stmt2.setFloat(2,controle.getSaldoAtual());

stmt2.setFloat(3,historico.getValorEntrada());

stmt2.setString(4,historico.getCpr());

stmt2.setString(5,controle.getCpr());

stmt2.setString(6,historico.getCpr());

Está muito confuso, pelo que entendi você precisa inserir um valor de entrada na tabela historico_de_entrada e depois chamar esse update passando somente o ID da entrada adicionada e mesmo assim não seria a melhor maneira de fazer.

Essa é uma das dúvidas que eu tenho e que ninguém tirou. Como peguei esse programa já com algumas partes feito, eu adaptei pra dar continuidade. Essa parte que ler a querry eu não entendi por completo. Por isso que muito perguntam se é a querry que está errada, mas não era porque testei separado e funcionou. O problema mesmo era a parte em Java.

A ideia é mais ou menos essa que você disse. A diferença é que não é um ID e isso é uma outra dúvida que tenho, só posso fazer o UPDATE quando o WHERE ler o ID?

Link para o comentário
Compartilhar em outros sites

"UPDATE controle_vencimento_cpr AS C"+

"SET C.saldo_atual = C.saldo_atual - H.valor_entrada"+

"INNER JOIN historico_de_entrada AS H ON H.cpr = C.cpr"+

"WHERE H.cpr = ?";

Tem somente um "?", onde estão os outros 5 que você está setando? além do 1 e 2 serem iguais.

stmt2.setFloat(1,historico.getIdEntrada());

Deveria ser algo assim, usando somente uma passagem de parametro, smt2t.setFloat(1,1) !! Mude seu update ou use somente uma passagem de parâmetro no java !

Você tem que entender a lógica de suas tabelas, na maneira que mostrou teria que chamar esse update para ele atualizar os valores no controle, passando somente o ID inserido no histórico, a soma de valores já é feita no update não precisa ser feita no java!

Boa sorte !

Link para o comentário
Compartilhar em outros sites

Valeu lucasiorio!

Eu queria entender isso, mas agora tive que fazer umas modificações a pedido da minha encarregada e eu tive que mudar algums coisas no programa.

Agora alêm da JTable que mostra todos os dados do HistoricoEntrada tem também o JTable que mostra todos os dados do ControleDados. O novo processo de cadastrar um histórico de entrada e atulizar o saldo atual de controle de daods é o seguinte:

Primeiro pesquiso na tabela de ControleDado o registro onde vou retirar um valor. Clico nele e já inseri os dados necessários e só completo com a data da movimentação e valor de entrada. Eu mando salvar e inserir os dados no HistoricoEntrada e atualizo o novo saldo atual no ControleDados.

Eu gostaria de saber se tem como fazer um calculo no formulário que já manda para o banco de dados o novo saldo atual?

Bom, os novos códigos são esses:

Classe DAOHistoricoEntrada


public void adiciona(HistoricoEntrada historico) throws SQLException {
String sql = "insert into historico_de_entrada(dado, data_movimentacao, valor_entrada, saldo_atual, valor_bruto)" +
"values(?,?,?,?,?)";
PreparedStatement stmt = conexao.prepareStatement(sql);

stmt.setString(1, historico.getDado());
stmt.setString(2, historico.getDataMovimentacao());
stmt.setFloat(3, historico.getValorEntrada());
stmt.setFloat(4, historico.getSaldoAtual());
stmt.setFloat(5, historico.getValorBruto());

stmt.execute();
stmt.close();
}
public void adiciona2(ControleDado controle) throws SQLException {
String sql2 = "UPDATE controle_vencimento_dado " +
"SET C.saldo_atual = ?" +
"WHERE dado = ?";

try{
PreparedStatement stmt2 = conexao.prepareStatement(sql2);

stmt2.setFloat(1,controle.getSaldoAtual());
stmt2.setString(2, controle.getDado());

stmt2.execute();
stmt2.close();
}
catch(NullPointerException ex){
System.out.println(ex.getMessage());
//tratar sua exception
}
}

Classe FrmHistoricoEntrada


public void cadastro() {
try {
HistoricoEntrada h1 = new HistoricoEntrada();
ControleDado c1 = new ControleDado();
h1.setCpr(jTdado.getText());
h1.setDataMovimentacao(jTDataMovimentacao.getText());
h1.setValorEntrada(Float.valueOf(jTValorEntrada.getText()));
h1.setSaldoAtual(Float.valueOf(jTSaldoAtual.getText()));
h1.setValorBruto(Float.valueOf(jTValorBruto.getText()));
c1.setSaldoAtual(Float.valueOf(jTSaldoAtual.getText())-Float.valueOf(jTValorEntrada.getText()));
DAOHistoricoEntrada dao = new DAOHistoricoEntrada();
dao.adiciona(h1);
dao.adiciona2(c1);
JOptionPane.showMessageDialog(null, "Dados cadastrados com sucesso!");
} catch (SQLException sQLException) {
}

}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!