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.
Att.
fbl.lucas
Você poderia criar um método getTotalTrabalhado dentro do objeto Hora e acessa-lo no jsp/xhtml
Ok! Mas como eu faço p percorrer cada linha e apresenta-la no dataTable?
Uso um for?
T
tma
Veja se isso te ajuda.
Obs.: tem método com nome meio feio. Mas acho que pode te ajudar.
publicclassCalculoHoras{privatestaticfinalSimpleDateFormatFORMAT=newSimpleDateFormat("HH:mm:ss");/** * @param args */publicstaticvoidmain(String[]args){try{CalendardtEntrada=Calendar.getInstance();CalendardtSaidaAlmoco=Calendar.getInstance();CalendardtEntradaPosAlmoco=Calendar.getInstance();CalendardtSaida=Calendar.getInstance();Scannerscanner=newScanner(System.in);System.out.println("As horas devem ser informadas no formato HH:mm:ss");System.out.println("Hora de chegada: ");dtEntrada.setTime(FORMAT.parse(scanner.next()));System.out.println("Hora de saída para o almoço: ");dtSaidaAlmoco.setTime(FORMAT.parse(scanner.next()));System.out.println("Hora volta do almoço: ");dtEntradaPosAlmoco.setTime(FORMAT.parse(scanner.next()));System.out.println("Data saída: ");dtSaida.setTime(FORMAT.parse(scanner.next()));longdifMilli=dtSaidaAlmoco.getTimeInMillis()-dtEntrada.getTimeInMillis();Horahr=getDif(difMilli);difMilli=dtSaida.getTimeInMillis()-dtEntradaPosAlmoco.getTimeInMillis();Horahr1=getDif(difMilli);Calendarcalendar=hr.t(hr1);System.out.println(FORMAT.format(calendar.getTime()));}catch(ParseExceptione){e.printStackTrace();}}privatestaticHoragetDif(longdifMilli){inttimeInSeconds=(int)difMilli/1000;inthours,minutes,seconds;hours=timeInSeconds/3600;timeInSeconds=timeInSeconds-(hours*3600);minutes=timeInSeconds/60;timeInSeconds=timeInSeconds-(minutes*60);seconds=timeInSeconds;Horahora=newHora(hours,minutes,seconds);returnhora;}}classHora{inthour;intminute;intsecond;publicHora(inthours,intminutes,intseconds){this.hour=hours;this.minute=minutes;this.second=seconds;}publicCalendart(Horahora){Calendarc=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);returnc;}}
fbl.lucas
mateus.cordeiro:
Ok! Mas como eu faço p percorrer cada linha e apresenta-la no dataTable?
Uso um for?
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:
publicclassCalculoHoras{privatestaticfinalSimpleDateFormatFORMAT=newSimpleDateFormat("HH:mm:ss");publicTimecalcular(Timeent,Timealm,Timeret,Timesai){//Converte java.sql.Time em CalendarCalendarentrada=Calendar.getInstance();entrada.setTime(ent);Calendaralmoco=Calendar.getInstance();entrada.setTime(alm);Calendarretorno=Calendar.getInstance();entrada.setTime(ret);Calendarsaida=Calendar.getInstance();entrada.setTime(sai);longdifMilli=almoco.getTimeInMillis()-entrada.getTimeInMillis();Horahr=getDif(difMilli);difMilli=saida.getTimeInMillis()-retorno.getTimeInMillis();Horahr1=getDif(difMilli);Calendarcalendar=hr.t(hr1);//Converte Calendar em java.sql.TimeTimehorasCalculadas=(Time)calendar.getTime();returnhorasCalculadas;}privatestaticHoragetDif(longdifMilli){inttimeInSeconds=(int)difMilli/1000;inthours,minutes,seconds;hours=timeInSeconds/3600;timeInSeconds=timeInSeconds-(hours*3600);minutes=timeInSeconds/60;timeInSeconds=timeInSeconds-(minutes*60);seconds=timeInSeconds;Horahora=newHora(hours,minutes,seconds);returnhora;}}classHora{inthour;intminute;intsecond;publicHora(inthours,intminutes,intseconds){this.hour=hours;this.minute=minutes;this.second=seconds;}publicCalendart(Horahora){Calendarc=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);returnc;}}
Eu chamo ele nesse outro metodo que carrega o List:
publicList<Horas>carrega(StringIduser){intidusuario=Integer.parseInt(Iduser);List<Horas>hora=newArrayList<Horas>();CalculoHorasch=newCalculoHoras();//isso que está certo? try{Stringsql=" 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 ";PreparedStatementps=conexao.getConn().prepareStatement(sql);ps.setInt(1,idusuario);ResultSetrs=ps.executeQuery();while(rs.next()){Horashr=newHoras();Timeentra=rs.getTime("entrada");Timealmo=rs.getTime("almoco");Timevolt=rs.getTime("volta");Timesaid=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(SQLExceptione){e.printStackTrace();}finally{conexao.fecharConexao();}returnhora;}
O erro que aparece é o seguinte:
java.lang.NoClassDefFoundError: util/CalculoHoras
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!
fbl.lucas
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!
Então você ja consegue exibir um valor, mas este valor não esta correto?
mateus.cordeiro
cara, ele dá esse erro:
java.lang.NoClassDefFoundError: util/CalculoHoras
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
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