[RESOLVIDO]Loop sobrescrevendo

4 respostas Resolvido
postgresqljava
M

Olá pessoal tudo bem? Eu estou com o seguinte problema: eu quero fazer um relatório de produtos vendidos, mas quando vai printar na tela, o loop sobrescreve(ex: o primeiro componente do array é substituído pelo próximo, e assim por diante). Eu sou iniciante em JAVA e se alguém puder me ajudar a evitar essa sobrescrição, eu agradeço.
Segue o main:

package sistema.telas;
import static sistema.es.EntradaESaida.*;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import sistema.sgbd.BancoDeDados;
import sistema.entidade.RelatorioVenda;

    public class RelatorioVendas {
    	//chama sua classe para fazer conexao com o banco
        static Connection con = new BancoDeDados().getConnection();
    	
    	public static void relatorio() throws IOException{
    		List<RelatorioVenda> relatorio = getLista();
    		String colunas[] = {"Nome", "Preço", "Quantidade", "Preço Total"};
    		String linhas[][] = new String[relatorio.size()][4];
    		for (int linha = 0; linha < linhas.length; linha++){
    		    for (RelatorioVenda relatorioVenda : relatorio) {
    		    	linhas[linha][0] = relatorioVenda.getNomeProduto();
    		    	linhas[linha][1] ="R$" + relatorioVenda.getPreco();
    		    	linhas[linha][2] = relatorioVenda.getQuantidade()+ "un";
    		    	linhas[linha][3] ="R$" + relatorioVenda.getPrecoTotal();
    		    } 
    		}
    		exibirTabela("Relatorio de Vendas", linhas, colunas, 150, 750);

    	public static List<RelatorioVenda> getLista() {
    	     try {
    	         List<RelatorioVenda> relatorioVendas = new ArrayList<RelatorioVenda>();

    	         PreparedStatement stmt = con.prepareStatement("SELECT produto.nome, produto.preco, venda.quantidade_vendida, (venda.quantidade_vendida*produto.preco) as multiplicacao FROM produto,  venda WHERE produto.codigo = venda.codigo_produto;");
    	         ResultSet rs = stmt.executeQuery();

    	         while (rs.next()) {
    	             // criando o objeto venda
    	        	 RelatorioVenda venda = new RelatorioVenda();

    	             venda.setNomeProduto(rs.getString("nome"));
    	             venda.setPreco(rs.getFloat("preco"));
    	             venda.setQuantidade(rs.getInt("quantidade_vendida"));
    	             venda.setPrecoTotal(rs.getFloat("multiplicacao"));

    	             // adicionando o objeto à lista
    	             
    	             relatorioVendas.add(venda);
    	         }
    	         rs.close();
    	         stmt.close();
    	         return relatorioVendas;
    	     } catch (SQLException e) {
    	    	 msgErro("Erro ao carregar as tabelas venda e produto. ", "Relatorio de Vendas");
    	         throw new RuntimeException(e);
    	     }
    	   }}

Segue o construtor:

package sistema.entidade;

/**
 * Classe usada para representar um Relátorio de Venda.
 * @author Matheus William
 */
public class RelatorioVenda {
	private String nomeProduto;
	private float preco;
	private int quantidade;
	private float precoTotal;
	
	public RelatorioVenda() {
	}
	
	public RelatorioVenda(String nomeProduto, float preco, int quantidade,
			float precoTotal) {
		this();
		this.nomeProduto = nomeProduto;
		this.preco = preco;
		this.quantidade = quantidade;
		this.precoTotal = precoTotal;
	}
	
	public String getNomeProduto() {
		return nomeProduto;
	}
	
	public void setNomeProduto(String nomeProduto) {
		this.nomeProduto = nomeProduto;
	}
	
	public float getPreco() {
		return preco;
	}
	
	public void setPreco(float preco) {
		this.preco = preco;
	}
	
	public int getQuantidade() {
		return quantidade;
	}
	
	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}
	
	public float getPrecoTotal() {
		return precoTotal;
	}
	
	public void setPrecoTotal(float precoTotal) {
		this.precoTotal = precoTotal;
	}
	
	@Override
	public String toString() {
		return String.format("%s - %.2f - %d - %.2f", nomeProduto,preco,quantidade,precoTotal);
	}
}

4 Respostas

K

Você tem que incrementar linha a cada nova linha, coisa que não está acontecendo nesse loop, só fora dele no outro for.

Jonathan_Medeiros

Remova esse laço interno e trabalhe somente com o laço externo para que desta forma a variável linha seja incrementada e os itens não sejam sobrescritos.

M

De acordo com o que vocês falaram seria algo assim:

for (int linha = 0; linha < relatorio.size(); linha++){
    		    	linhas[linha][0] = relatorio.get(linha).getNomeProduto();
    		    	linhas[linha][1] ="R$" + relatorio.get(linha).getPreco();
    		    	linhas[linha][2] = relatorio.get(linha).getQuantidade()+ "un";
    		    	linhas[linha][3] ="R$" + relatorio.get(linha).getPrecoTotal();
    		}

Pois mesmo que eu faça desse jeito o laço ainda sobrescreve.

M
Solucao aceita

Consegui resolver, eu estava criando a instância RelatorioVenda venda = novo RelatorioVenda (); antes do loop while, por isso que os mesmos valores estavam se repetindo.

Criado 20 de junho de 2019
Ultima resposta 21 de jun. de 2019
Respostas 4
Participantes 3