Data de Nascimento para Idade

Boa noite caros amigos,

Peço por gentileza se possível que me ajudem nesse pequeno grande problema. Conforme assunto postado em relação a conversão
da data de nascimento para a idade. Os colegas informaram que precisava criar uma classe.java no netbeans e criar
um parâmetro coletando todas as informações dessa classe.

Abaixo segue a classe Idade implementada pelo meu professor:

[code]package laboratorioac;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
*

  • @author Almeida
    */
    public class Idade {
    static int dia = 20;
    static int mes = 10;
    static int ano = 2010;
    static int idade= 0;

    //public static void main(String str[]){
    public static int calculaIdade(){

     Date dataHoje = new Date();
     Calendar calHoje = GregorianCalendar.getInstance();
     int diaGregorianoDeHoje = calHoje.get(Calendar.DAY_OF_YEAR);
     int anoGregorianoDeHoje = calHoje.get(Calendar.YEAR);
     System.out.println("Dia de hoje = "+diaGregorianoDeHoje);
     System.out.println("Ano de hoje = "+anoGregorianoDeHoje);
     System.out.println("Data Hoje = "+dataHoje );
    
     GregorianCalendar gc = new GregorianCalendar();
     gc.set(GregorianCalendar.DAY_OF_MONTH, dia);
     gc.set(GregorianCalendar.MONTH, mes);
     gc.set(GregorianCalendar.YEAR, ano);
     int diaGregorianoDoNasc = gc.get(GregorianCalendar.DAY_OF_YEAR);
     int mesGregorianoDoNasc = gc.get(GregorianCalendar.MONTH);
     int anoGregorianoDoNasc = gc.get(Calendar.YEAR);
     anoGregorianoDoNasc = anoGregorianoDoNasc + 1900;
     System.out.println("Dia do nascimento = "+diaGregorianoDoNasc);
     System.out.println("Mes do nascimento = "+mesGregorianoDoNasc);
     System.out.println("Ano do nascimento = "+anoGregorianoDoNasc);
     idade = anoGregorianoDeHoje - anoGregorianoDoNasc;
    
     if(diaGregorianoDoNasc > diaGregorianoDeHoje)
         idade--;
     System.out.println("idade calculada = "+idade);
    
         return(idade);
    

    }

}[/code]

Pergunto:

  1. Como faço para criar esse parâmetro no iReport buscando essa conversão da classe Idade?

  2. Caso faça essa conversão direto do SQL. Como construo essa SQL na query do iReport?

Segue também imagem do relatório do mapa de trabalho. Verifique que existe uma seta onde desejo que apareça a idade e não a data de nascimento

Desde já agradeço,

Muito obrigado,

Elcio

também sou iniciante e nao sei os detalhes. Mas pelo que tenho estudado, JodaTime pode facilitar muito a tua vida.

crie no seu BD um campo idade q receberá a mesma e depois chame no ireport, fiz assim no meu sistema. Essa seria a solução mais simples penso eu.

também utilizei desta forma em sistema que desenvolvi.

Bom dia senhores,

Sim, essa opção de acrescentar o atributo idade é bastante simples. Mas o problema é o seguinte. Se hoje você tem 20 anos de idade, o ano que vem vc terá 21 anos, portanto, deverá entrar na tela paciente e alterar a idade para 21 sendo que da forma que passei isso muda automaticamente com o ano corrente, entenderam.

De qualquer forma agradeço a ajuda,

Muito obrigado,

Elcio

[quote=webelcio]Bom dia senhores,

Sim, essa opção de acrescentar o atributo idade é bastante simples. Mas o problema é o seguinte. Se hoje você tem 20 anos de idade, o ano que vem vc terá 21 anos, portanto, deverá entrar na tela paciente e alterar a idade para 21 sendo que da forma que passei isso muda automaticamente com o ano corrente, entenderam.

De qualquer forma agradeço a ajuda,

Muito obrigado,

Elcio[/quote]
Oi… Blz? :smiley:

Kra seja mais claro, vc NAO quer que mude automaticamente, é isso? Alguém fará isso manualmente?

[quote=webelcio]Boa noite caros amigos,

Peço por gentileza se possível que me ajudem nesse pequeno grande problema. Conforme assunto postado em relação a conversão
da data de nascimento para a idade. Os colegas informaram que precisava criar uma classe.java no netbeans e criar
um parâmetro coletando todas as informações dessa classe.

Abaixo segue a classe Idade implementada pelo meu professor:

[code]package laboratorioac;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
*

  • @author Almeida
    */
    public class Idade {
    static int dia = 20;
    static int mes = 10;
    static int ano = 2010;
    static int idade= 0;

    //public static void main(String str[]){
    public static int calculaIdade(){

     Date dataHoje = new Date();
     Calendar calHoje = GregorianCalendar.getInstance();
     int diaGregorianoDeHoje = calHoje.get(Calendar.DAY_OF_YEAR);
     int anoGregorianoDeHoje = calHoje.get(Calendar.YEAR);
     System.out.println("Dia de hoje = "+diaGregorianoDeHoje);
     System.out.println("Ano de hoje = "+anoGregorianoDeHoje);
     System.out.println("Data Hoje = "+dataHoje );
    
     GregorianCalendar gc = new GregorianCalendar();
     gc.set(GregorianCalendar.DAY_OF_MONTH, dia);
     gc.set(GregorianCalendar.MONTH, mes);
     gc.set(GregorianCalendar.YEAR, ano);
     int diaGregorianoDoNasc = gc.get(GregorianCalendar.DAY_OF_YEAR);
     int mesGregorianoDoNasc = gc.get(GregorianCalendar.MONTH);
     int anoGregorianoDoNasc = gc.get(Calendar.YEAR);
     anoGregorianoDoNasc = anoGregorianoDoNasc + 1900;
     System.out.println("Dia do nascimento = "+diaGregorianoDoNasc);
     System.out.println("Mes do nascimento = "+mesGregorianoDoNasc);
     System.out.println("Ano do nascimento = "+anoGregorianoDoNasc);
     idade = anoGregorianoDeHoje - anoGregorianoDoNasc;
    
     if(diaGregorianoDoNasc > diaGregorianoDeHoje)
         idade--;
     System.out.println("idade calculada = "+idade);
    
         return(idade);
    

    }

}[/code]

Pergunto:

  1. Como faço para criar esse parâmetro no iReport buscando essa conversão da classe Idade?

  2. Caso faça essa conversão direto do SQL. Como construo essa SQL na query do iReport?

Segue também imagem do relatório do mapa de trabalho. Verifique que existe uma seta onde desejo que apareça a idade e não a data de nascimento

Desde já agradeço,

Muito obrigado,

Elcio[/quote]

Kra achei confuso seu código, se eu coloco:

static int dia = 20; static int mes = 03; static int ano = 1988;

Que é minha data de nascimento, ele não imprime -> 23 anos… Que acho q é o requisito do seu negócio…

também utilizei desta forma em sistema que desenvolvi.[/quote]

Também gostei desta implementação.

Veja um exemplo feito bem rápido para dizer quantos anos a pessoa tem a partir da data de nascimento padrão dia/mes/ano (dd/MM/yyyy):

[code]package teste;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Teste {

public static void main(String[] args) {
	System.out.println(converterDataNascimentoParaIdade("20/03/1988"));;	
}

public static String converterDataNascimentoParaIdade(String dataNasc){	
	String idade    = "";
	
	int diaCorrente = Integer.parseInt(formatarDataPadraoEspecificado("dia"));
	int anoCorrente = Integer.parseInt(formatarDataPadraoEspecificado("ano"));
	int mesCorrente = Integer.parseInt(formatarDataPadraoEspecificado("mes"));;
			
	String dataParser[] = dataNasc.split("/");
	int diaNasc = Integer.parseInt(dataParser[0]);
	int mesNasc = Integer.parseInt(dataParser[1]);
	int anoNasc = Integer.parseInt(dataParser[2]);
	
	idade = calcularIdade(diaCorrente, mesCorrente, anoCorrente, diaNasc, mesNasc, anoNasc);		
	
	return idade;
}

public static String formatarDataPadraoEspecificado(String oQue){
	if (oQue.equals("ano")) {
		SimpleDateFormat dataFormatter = new SimpleDateFormat("yyyy");
		return dataFormatter.format(new Date());
	} if (oQue.equals("dia")) {
		SimpleDateFormat dataFormatter = new SimpleDateFormat("dd");
		return dataFormatter.format(new Date());
	} else {
		SimpleDateFormat dataFormatter = new SimpleDateFormat("MM");
		return dataFormatter.format(new Date());
	}
}

public static String calcularIdade(int diaCorrente, int mesCorrente, int anoCorrente, int diaNasc, int mesNasc, int anoNasc){
	String idadeRealEmAnos = "";
	
	Integer idadeCalculoRapidoEmAnos = anoCorrente - anoNasc;
	
	if (mesCorrente == mesNasc) {
		if (diaCorrente == diaNasc) {
			idadeRealEmAnos = idadeCalculoRapidoEmAnos + " anos (Feliz Aniversário!)";
		} else if (diaCorrente < diaNasc){
			idadeRealEmAnos = (idadeCalculoRapidoEmAnos - 1) + " anos";
		} else if (diaCorrente > diaNasc){
			idadeRealEmAnos = idadeCalculoRapidoEmAnos + " anos";
		} 
	} else {
		if (mesNasc < mesCorrente) {
			idadeRealEmAnos = idadeCalculoRapidoEmAnos.toString() + " anos";
		} else if (mesNasc > mesCorrente) {
			idadeRealEmAnos = (idadeCalculoRapidoEmAnos - 1) + " anos";
		}				
	} 
	
	return idadeRealEmAnos;
}

}[/code]

Bom dia Andre,

O que eu estou querendo dizer é o seguinte:

Não preciso do campo idade no bd, simplesmente preciso apenas converter a data de nascimento dd/mm/yyyy para idade. O problema todo é no iReport, ou seja, como faço para passar essa classe para o iReport. Por exemplo:

Clico com o botão direito do mouse em cima do campo data de nascimento que no meu caso é PACIENTE_DATA_NASC no edit expression. Ele aparece assim:

$F{PACIENTE_DATA_NASC} dentro dessas chaves devo criar um código para ler a classe idade ou fazer alguma outra forma que eu não sei. Teve um colega que disse que também pode fazer toda essa conversão com SQL e depois passar para o parâmetro para o iReport. Mas não sei como monto essa conversão no SQL. Se alguém souber agradeço muito.

Desde já agradeço,

Muito obrigado,

Elcio

Apenas coloque a classe que mostra idade no “class path” do IReport, e usar ela em qualquer “Expression”

Boa tarde caros amigos,

Muito obrigado pela a atenção de todos nesse assunto da data de nascimento para idade. Consegui resolver com um colega do Grupo JasperReports Brasil.

Agradeço o interesse a participação de todos,

Muito obrigado,

Elcio

OBS. RESOLVIDO

Sendo assim, altere o primeiro “post” e coloque [RESOLVIDO] antes do “título”

Se possível compartilhe a solução encontrada também :wink:

Att

A solução foi a seguinte:

Entrei no iReport, cliquei em um textfield e arrastei para o relatório, após feito isso, cliquei com o botão direito do mouse, optei por edit expression e coloquei o seguinte código abaixo:

((((($F{PACIENTE_DATA_NASC}.getTime() - new Date().getTime()) / 1000) / 60) /
60) / 24) / 365

No expression class optei por long, compilei e apareceu a idade correta.

Muito obrigado a todos,

Elcio