Autor Tema: Problemas con Funcion que devuelve Edad (usando datediff)  (Leído 10655 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Problemas con Funcion que devuelve Edad (usando datediff)
« en: Febrero 10, 2015, 07:54:52 pm »
Hola chicos tengo esta funcion que me devuelve la Edad pero advierto un error en ella fijense por favor a ver si esta mal o que pasa


Código: [Seleccionar]
Private Sub Command1_Click()
 MsgBox Edad("10/02/1994") 'DEVUELVE 21
 MsgBox Edad("09/02/1994") 'DEVUELVE 21 Y DEBERIA DEVOLVER 20 POR QUE TODAVIA hoy es 10/02/2015 NO SE HA CUMPLIDO
 
End Sub

Private Function Edad(valor As String) As String
Dim e As Single, a As Integer, m As Integer

 e = DateDiff("m", valor, Now) / 12
 a = Int(e)
 Edad = a
End Function
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #1 en: Febrero 10, 2015, 10:14:15 pm »
Hola, si el DateDif me creo el mismo problema como a vos hace poco esta probando sobre fechas para un reporte encontre esta funcion y me va bien.

Código: (VB) [Seleccionar]
Option Explicit

Function anosMesesDias(fechaInicio As Date, _
    fechaFin As Date) As String
  Dim anos, meses, dias, m As Integer
   
  anos = Year(fechaFin) - Year(fechaInicio)
  If Month(fechaInicio) > Month(fechaFin) Then
    anos = anos - 1
  End If
  If Month(fechaFin) < Month(fechaInicio) Then
    meses = 12 - Month(fechaInicio) + Month(fechaFin)
  Else
    meses = Month(fechaFin) - Month(fechaInicio)
  End If
  If Day(fechaFin) < Day(fechaInicio) Then
    meses = meses - 1
    If Month(fechaFin) = Month(fechaInicio) Then
      anos = anos - 1
      meses = 11
    End If
  End If
  dias = Day(fechaFin) - Day(fechaInicio)
  If dias < 0 Then
    m = CInt(Month(fechaFin)) - 1
    If m = 0 Then
      m = 12
    End If
    Select Case m
      Case 1, 3, 5, 7, 8, 10, 12
        dias = 31 + dias
      Case 4, 6, 9, 11
        dias = 30 + dias
      Case 2
        If (Year(fechaFin) Mod 4 = 0 And _
            Year(fechaFin) Mod 100 <> 0) _
            Or Year(fechaFin) Mod 400 = 0 Then
          dias = 29 + dias
        Else
          dias = 28 + dias
        End If
      End Select
  End If
  anosMesesDias = CStr(anos) + " años, " + CStr(meses) _
      + " meses, " + CStr(dias) + " días "
End Function

Como Usar

Código: (VB) [Seleccionar]
Private Sub Command1_Click()
    MsgBox anosMesesDias(CDate("01-01-2000"), Now)
End Sub

Fuente: http://www.ajpdsoft.com/modules.php?name=Foros&file=viewtopic&t=898


Otros Ejemplos.
http://www.recursosvisualbasic.com.ar/htm/tutoriales/tutorial-basico5.htm#fecha-hora
http://es.kioskea.net/forum/affich-194090-calculo-fecha-en-visual-basic
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #2 en: Febrero 11, 2015, 08:49:39 am »
Hola, si el DateDif me creo el mismo problema como a vos hace poco esta probando sobre fechas para un reporte encontre esta funcion y me va bien.

Código: (VB) [Seleccionar]
Option Explicit

Function anosMesesDias(fechaInicio As Date, _
    fechaFin As Date) As String
  Dim anos, meses, dias, m As Integer
   
  anos = Year(fechaFin) - Year(fechaInicio)
  If Month(fechaInicio) > Month(fechaFin) Then
    anos = anos - 1
  End If
  If Month(fechaFin) < Month(fechaInicio) Then
    meses = 12 - Month(fechaInicio) + Month(fechaFin)
  Else
    meses = Month(fechaFin) - Month(fechaInicio)
  End If
  If Day(fechaFin) < Day(fechaInicio) Then
    meses = meses - 1
    If Month(fechaFin) = Month(fechaInicio) Then
      anos = anos - 1
      meses = 11
    End If
  End If
  dias = Day(fechaFin) - Day(fechaInicio)
  If dias < 0 Then
    m = CInt(Month(fechaFin)) - 1
    If m = 0 Then
      m = 12
    End If
    Select Case m
      Case 1, 3, 5, 7, 8, 10, 12
        dias = 31 + dias
      Case 4, 6, 9, 11
        dias = 30 + dias
      Case 2
        If (Year(fechaFin) Mod 4 = 0 And _
            Year(fechaFin) Mod 100 <> 0) _
            Or Year(fechaFin) Mod 400 = 0 Then
          dias = 29 + dias
        Else
          dias = 28 + dias
        End If
      End Select
  End If
  anosMesesDias = CStr(anos) + " años, " + CStr(meses) _
      + " meses, " + CStr(dias) + " días "
End Function

Como Usar

Código: (VB) [Seleccionar]
Private Sub Command1_Click()
    MsgBox anosMesesDias(CDate("01-01-2000"), Now)
End Sub

Fuente: http://www.ajpdsoft.com/modules.php?name=Foros&file=viewtopic&t=898


Otros Ejemplos.
http://www.recursosvisualbasic.com.ar/htm/tutoriales/tutorial-basico5.htm#fecha-hora
http://es.kioskea.net/forum/affich-194090-calculo-fecha-en-visual-basic

PERO HAY ALGO QUE NO FUNCIONA O YO LO INTERPRETO MAL ESTA QUE ME PASAS ME DA EL MISMO PROBLEMA SI LA LLAMO ASI!

Código: [Seleccionar]
Caption = anosMesesDias("01-02-1994", Now)
Me devuelve 21 años, 0 meses, 10 días  y  son 20 años 11 meses y 10 dias por que 21 años seria a partir de la fecha de HOY EN ADELANTE.

S.O.S please
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #3 en: Febrero 11, 2015, 11:38:59 am »
Yo lo que entiendo ahí es que solo esta restando el año

Ejemplo  2015 - 1994  = 21

Sin importar los meses.

Lo que podes hacer es maquilar o algo asi yo lo hice esta forma no justamente lo que vos queres pero podes probarlos.

En un Timer

Código: (VB) [Seleccionar]
Private Sub Timer1_Timer()
   
    On Error Resume Next
   
    Dim año As Integer
    Dim mes As Integer
    Dim dia As Integer
   
    Dim xaño As String
    Dim xmes As String
    Dim xdia As String
   
    año = Mid$(anosMesesDias(CDate(Text1.Text), Now), 1, 4)
    mes = Mid$(anosMesesDias(CDate(Text1.Text), Now), 5, 2)
    dia = Mid$(anosMesesDias(CDate(Text1.Text), Now), 7, 2)
   
    If Val(año) <= 0 Then
        xaño = ""
    Else
        xaño = año & " años "
    End If
   
    If Val(mes) <= 0 Then
        xmes = ""
    Else
        If Val(mes) > 1 Then
            xmes = mes & " meses "
        Else
            xmes = mes & " mes "
        End If
    End If
   
    If Val(dia) <= 0 Then
        xdia = ""
    Else
        xdia = dia & " dias"
    End If
   
    If xaño = "" And xmes = "" And xdia = "" Then
        Command1.Caption = "Algunas Horas..."
    Else
        Command1.Caption = xaño & xmes & xdia
    End If
   
End Sub
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #4 en: Febrero 11, 2015, 11:52:12 am »
Aca esta otro ejemplo, este si funciona.

Código: (VB) [Seleccionar]
    Function Calcular_Edad(Fecha_Nacimiento As Variant) As Integer
       Dim Años As Variant
      ' comprueba si el valor no es nulo
      If IsNull(Fecha_Nacimiento) Then
        Calcular_Edad = 0
        Exit Function
      End If
       
      Años = DateDiff("yyyy", Fecha_Nacimiento, Now)
       
      If Date < DateSerial(Year(Now), Month(Fecha_Nacimiento), Day(Fecha_Nacimiento)) Then
         Años = Años - 1
      End If
       
      Calcular_Edad = CInt(Años)
     
    End Function
 
    Private Sub Command2_Click()
         
        Dim fecha As Date
         
        fecha = "11/02/1994"
        ' le pasa la fecha de nacimiento como parámetro
        MsgBox Calcular_Edad(fecha), vbInformation, fecha
    End Sub
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #5 en: Febrero 11, 2015, 06:24:07 pm »
No hay caso sigo con problemas! para mi no es exacto este asunto por que hay que tener en cuenta los biciestos!

Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #6 en: Febrero 11, 2015, 07:57:24 pm »
A ver si alguien me echa una mano con esto por favor aca les dejo un ejemplo sencillo para que me entiendan perfectamente cual es mi problema.

Fuente:
https://dl.dropboxusercontent.com/u/53113728/ESQUELETO%20CONEXION.rar

Quiero mostrar la edad en una columna a partir de la fecha de nacimiento que esta en la BD.
Bien al cargar de la base se llama a la función que me paso el amigo Enter para calcular la Edad y fijense los valores que me devuelve en mi sistema y ver si a UD s les muestra lo mismo.

Este es mi resultado
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #7 en: Febrero 11, 2015, 09:08:03 pm »
Yo lo hago así. Fijate si te sirve de algo.

Código: (VB) [Seleccionar]
    Dim Edad As Double
    Dim Dia As Byte
    Dim Mes As Byte
    Dim Año As Integer
    Dim Fecha As Date
    Dim FechaNacimiento As String
    FechaNacimiento = "01-01-1990"
    Dia = Day(Date)
    Mes = Month(Date)
    Año = Year(Date)
    Fecha = CDate(Dia & "/" & Mes & "/" & Año - 1)
    Edad = DateDiff("yyyy", FechaNacimiento, Fecha)
    If FechaNacimiento > CDate(Dia & "/" & Mes & "/" & Year(FechaNacimiento)) Then
'        Edad = Edad
    Else
        Edad = Edad + 1
    End If

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #8 en: Febrero 12, 2015, 10:03:23 pm »
Hola, proba con la funcion que está aca:
http://www.fmsinc.com/microsoftaccess/modules/examples/agecalculation.asp

La copio aca por las dudas:
Código: (vb) [Seleccionar]
Public Function AgeYears(ByVal datBirthDate As Date) As Integer
  ' Comments: Returns the age in years
  ' Params  : datBirthDate    Date to check
  ' Returns : Number of years
  ' Source  : Total Visual SourceBook

  On Error GoTo PROC_ERR

  Dim intYears As Integer

  intYears = Year(Now) - Year(datBirthDate)

  If DateSerial(Year(Now), Month(datBirthDate), Day(datBirthDate)) > Now Then
   ' Subtract a year if birthday hasn't arrived this year
    intYears = intYears - 1
  End If

  AgeYears = intYears

PROC_EXIT:
  Exit Function

PROC_ERR:
  MsgBox "Error: " & Err.Number & ". " & Err.Description, , "AgeYears"
  Resume PROC_EXIT
End Function

Lo probé con mi fecha de nacimiento y funciona perfecto!
Código: (vb) [Seleccionar]
Private Sub Form_Load()

Dim CurrentAge As Integer

CurrentAge = AgeYears(#8/11/1992#)
MsgBox "The current age is: " & vbCrLf & CurrentAge
' Devuelve 22, lo cual es correcto
End Sub

Saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #9 en: Febrero 12, 2015, 11:23:51 pm »
Gracias chicos mañana pruebo esto y comento.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #10 en: Febrero 13, 2015, 07:36:33 am »
Hola, proba con la funcion que está aca:
http://www.fmsinc.com/microsoftaccess/modules/examples/agecalculation.asp


Hola Coco !! no no hay caso ya prove muchisimas y no hay caso! todas me devuelven un valor erroneo para mi es una cuestion de los años Biciestos!
Prova esta por favor y decime si estoy equivocado yo  hoy siendo 13/02/2015 la pruebo de esta manera:

CurrentAge = AgeYears(#13/02/1994#) y me devuelve 21 (CORRECTO!!)
Y asi
CurrentAge = AgeYears(#12/02/1994#) y devuelve 21 (FALSO TODABIA NO SE CUMPLIO)
aun asi!!
CurrentAge = AgeYears(#12/01/1994#) y devuelve 21 (FALSO TODABIA NO SE CUMPLIO)

POR FAVOR SI LA PRUEBAN Y ME DICE SI LES DEVUELVE LO MISMO QUE A MI !
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #11 en: Febrero 13, 2015, 07:53:43 am »
aun asi!!
CurrentAge = AgeYears(#12/01/1994#) y devuelve 21 (FALSO TODABIA NO SE CUMPLIO)
En ese caso está bien que devuelva 21, porque la persona cumplió años el mes pasado.

Yo lo probé con la función que te pasé y me da siempre bien.
La función es la siguiente:
Código: (VB) [Seleccionar]
Private Function CalcularEdad(ByVal FechaNacimiento As String)
    Dim Edad As Double
    Dim Dia As Byte
    Dim Mes As Byte
    Dim Año As Integer
    Dim Fecha As Date
    Dia = Day(Date)
    Mes = Month(Date)
    Año = Year(Date)
    Fecha = CDate(Dia & "/" & Mes & "/" & Año - 1)
    Edad = DateDiff("yyyy", FechaNacimiento, Fecha)
    If FechaNacimiento > CDate(Dia & "/" & Mes & "/" & Year(FechaNacimiento)) Then
'        Edad = Edad
    Else
        Edad = Edad + 1
    End If
    CalcularEdad = Edad
End Function

Y la llamé de esta manera (hoy es 13-02-2015):
Código: (VB) [Seleccionar]
    MsgBox CalcularEdad("12-02-1994") & vbCrLf & CalcularEdad("13-02-1994") & vbCrLf & CalcularEdad("14-02-1994") & vbCrLf & CalcularEdad("14-01-1994")

Jerónimo

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #12 en: Febrero 13, 2015, 12:20:56 pm »
Jerónimo

Asi te da a Ti ??

Fijate como me da !!

Esta mal

« última modificación: Febrero 13, 2015, 12:29:38 pm por Bazooka »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #13 en: Febrero 13, 2015, 01:33:31 pm »
No entiendo qué está mal.
El argumento que se pasa a la función es la fecha de nacimiento de la persona.
Una persona que nació el 12 de febrero de 1994, el 12 de febrero de 2015 cumplió 21 años. Por ende, hoy, 13 de febrero de 2015, tiene 21 años. Si hubiera nacido el 13 de febrero de 1994 sería el mismo caso. Ahora, si hubiera nacido el 14, hoy tendría 20 años.
Estoy medio mareado porque estoy con mucho trabajo, pero creo haber hecho bien las cuentas. O tal vez no...  :P
Saludos.

Jerónimo
« última modificación: Febrero 13, 2015, 01:35:03 pm por Jeronimo »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Problemas con Funcion que devuelve Edad (usando datediff)
« Respuesta #14 en: Febrero 13, 2015, 02:11:36 pm »
12-02-1994   (hoy es 13/02/15)
Ayer fue su cumpleaños!!!! festejó y bebió hasta tarde, esta feliz porque tiene 21 años.

13-02-1994   (hoy es 13/02/15)
Hoy es su cumpleaños!!!! hoy festejará y beberá hasta tarde PERO HOY, esta feliz porque ya tiene 21 años. Normalmente queda irrelevante la hora en que nació para querer ser mas preciso, en todo caso faltaría ese dato ¿a que hora nació?

14-02-1994   (hoy es 13/02/15)
Mañana es su cumpleaños!!!! tranquilo muchacho que aun tienes 20.

Entonces concuerdo con Jeronimo.

Saludos
« última modificación: Febrero 13, 2015, 02:14:42 pm por YAcosta »
Me encuentras en YAcosta.com