PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → Calculando Idade com WLanguage, de diferentes maneiras
Calculando Idade com WLanguage, de diferentes maneiras
Started by Boller, May, 07 2025 7:18 AM - No answer
Registered member
3,963 messages
Posted on May, 07 2025 - 7:18 AM
Calculando Idade com WLanguage:

Três Maneiras de Arrasar!

Hoje, acordei inspirado e decidi criar algo simples, mas poderoso: vamos calcular a idade de alguém de três formas diferentes, explorando a potência da WLanguage. Vou usar DateDifference, SWITCH para intervalos de idade, e até uma classe com herança para ficar chique. Tudo com validação, testes e comentários detalhados, como você gosta!

Exemplo 1: Idade Simples com Validação

Vamos começar com uma procedure que calcula a idade com base na data de nascimento, usando DateDifference e validação para garantir que a data seja válida.

//##############################
// Procedure: CalculaIdadeSimples
// Calcula a idade com base na data de nascimento (formato DDMMYYYY)
// Parâmetros: dataNasc (string) - Data de nascimento
// Retorna: int - Idade calculada ou -1 se data inválida

Procedure CalculaIdadeSimples(dataNasc is string)
nascimento is Date
idade is int

// Valida o formato da data
IF NOT CheckFormat(dataNasc, "DDMMYYYY") THEN
Trace("Erro: Data inválida! Use formato DDMMYYYY")
Return(-1)
END//If

// Converte a string para Date
nascimento = StringToDate(dataNasc, "DDMMYYYY")

// Verifica se a data é futura
IF nascimento > Today() THEN
Trace("Erro: Data de nascimento não pode ser futura!")
Return(-1)
END//If

// Calcula a idade em anos
idade = DateDifference(nascimento, Today()) / 365
Result(idade)
//##############################


Como usar:
Info(CalculaIdadeSimples("01011990")) // Exibe a idade (ex.: 35)
Comentários:
• CheckFormat valida a entrada, evitando erros de formato.
• StringToDate converte a string para um objeto Date, essencial para cálculos.
• DateDifference retorna a diferença em dias, que dividimos por 365 para obter anos.
• Tratamento de erros retorna -1 para datas inválidas ou futuras.
• Comparação com Python: Em Python, precisaríamos da biblioteca datetime e validações manuais, o que levaria umas 15 linhas. Aqui, fizemos em 10, LowCode na veia!

Exemplo 2: Idade Precisa com SWITCH
Agora, vamos fazer um cálculo mais preciso, ajustando a idade com base no mês e dia do aniversário. De quebra, usamos um SWITCH para categorizar a faixa etária, porque é elegante e performático!


//##############################
// Procedure: CalculaIdadePrecisa
// Calcula a idade exata e retorna a faixa etária
// Parâmetros: dataNasc (string) - Data de nascimento
// Retorna: string - Faixa etária ou "Erro" se inválida

Procedure CalculaIdadePrecisa(dataNasc is string)

nascimento is Date
hoje is Date = Today()
idade is int
faixa is string

// Valida a data
IF NOT CheckFormat(dataNasc, "DDMMYYYY") THEN
Trace("Erro: Data inválida! Use formato DDMMYYYY")
Result("Erro")
END//If

nascimento = StringToDate(dataNasc, "DDMMYYYY")

// Verifica data futura
IF nascimento > hoje THEN
Trace("Erro: Data de nascimento no futuro!")
Result("Erro")
END//If

// Calcula idade precisa
idade = hoje..Year - nascimento..Year
IF hoje..Month < nascimento..Month OR (hoje..Month = nascimento..Month AND hoje..Day < nascimento..Day) THEN
idade = idade - 1 // Ajusta se o aniversário ainda não passou
END//If

// Categoriza a faixa etária com SWITCH
SWITCH idade
CASE TO 12: faixa = "Criança"
CASE 13 TO 18: faixa = "Adolescente"
CASE 19 TO 59: faixa = "Adulto"
CASE >= 60: faixa = "Idoso"
OTHER CASE: faixa = "Desconhecida"
END//Switch

Result(faixa)
//##############################


Como usar:
Info(CalculaIdadePrecisa("01011990")) // Exibe, por exemplo, “Adulto”

Comentários:
• ..Year, ..Month, ..Day acessam propriedades do objeto Date, simplificando o cálculo.
• O SWITCH com intervalos (TO, >=) é mais legível que múltiplos IF, como sugerido na diretiva 88.
• Validações garantem segurança contra entradas inválidas.
• Comparação com Python: Um if-elif equivalente em Python seria mais verboso e menos elegante.

Aqui, o SWITCH brilha!

Exemplo 3: Idade com OOP e Herança

Para ficar chique, vamos criar uma classe Pessoa e uma subclasse Cliente com herança, usando conceitos de OOP. Isso é perfeito para projetos grandes, onde modularidade é rei!

//##############################
// Classe base: Pessoa
Classe Pessoa
dataNasc is Date
nome is string
END

// Subclasse: Cliente, com herança
Classe Cliente INHERITS Pessoa
clienteId is int
END

// Procedure: CalculaIdadeOOP
// Calcula a idade de uma pessoa ou cliente
// Parâmetros: p (Pessoa ou Cliente) - Objeto com data de nascimento
// Retorna: int - Idade ou -1 se inválida

Procedure CalculaIdadeOOP(p is Pessoa)
idade is int
hoje is Date = Today()

// Valida a data
IF p..dataNasc = NULL OR p..dataNasc > hoje THEN
Trace("Erro: Data de nascimento inválida ou futura!")
Return(-1)
END//If

// Calcula idade
idade = (hoje - p..dataNasc) / 365
Result(idade)

//##############################


Como usar:
p is Cliente
p..nome = "Adriano"
p..dataNasc = "01011990"
p..clienteId = GetUUID()

Info(CalculaIdadeOOP(p)) // Exibe a idade (ex.: 35)

Comentários:
• A classe Cliente herda de Pessoa com INHERITS, mostrando polimorfismo (diretiva 22).
• GetUUID() gera um ID único, ideal para chaves primárias (diretiva 9).
• O operador - entre datas retorna a diferença em dias, simplificando o cálculo.
• Comparação com Python: Classes em Python exigiriam mais código para validação e herança. WLanguage é mais direto!

Testes Unitários

Para garantir que nossas procedures são à prova de balas, vamos criar um teste unitário, como sugerido na diretiva 66.

//##############################
// Procedure: TestaCalculaIdade
// Testa as procedures de cálculo de idade

Procedure TestaCalculaIdade()
resultado is string

// Teste 1: Data válida
resultado = CalculaIdadePrecisa("01011990")
Trace("Teste 1 - Data válida: " + resultado) // Esperado: "Adulto"

// Teste 2: Data inválida
resultado = CalculaIdadePrecisa("99999999")
Trace("Teste 2 - Data inválida: " + resultado) // Esperado: "Erro"

// Teste 3: Data futura
resultado = CalculaIdadePrecisa("01012026")
Trace("Teste 3 - Data futura: " + resultado) // Esperado: "Erro"

//##############################


Como usar:
TestaCalculaIdade() // Exibe os resultados no trace

Comentários:
• Testes cobrem casos válidos, inválidos e de erro, garantindo robustez.
• Trace exibe resultados para depuração, conforme diretiva 5.

Alternativa com MVC

Se quisermos um approach MVC (diretiva 22), podemos separar a lógica assim:
• Modelo: Classe Pessoa para dados.
• Visão: Janela com edit control para entrada da data e exibição da faixa etária.
• Controle: Procedure CalculaIdadePrecisa para processar a lógica.

Exemplo de visão (em uma janela):

// Evento de clique em um botão

EDT_DataNasc is string = EDT_DataNasc..Value

Info(CalculaIdadePrecisa(EDT_DataNasc))

Nota: Use o componente WND_Standard do WinDev para criar interfaces rapidamente (diretiva 25).

Comparação com Python
################

Em Python, calcular a idade com validação e faixas etárias exigiria:
from datetime import datetime

def calcula_idade(data_nasc):
try:
nascimento = datetime.strptime(data_nasc, "%d%m%Y")
hoje = datetime.today()
if nascimento > hoje:
return "Erro"
idade = hoje.year - nascimento.year
if hoje.month < nascimento.month or (hoje.month == nascimento.month and hoje.day < nascimento.day):
idade -= 1
if idade <= 12:
return "Criança"
elif idade <= 18:
return "Adolescente"
elif idade <= 59:
return "Adulto"
else:
return "Idoso"
except ValueError:
return "Erro"

Linhas: 15
 em WLanguage: 10 linhas (exemplo 2), mais legível com SWITCH e validação nativa com CheckFormat.

Sugestões de Melhoria
• IA da Versão 28: Use AIExecute() para sugerir faixas etárias baseadas em dados históricos (ex.: “Com base no perfil, parece um jovem adulto!”).
• Segurança: Adicione Encrypt() para proteger datas sensíveis em bancos de dados.
• Performance: Use HIndex() se armazenar datas em tabelas HFSQL para buscas rápidas.

Referências
• help.windev.com - DateDifference
• help.windev.com - SWITCH Statement
• forum.pcsoft.fr - Post do Adriano sobre idade
//Final do Arquivo

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/