Bom estou fazendo um relatório para minha empresa usando o iReport 3.0 e nesse relatório tem 2 Fields com datas, no caso uma data de inicio de uma chamada técnica e outra a data final dessa chamada técnica, preciso fazer um cálculo creio que subtrai-las para obter a quantidade de dias que essa chamada técnica foi realizada, pesquisei no Google e não encontrei uma solução adequada infelizmente, só assim recorri ao GUJ.
Por favor se alguém puder me dar uma ajuda ficarei muito grato!!
Sim estou conectado ao banco, porém tenho que fazer um parâmetro com essa subtração e não encontro uma forma correta de fazer essa subtração, tipo uma fórmula correta para isso.
Nunca fiz isso, mas, creio que seja preciso converter para milissegundos (método getTime() da classe java.util.Date), realizar a subtração (long subDias = dtMsFim - dtMsIni), então, reconverter (long dias = subDias / 1000 / 60 / 60 / 24) para que funcione.
Só não consigo te dizer como fazer isso no iReport, provavelmente a sintaxe dele permita.
E como você está passando estas informações para o relatório? Através de um data source? Se sim, faça o cálculo na sua classe e envie este dado e crie um field no relatório.
Se faz essa busca dentro do relatório, acredito que pode usar o mesmo procedimento. Sinceramente não sei se é possível fazer essa conta direto com duas datas no iReport, na verdade nunca tentei e nunca precisei, sempre passei os períodos direto pelo data source.
[quote=drsmachado]Nunca fiz isso, mas, creio que seja preciso converter para milissegundos (método getTime() da classe java.util.Date), realizar a subtração (long subDias = dtMsFim - dtMsIni), então, reconverter (long dias = subDias / 1000 / 60 / 60 / 24) para que funcione.
Só não consigo te dizer como fazer isso no iReport, provavelmente a sintaxe dele permita.[/quote]
Legal vou fazer dessa maneira para ver se da certo!!!
[quote=jhaga]E como você está passando estas informações para o relatório? Através de um data source? Se sim, faça o cálculo na sua classe e envie este dado e crie um field no relatório.
Se faz essa busca dentro do relatório, acredito que pode usar o mesmo procedimento. Sinceramente não sei se é possível fazer essa conta direto com duas datas no iReport, na verdade nunca tentei e nunca precisei, sempre passei os períodos direto pelo data source.[/quote]
Não estou usando data source fiz uma query e estou pegando os dados diretamente dela.
Pronto amigo ai é só você edita da forma que você quer usar, coloquei os nomes das variaveis bem simples para facilitar e coloquei alguns comentarios.
public static int dataDiff(Date dataInicio, Date dataFim) throws ParseException {
GregorianCalendar startTime = new GregorianCalendar();
GregorianCalendar endTime = new GregorianCalendar();
GregorianCalendar curTime = new GregorianCalendar();
GregorianCalendar baseTime = new GregorianCalendar();
startTime.setTime(dataInicio);
endTime.setTime(dataFim);
int dif_multiplier = 1;
// Verifica a ordem de inicio das datas
if( dataInicio.compareTo( dataFim ) < 0 ){
baseTime.setTime(dataFim);
curTime.setTime(dataInicio);
dif_multiplier = 1;
}else{
baseTime.setTime(dataInicio);
curTime.setTime(dataFim);
dif_multiplier = -1;
}
int resultadoDeAno = 0;
int resultadoDeMes = 0;
int resultadoDedia = 0;
// Para cada mes e ano, vai de mes em mes pegar o ultimo dia para import acumulando
// no total de dias. Ja leva em consideracao ano bissesto
while( curTime.get(GregorianCalendar.YEAR) < baseTime.get(GregorianCalendar.YEAR) ||
curTime.get(GregorianCalendar.MONTH) < baseTime.get(GregorianCalendar.MONTH) )
{
int max_day = curTime.getActualMaximum( GregorianCalendar.DAY_OF_MONTH );
resultadoDeMes += max_day;
curTime.add(GregorianCalendar.MONTH, 1);
}
// Marca que é um saldo negativo ou positivo
resultadoDeMes = resultadoDeMes*dif_multiplier;
// Retirna a diferenca de dias do total dos meses
resultadoDedia += (endTime.get(GregorianCalendar.DAY_OF_MONTH) - startTime.get(GregorianCalendar.DAY_OF_MONTH));
return resultadoDeAno + resultadoDeMes + resultadoDedia; }
[quote=wesllhey]Pronto amigo ai é só você edita da forma que você quer usar, coloquei os nomes das variaveis bem simples para facilitar e coloquei alguns comentarios.
[code]
public static int dataDiff(Date dataInicio, Date dataFim) throws ParseException {
GregorianCalendar startTime = new GregorianCalendar();
GregorianCalendar endTime = new GregorianCalendar();
GregorianCalendar curTime = new GregorianCalendar();
GregorianCalendar baseTime = new GregorianCalendar();
startTime.setTime(dataInicio);
endTime.setTime(dataFim);
int dif_multiplier = 1;
// Verifica a ordem de inicio das datas
if( dataInicio.compareTo( dataFim ) < 0 ){
baseTime.setTime(dataFim);
curTime.setTime(dataInicio);
dif_multiplier = 1;
}else{
baseTime.setTime(dataInicio);
curTime.setTime(dataFim);
dif_multiplier = -1;
}
int resultadoDeAno = 0;
int resultadoDeMes = 0;
int resultadoDedia = 0;
// Para cada mes e ano, vai de mes em mes pegar o ultimo dia para import acumulando
// no total de dias. Ja leva em consideracao ano bissesto
while( curTime.get(GregorianCalendar.YEAR) < baseTime.get(GregorianCalendar.YEAR) ||
curTime.get(GregorianCalendar.MONTH) < baseTime.get(GregorianCalendar.MONTH) )
{
int max_day = curTime.getActualMaximum( GregorianCalendar.DAY_OF_MONTH );
resultadoDeMes += max_day;
curTime.add(GregorianCalendar.MONTH, 1);
}
// Marca que é um saldo negativo ou positivo
resultadoDeMes = resultadoDeMes*dif_multiplier;
// Retirna a diferenca de dias do total dos meses
resultadoDedia += (endTime.get(GregorianCalendar.DAY_OF_MONTH) - startTime.get(GregorianCalendar.DAY_OF_MONTH));
return resultadoDeAno + resultadoDeMes + resultadoDedia; }
[/code][/quote]
Poxa cara legal, vou fazer aqui e com certeza agora vai dar certo!!
Obrigado mesmo!