Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Double aumentando uma casa

Boa tarde pessoal! Nos testes do meu sistema verifiquei que ao alterar um registro os campos do tipo "Double", aumentam uma casa... Por exemplo, alterei um registro com preço 10,00 e peso 1,00 ambos do tipo "Double", não alterei as informações do preço e do peso... Porém quando eu salvo o registro o preço fica 100,00 e o peso 10,00

Meu método salva no Dao:

1    public void salva(Produto produto) {
2        manager.getTransaction().begin();
3        if (produto.getId() == null) {
4         // Novo registro
5            manager.persist(produto);
6        } else {
7         // Atualizo registro
8            manager.merge(produto);
9        }
10        manager.getTransaction().commit();
11        manager.close();
12    }

No Controller:

    public void atualiza(Integer id, Result result) {
        Produto produto = produtoDao.buscaProdutoPorId(id);
        result.include(produto);
        result.of(this).form();
    }
9 respostas

Fala Ewerton, tudo bem ?

Então se possível verifique como o produto está chegando no método salva. Coloque um sysout imprimindo a referência do produto (lembrete: sobrescreva um toString pra Produto pra gente ver os dados).

Pelo código que está descrito não há nada de errado. O problema deve estar em outros lugares. Como está a classe Produto? a tela que envia as informações ? etc ..

Dê uma olhada nisso

Bom dia Rafael! Tudo na paz! e com vc?

Eu adicionei dois print´s ANTES e DEPOIS da linha "5" do método salva do meu ProdutoDao... UM para preço e outro para peso

Fiz um NOVO cadastro, e atribui 1 para peço e peso, respectivamente... Quando eu SALVO, tanto ANTES, quanto depois do "persist", os print´s mostraram o valor 1.0 para os atributos... Na listagem msm coisa 1.0 para peço e peso...

Adicionei também dois print´s ANTES e DEPOIS da linha "8" do método salva do meu ProdutoDao... UM para preço e outro para peso Quando eu seleciono o registro para ATUALIZAÇÃO, no .jsp é atribuido 1.0 para os campos... Quando eu SALVO, tanto ANTES, quanto depois do "merge", os print´s mostraram o valor 10.0 para os atributos...

Alterei a variável de Double para double... E depois de double para float Mas , continuou ocorrendo o msm problema...

Vc quer que eu poste mais alguma parte/classe do código... Fica mais fácil de vc me ajudar se eu colocar o projeto no drive ?

Fala Ewerton,

Estranho o problema. Precisaria dar uma investigada. Se tiver como colocar o código em algum repositório do github seria bom.

Outra coisa, o método atualiza do controller não invoca o salva do dao. Como está o método que de fato chama o salva ?

O método atualiza do Controller, faz a busca do produto, carrega o o objeto encontrado, e redireciona para o form.jsp conforme abaixo...

Método atualiza do ProdutoController:

public void atualizaVaz(Integer id, Result result) {
    Produto produto = produtoDao.buscaProdutoPorId(id);
    result.include(produto);
    listaTipoProduto("VAZ");
    listaMontadora("VAZ");
    result.of(this).formVaz();
}

A implementação do atualiza(), no ProdutoDao:

public Produto atualiza(Integer id, Result result) {
    Produto produto = this.buscaProdutoPorId(id);
    return produto;
}

Na minha lista.jsp, eu tenho um link para o atualiza do ProdutoController...

lista.jsp:

<td style="text-align: center">
<a href="${linkTo[ProdutoController].atualizaVaz()}?id=${produto.id}" class="addSelecionaLista" title="Selecionar">
<i class="glyphicon glyphicon-log-in"></i></a>
</td>

Infelizmente, na empresa as máquinas são bloqueadas para instalar o aplicativo do Git.

Eu postei o projeto no Drive => https://drive.google.com/drive/folders/0B1n2t9Tjxu9GckdsZEowUGRxT2s?usp=sharing

Obrigado pela ajuda Rafael !!!

Fala Ewerton,

Dei uma olhada no código. Tive uns probleminhas de ambiente, mas analisando o código não conseguir ver a causa.

De qualquer forma tente usar BigDecimal ao invés de Double. Com BigDecimal sofremos menos com valores e conseguimos ter um controle maior sobre valores que representam moeda ou medidas, por exemplo.

Boa tarde Rafael!

Cara mudei de Double, pra BigDecimal, mas o problema continuou...

Tentei double, Float, float... Em todos o msm problema...

Se vc puder dar uma olhada no código... Eu atualizei o projeto no drive, e comentei uma parte do código que iria atrabalhar vc a testar...

Vc precisa criar um BD chamado ebfwms1 no MySQL e alterar a senha do root no persistence.xml Ou alterar o persistence para acessar um BD seu...

Quando o projeto for carregado vc pode clicar no menu em "Listagem EBF VAZ", que as tabelas serão criadas...

Clique em novo, o formulário não possui nenhuma campo obrigatório, digite somente um valor para preço e "Cadastrar/Salvar" para gravar...

O controller ira redirecionar para listagem, selecione esse novo registro, vc será redirecionado para o formulário, clique em "Cadastrar/Salvar" vc verá na listagem que aumentou uma casa decimal em preço...

Muito obrigado pela ajuda!!!

Alguma ideia do que esteja acontecendo pessoal...

Obrigado!

Fala Ewerton,

Não consegui rodar localmente pra tentar simular e de novo no código não consigo perceber nenhuma causa pra alteração arbitrária dos valores. Tente usar uma ferramenta de debug pra conseguir perceber exatamente o ponto onde a alteração ocorre. No seu lugar tentaria refazer a funcionalidade de alteração isoladamente. Uma dica tente usar testes automatizados pra evoluir a implementação enquanto for refazendo. Eles ajudam a trackear o problema e até podem auxiliar na própria implementação da funcionalidade.

solução!

Boa tarde Rafael!

Cara consegui resolver, debugando descobri que o problema estava no input do jsp e não no código...

Alterei a linha para:

<input type="text" name="produto.preco" id="preco" class="form-control" value="<fmt:formatNumber value="${produto.preco}" pattern="#,##0.00" />" />

E ficou perfeito!!

Obrigado pela ajuda!! Um abraço!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software