Executar função de calculo e preencher List<>

3 respostas
A

Caros colegas!

Estou desenvolvendo com JSP e Spring MVC , ainda sou noob mas estou me virando bem e conseguindo fazer umas coisas que preciso, porém estou com uma dúvida e não consigo prosseguir.

Estou montando um relatório de refugo e retrabalho que mostra os valores na view (JSP).
Esse valores vêm de um List<> de dentro da classe DAO, que já fez o select dentro do BD e etc…

O relatório está carregando normal, só que eu preciso adicionar mais duas colunas que vão mostrar a quantidade em percentual de refugo e de retrabalho.

Se eu não estiver enganado, eu quero deixar essas duas funções que calculam o percentual na classe modelo, assim todos os relatórios irão buscar a fómula de cálculo nessa classe, e se por ventura a fórmula alterar futuramente eu só altero essa classe e todos os relatório estão salvos (rsss).

Vamos a dúvida, se declarada essa função na classe modelo como eu chamo ela na hora de popular a lista?

Seguem meus códigos:

RefugoRetrabalho.java

public class RefugoRetrabalho {

	// Variáveis
	private Date data;
	private int semana;
	private String rua;
	private String turma;
	private int producao;
	private int refugo;
	private int retrabalho;

	// Eu colo a função que fará o cálculo aqui?
	// A fórmula é : (refugo / producao)*100
	
	// Getters e Setters  aqui abaixo...
}

RefugoRetrabalhoDAO.java

List<RefugoRetrabalho> refugoRetrabalhos = new ArrayList<RefugoRetrabalho>();
//Neste trecho que não coloquei ele faz o stmt no bd, e etc... tudo ok até o momento...

// Na linha abaixo dentro do list ele chama a função que popula a lista
while (rs.next()) {
   refugoRetrabalhos.add(populaRefugoRetrabalho(rs));
}

//...


//Função que popula a lista com os valores do BD
private RefugoRetrabalho populaRefugoRetrabalho(ResultSet rs) throws SQLException {
		RefugoRetrabalho refugoRetrabalho = new RefugoRetrabalho();

		// popula o objeto
		refugoRetrabalho.setData(rs.getDate("data"));
		refugoRetrabalho.setSemana(rs.getInt("semana"));
		refugoRetrabalho.setRua(rs.getString("rua"));
		refugoRetrabalho.setTurma(rs.getString("turma"));
		refugoRetrabalho.setProducao(rs.getInt("somaProducao"));
		refugoRetrabalho.setRefugo(rs.getInt("somaRefugo"));
		refugoRetrabalho.setRetrabalho(rs.getInt("somaRetrabalho"));
		
		return refugoRetrabalho;
	}
//A lista está sendo gerada corretamente, mas preciso de mais duas informações nela.
//Onde coloco e como eu chamo a função que irá pegar a quantide produzida e a quantidade de refugo para calcular o percentual??

Relatorio.jsp

<table>

			<thead>
			<tr>
				<th width="11%">Data</th>
				<th width="11%">Semana</th>
				<th width="11%">Rua</th>
				<th width="11%">Turma</th>
				<th width="11%">Produção</th>
				<th width="11%">Refugo</th>
				<th width="11%">Refugo %</th>
				<th width="11%">Retrabalho</th>
				<th width="11%">Retrabalho %</th>
			</tr>
			</thead>
			<c:forEach var="prod" items="${refugoRetrabalho}">
				<tr>
					<td><fmt:formatDate value="${prod.data}" pattern="dd/MM/yyyy" /></td>
					<td>${prod.semana}</td>
					<td>${prod.rua}</td>
					<td>${prod.turma}</td>
					<td>${prod.producao}</td>
					<td>${prod.refugo}</td>
					<td>QUERO MOSTRAR O %  DE REFUGO</td>
					<td>${prod.retrabalho}</td>
					<td>QUERO MOSTRAR O %  DE RETRABALHO</td>
				</tr>
			</c:forEach>
		</table>

Como eu disse, vários outros relatórios vão usar essa fórmula de cálculo, por isso não quero só colocar a fórmula na variável e pronto, se eu fizer isso terei de escrever a fórmula em todos os relatórios e para manutenções futuras ai é osso!

Fico no aguardo.

Abraços!

3 Respostas

ViniGodoy

Aqui você cria um novo getter:

public class RefugoRetrabalho {

	// Variáveis
	private Date data;
	private int semana;
	private String rua;
	private String turma;
	private int producao;
	private int refugo;
	private int retrabalho;

	// Eu colo a função que fará o cálculo aqui?
	// A fórmula é : (refugo / producao)*100
	
	public double getRefugo() 
        { 
		return refugo *100.0 / producao;
	}
}

E lá você chama esse getter como qualquer outro da sua classe.

Outra coisa, por favor, ao postar tópicos, não coloque pedidos desesperados como "HELP!", "URGENTE" ou "SOCORRO" no título.

A

Cara deu certo sim, muito obrigado!

Eu estava nessa linha raciocínio mas não estava conseguindo executar....

Ainda me ficaram algumas dúvidas: não entendi porque tenho que colocar (refugo*100.0/producao) ao invés de (refugo/producao)*100 que dá na mesmo, fiz um teste apenas dividindo um pelo outro e mostrou 0.00, tive que que colocar 1.0* antes.... seria porque eles dois valores inteiros? teria outro modo de converter sem usar o *100 ou 1*?

Segue as alterações acrescentadas nó código, se não tiver na "boa prática" por favor me avise:

Na classe modelo:

private double percentualRefugo;;//Atributo


	// Função para calcular percentual do Refugo
	public double CalculaPercentualRefugo() {
		if (producao &gt; 0) {
			percentualRefugo = (refugo * 100.0 / producao);
		}

		return percentualRefugo;
	}

	//Get e Set

	public double getpercentualRefugo() {
		return percentualRefugo;
	}

	public void setpercentualRefugo(double percentualRefugo) {
		this.percentualRefugo = percentualRefugo;
	}
Na classe DAO
private RefugoRetrabalho populaRefugoRetrabalho(ResultSet rs) throws SQLException {
		RefugoRetrabalho refugoRetrabalho = new RefugoRetrabalho();

	refugoRetrabalho.setpercentualRefugo(refugoRetrabalho.CalculaPercentualRefugo());// Esta linha popula o item da lista, eu estava errando aqui.

Na view(JSP)

&lt;c:forEach var="valores" items="${refugoRetrabalho}"&gt;  ...

&lt;td&gt;&lt;fmt:formatNumber value="${valores.percentualRefugo}" pattern="#.#" /&gt;%&lt;/td&gt;

Obrigado pela ajuda!

(PS: Não vou mais colocar mensagens desesperadas no título...rsss...)

Abraços!

ViniGodoy:
Aqui você cria um novo getter:
public class RefugoRetrabalho {

	// Variáveis
	private Date data;
	private int semana;
	private String rua;
	private String turma;
	private int producao;
	private int refugo;
	private int retrabalho;

	// Eu colo a função que fará o cálculo aqui?
	// A fórmula é : (refugo / producao)*100
	
	public double getRefugo() 
        { 
		return refugo *100.0 / producao;
	}
}

E lá você chama esse getter como qualquer outro da sua classe.

Outra coisa, por favor, ao postar tópicos, não coloque pedidos desesperados como "HELP!", "URGENTE" ou "SOCORRO" no título.

ViniGodoy

Sim, pq é uma divisão de inteiros, o resultado é inteiro.
Se não quiser multiplicar por um double, voce pode fazer um cast.

O ideal, entretanto é usar a formula que passei. Apesar de matematicamente equivalente a operação com a multiplicação antes é computacionalmente mais precisa.

Criado 3 de outubro de 2012
Ultima resposta 5 de out. de 2012
Respostas 3
Participantes 2