Senhores, Bom dia!
Estou com uma duvida e preciso de algumas dicas!
Eu tenho um sistema hoje que o controle de pontos(hora de entrada, almoco, retorno e saida), que tem como objetivo calcular as horas de trabalho!
Carrego esse dados do banco em um List para apresentar em um DataModel no JSF(dataTable).
Preciso calcular as horas trabalhadas = (almoco - entrada) + (saida - retornoAlmoco) e apresentar em uma outra coluna do dataTable.
Como faço isso? Por onde estudar?
A alguns dias um usuario teve uma duvida parecida e postei algumas soluções que aplico no meu dia-a-dia para resolução de horas trabalhadas, veja no link.
[quote=mateus.cordeiro]Ok! Mas como eu faço p percorrer cada linha e apresenta-la no dataTable?
Uso um for?[/quote]
Então você não sabe utilizar o dataTable, caso esteja utilizando o do próprio JSF veja o código abaixo, caso esteja utilizando Richfaces segue o link com o demo Demo Richfaces
Vamos lá! TMA - Cara muito obrigado pela apoio… ajudou muito sua CLASSE. Porem,
Ficou assim:
[code]public class CalculoHoras {
private static final SimpleDateFormat FORMAT = new SimpleDateFormat("HH:mm:ss");
public Time calcular(Time ent, Time alm, Time ret, Time sai) {
//Converte java.sql.Time em Calendar
Calendar entrada = Calendar.getInstance();
entrada.setTime(ent);
Calendar almoco = Calendar.getInstance();
entrada.setTime(alm);
Calendar retorno = Calendar.getInstance();
entrada.setTime(ret);
Calendar saida = Calendar.getInstance();
entrada.setTime(sai);
long difMilli = almoco.getTimeInMillis() - entrada.getTimeInMillis();
Hora hr = getDif(difMilli);
difMilli = saida.getTimeInMillis() - retorno.getTimeInMillis();
Hora hr1 = getDif(difMilli);
Calendar calendar = hr.t(hr1);
//Converte Calendar em java.sql.Time
Time horasCalculadas = (Time) calendar.getTime();
return horasCalculadas;
}
private static Hora getDif(long difMilli) {
int timeInSeconds = (int) difMilli / 1000;
int hours, minutes, seconds;
hours = timeInSeconds / 3600;
timeInSeconds = timeInSeconds - (hours * 3600);
minutes = timeInSeconds / 60;
timeInSeconds = timeInSeconds - (minutes * 60);
seconds = timeInSeconds;
Hora hora = new Hora(hours, minutes, seconds);
return hora;
}
}
class Hora {
int hour;
int minute;
int second;
public Hora(int hours, int minutes, int seconds) {
this.hour = hours;
this.minute = minutes;
this.second = seconds;
}
public Calendar t(Hora hora) {
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, hour);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, second);
c.add(Calendar.HOUR_OF_DAY, hora.hour);
c.add(Calendar.MINUTE, hora.minute);
c.add(Calendar.SECOND, hora.second);
return c;
}
} [/code]
Eu chamo ele nesse outro metodo que carrega o List:
[code]public List carrega(String Iduser){
int idusuario = Integer.parseInt(Iduser);
List hora = new ArrayList();
CalculoHoras ch = new CalculoHoras();//isso que está certo?
try{
String sql = " SELECT tb.*, "
+ " bh.justificativa AS justificativa "
+ " FROM tabcontrole AS tb LEFT JOIN bancohoras AS bh ON tb.idbanco = bh.idbanco"
+ " WHERE cod_func = ? "
+ " ORDER BY data_cont ";
PreparedStatement ps = conexao.getConn().prepareStatement(sql);
ps.setInt(1, idusuario);
ResultSet rs = ps.executeQuery();
while (rs.next()){
Horas hr = new Horas();
Time entra = rs.getTime("entrada");
Time almo = rs.getTime("almoco");
Time volt = rs.getTime("volta");
Time said = rs.getTime("saida");
hr.setData(rs.getDate("data_cont"));
hr.setEntrada(entra);
hr.setAlmoco(almo);
hr.setRetorno(volt);
hr.setSaida(said);
hr.setAdicional(rs.getTime("adicional"));
hr.setJustificativa(rs.getString("justificativa"));
hr.setObs(rs.getString("obs"));
hr.setHrTrabalhadas(ch.calcular(entra, almo, volt,said));//Chamo o metodo que faz os calculos, passando os parametros.
hora.add(hr);
}
}catch(SQLException e){
e.printStackTrace();
}finally{
conexao.fecharConexao();
}
return hora;
}[/code]
O erro que aparece é o seguinte: java.lang.NoClassDefFoundError: util/CalculoHoras
[quote=mateus.cordeiro]LUCAS!
Isso do dataTable eu consigo, só não sei se minha logica está correta!
Fiz o que vc falou e criei o dentro da classe Horas um Time hrTrabalhadas! para receber os valores calculados![/quote]
Então você ja consegue exibir um valor, mas este valor não esta correto?
cara, ele dá esse erro:
java.lang.NoClassDefFoundError: util/CalculoHoras
javax.faces.el.EvaluationException: java.lang.NoClassDefFoundError: util/CalculoHoras
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91
…
Eu criei uma nova classe com o nome Calculo.
É a mesma que CalculoHoras, apenas criei o arquivo como nova classe pelo NetBeans. Pq a outra eu havia copiado de um outro projeto.
Agora o erro é para converter o Calendar em java.sql.Time
Calendar calendar = hr.t(hr1);
//Converte Calendar em java.sql.Time
java.sql.Time hc = new java.sql.Time(calendar.getTime());
Agora dá um erro de conversão!
java.lang.ClassCastException: java.util.Calendar cannot be cast to java.sql.Time
Caused by: java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
at util.Calculo.calcular(Calculo.java:48)
at dao.HorasDAO.carrega(HorasDAO.java:61)
[quote]Calendar calendar = hr.t(hr1);
//Converte Calendar em java.sql.Time
java.sql.Time hc = new java.sql.Time(calendar.getTime());[/quote]
Este código nem era para compilar, o construtor de Time não recebe um Date.
Eu faria o seguinte, altera este seu método Hora.t() (sugestão, renomeie este método para um nome que sugira o que ele realmente faz, ex: getSQLTime(), as boas práticas agradecem) para que o método retorne um java.sql.Time
[code]class Hora {
int hour;
int minute;
int second;
public Hora(int hours, int minutes, int seconds) {
this.hour = hours;
this.minute = minutes;
this.second = seconds;
}
public java.sql.Time getSQLTime(Hora hora) {
return new java.sql.Time(hour, minute, second);
}
} [/code]
Agora se você precisa do calendar em algum lugar, é só criar outro método ao invés de substituir.