Página 1 de 1

[RESUELTO] calcular edad act. a partir fecha nacimiernto

Publicado: Vie Sep 17, 2010 9:04 pm
por danielmorbelli
Hola nuevamente
Busco calcular la edad a partir de una fecha de nacimiento ej: En un control "FechaNacim" (que guarda las fechas en un campo "FechaNacimiento" de la tabla "tabClientes") , necesito que en un control "Años" y en otro control "Meses" se muestren esos datos calculados según otro control "Ahora()" insertos en el formulario "forClientes" para que cada vez que entro en la ficha de esa persona me muestre su edad actualizada.

Muchas Gracias
Daniel

Re: Calcular edad actualizada a partir fecha nacimiernto

Publicado: Sab Sep 25, 2010 12:01 pm
por danielmorbelli
Hola amigos:
Tal vez nadie respondió porque pensaba que mi respuesta estaba en este hilo : http://user.services.openoffice.org/es/ ... edad#p3416
El problema es que tengo mas de 9000 registros de clientes y si hago la consulta que sugiere en dicho Hilo, anda perfecto, salvo que cada vez que carga el formulario clientes la consulta se toma el trabajo de calcular todas las edades de la tabla, lo que genera una demora insoportable.
Por eso mi intencion es hacer lo mismo , pero que el cálculo sea mediante controles calculados, para que haga solo el calculo del registro donde estoy.
Desde ya muchas gracias
Daniel

Re: Calcular edad actualizada a partir fecha nacimiernto

Publicado: Mar Sep 28, 2010 4:19 pm
por danielmorbelli
He dado un paso importante, pero falta bastante, ya que deambulando por los foros incluso los de openoffice en inglés, donde comentan que todavía no es posible calcular controles de formularios.
Dada mi extremada falta de conocimientos informáticos traté de encontrar una solución a mi problema (muy elemental...):
1°Agregué 2 campos a la "tabClientes" : "edad" y "meses"
2° Utilicé la "Ventana SQL" (de Herramientas/SQL)
3° Para calcular los años utilicé la sentencia : Update "tabClientes" SET "edad" = DATEDIFF( 'mm', "fecha nacimiento", CURRENT_DATE ) / 12
4° Para calcular los meses : Update "tabClientes" SET "meses" = MOD( DATEDIFF( 'mm', "fecha nacimiento", CURRENT_DATE ), 12 )
Con estas 2 actualizaciones conseguí que me queden actualizados los datos de edad y meses de cada uno de los 9300 clientes, en un tiempo razonable si se realiza sólo una vez al día o al mes, de manera que cuando entro en la ficha de cada uno me muestra rápidamente sus datos incluyendo su edad (ya que están grabados en la "tabClientes").
5° También probé unificando todas las sentencias en una sola ventana (incluyendo CHECKPOINT DEFRAG para evitar que con el proceso se modifique el tamaño de la tabla)
Escribí en la ventana :
Update "tabClientes" SET "edad" = DATEDIFF( 'mm', "fecha nacimiento", CURRENT_DATE ) / 12
Update "tabClientes" SET "meses" = MOD( DATEDIFF( 'mm', "fecha nacimiento", CURRENT_DATE ), 12 )
CHECKPOINT DEFRAG
Esto funcionó perfectamente desde la ventana SQL con "ejecutar" .

6° Ahora necesitaría automatizar ese proceso para que lo realice una vez al día, semana o mes.
Agradecería si alguien me da una mano para avanzar un poco mas.
Daniel

Re: Calcular edad actualizada a partir fecha nacimiernto

Publicado: Mar Sep 28, 2010 7:42 pm
por RMG
Hola Daniel,

He podido averiguar que aplicando esta función en una consulta se obtienen los años, no es exacto al cien por cien por los años bisiestos, pero a lo mejor te sirve.

DATEDIFF( 'DD', "FechaNacimiento", CURDATE( ) ) / 365

Aqui te pongo la dirección donde estan estas funciones, quizas puedas aplicar la de las horas.

http://wiki.services.openoffice.org/wik ... Procedures

Saludos
Ramón

Re: Calcular edad actualizada a partir fecha nacimiernto

Publicado: Mar Sep 28, 2010 7:56 pm
por danielmorbelli
RMG escribió:Hola Daniel,

He podido averiguar que aplicando esta función en una consulta se obtienen los años, no es exacto al cien por cien por los años bisiestos, pero a lo mejor te sirve.

DATEDIFF( 'DD', "FechaNacimiento", CURDATE( ) ) / 365

Aqui te pongo la dirección donde estan estas funciones, quizas puedas aplicar la de las horas.

http://wiki.services.openoffice.org/wik ... Procedures

Saludos
Ramón
Hola Ramón:
Lo que hice al utilizar la ventana SQL , fue para evitar precisamente una consulta (como expliqué mas arriba), ya que demora eternamente cada vez que se carga clientes o actualizo sus datos...
Lo que probé con la ventana SQL anda de maravillas , solo necesito automatizarlo para que se ejecute una sola vez al día o a demanda cuando ingrese varios clientes nuevos para calcular sus edades (si hiciera falta), sino la tabla se actualizaría sola al abrir la BD cada día y listo.
Respecto a las Funciones que linkeaste ya había hurgado por ahí pero hasta donde mis neuronas dan (que es bastante poco) no pude lograr nada aplicable al calculo de hora -del otro hilo-.Ya había probado aplicando mis escasos conocimientos y naa.
Daniel

Re: Calcular edad actualizada a partir fecha nacimiernto

Publicado: Mar Sep 28, 2010 8:40 pm
por mauricio
Hola...

Checa si el siguiente ejemplo te sirve, en el muestro:

1.- Como interceptar un cambio de registro en un formulario
2.- Como validar que no sea un registro nuevo
3.- Si no es nuevo, toma el valor del campo Fecha
4.- Calcula el número de meses entre esta fecha y la fecha actual, observa como usamos una función de Calc para esto
5.- Con un simple calculo mostramos el resultado como: X años y Z meses

Saludos

Re: Calcular edad actualizada a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 11:29 am
por danielmorbelli
Hola Mauricio, muchas gracias por responder.
El ejemplo que enviaste anda perfecto,pero tengo problemas al adaptarlo a mi BD.
Pegué la macro en un módulo que nombré EDAD

Código: Seleccionar todo

Option Explicit

Sub CalcularMeses( Evento )
Dim oFecha As Object
Dim lFecha1 As Long
Dim lFecha2 As Long
Dim mDatos()
Dim iMeses As Integer
Dim sResultado As String

	If Not Evento.Source.isNew() Then
		oFecha = Evento.Source.getDate(2)
		lFecha1 = CLng(DateSerial(oFecha.Year,oFecha.Month,oFecha.Day))
		lFecha2 = CLng(Date())
		mDatos = Array( lFecha1, lFecha2, 0 )
		iMeses = FuncionCalc( "com.sun.star.sheet.addin.DateFunctions.getDiffMonths", mDatos() )		
		sResultado = (iMeses \ 12) & " años y " & (iMeses Mod 12) & " meses"
		Evento.Source.getByName("txtMeses").Text = sResultado
	End If

End Sub


Function FuncionCalc( Nombre As String, Datos() )
Dim oSFA As Object
   
   oSFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
   FuncionCalc = oSFA.callFunction( Nombre, Datos() )
   
End Function
Tuve precaución en renombrar el campo ""fecha nacimiento" como "fecha" (formato fecha) y pegué un "txtMeses" (exactamente con las mismas propiedades que tu ejemplo) en el formulario "formClientes".
Asigné la macro en el acontecimiento :"tras el cambio de registro de datos"
Mi problema es que sucede lo siguiente al agregar o modificar una nueva fecha :

Ventana de error:
"Acción no amitida
Llamada de procedimiento no válida."


y se abre ventana de macros en el módulo que hice (EDAD) con el sig texto resaltado

lFecha1 = CLng(DateSerial(oFecha.Year,oFecha.Month,oFecha.Day))

Lo único diferente a tu ejemplo es que mi "formClientes" obtiene los datos de la consulta "conClientes" y no de una tabla.
Lo siguiente funcionó perfecto (pegándolo en mi BD y utilizando tu Formulario1) :
Probé pegando la Tabla1 , el Formulario1 y Asigné tu macro ubicada en EDAD en el acontecimiento :"tras el cambio de registro de datos"
También probé acceder a los datos de la Tabla1 desde una consulta_Tabla1 y no hay problemas.

Estuve revisando todo pero no veo que puede estar mal al editar mi formClientes
Eliminé todos los controles y dejé solo los referentes al cálculo de edad, y llegué a la conclusión: que el problema viene desde la tabla tabClientes . verifiqué el tipo de datos del campo fecha y está idéntico al de la tabla1 de tu ejemplo
Desde ya muchas gracias por tu atención
Daniel

Re: Calcular edad actualizada a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 5:46 pm
por danielmorbelli
Mauricio: Encontré el problema...
No se como se soluciona
Estuve eliminando campos de mi tabla tabClientes hasta llegar a 2 campos date (incluido fecha) y el id, y seguía fallando.
Cuando eliminé el campo date (no fecha), comenzó a funcionar correctamente.
Luego fuí agregando los campos varchar y seguía funcionando bien.
Conclusión: por lo visto tu ejemplo no admite mas de un campo date en la tabla.
El problema es que los necesito indefectiblemente y no tengo idea de como salir de este entuerto.
Daniel

Re: Calcular edad actualizada a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 6:31 pm
por mauricio
Hola...

No, puedes usar si quieres todos tus campos como fechas, "debería" de funcionar, pero tienes que "entender" como funciona para que lo puedas aplicar a tu base, observa la siguiente línea:

Código: Seleccionar todo

      oFecha = Evento.Source.getDate(2)
El número 2 dentro del método getDate, esta indicando que toma el campo número 2 del origen que tengas designado en tu formulario, los campos empiezan en 1, asegurate de que estas usando el número de campo correcto, obtendrás un error si intentas obtener un campo que no existe o usar un método incompatible con el tipo de campo...

Saludos

Re: Calcular edad actualizada a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 6:47 pm
por mauricio
Hola...

No hay como un ejemplo de prueba. Mira como estoy usando tres campos tipo fecha sin problemas...

Por favor, si esto responde tu pregunta, edita el primer mensaje de este hilo y agrega al principio del título la etiqueta [RESUELTO], de esta forma conseguiremos un foro más ordenado.

Saludos

Re: [RESUELTO] alcular edad act. a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 8:56 pm
por danielmorbelli
Hola Mauricio, Muchas gracias anda perfecto, y es como tu dices.
Yo debo tener algún otro problema con mi tabla que no alcanzo a detectar.
te envío una copia para ver si lo podes detectar.
Daniel
EDITADO: encontré un error en lo que hice ya que debía poner el campo como n° 36
Evento.Source.getByName("txtMeses").Text = CalculaEdad( Evento.Source.getDate(36) )
Mi único inconveniente ahora es cuando tengo registros de la tabla tabClientes creados pero con el campo fecha vacío me devuelve el mismo error
Daniel

Re: [RESUELTO] alcular edad act. a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 9:30 pm
por mauricio
Hola...

Como dije, hay que entender como trabaja, estas tratando de obtener una fecha (getDate) del campo número dos de tu tabla, que es un texto (campo Cliente), la numeración de los campos va en relación con tu tabla o consulta origen, no con la cantidad de controles que tienes en tu formulario, por lo que el campo fecha que muestras, es el campo 36, que es el que debes de poner en la línea:

Código: Seleccionar todo

Sub CalcularMeses( Evento )

	If Not Evento.Source.isNew() Then
		Evento.Source.getByName("txtMeses").Text = CalculaEdad( Evento.Source.getDate(36) )
	End If

End Sub
Como estas pasando un objeto vacío, al intentar asignarlo a DataSerial te daba el error.

Me debes una comida...

Saludos

P.D. Revisa un concepto que se llama normalización de bases de datos, creo, que le vendría bien a tu tabla...

Re: [RESUELTO] alcular edad act. a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 9:47 pm
por danielmorbelli
Muchas Gracias Mauricio.
Te debo una Parrillada Completa!!! (asado, vacio, chinchulines,mollejas.....) con un buen tinto
Daniel

Re: [RESUELTO] alcular edad act. a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 9:59 pm
por mauricio
Que conste, tenemos muchos testigos...

No se donde estés, pero este fin de año me toca Costa Rica, pero para el entrante me voy más al sur...

Saludos

Re: [RESUELTO] alcular edad act. a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 10:06 pm
por danielmorbelli
Muchas Gracias Ramón.
Ahora si anda perfecto!!!!
Respecto a normalizar la tabla es muy cierto, sucede que mi tabla es un embrollo porque viene desde una BD ACCESS , que a su vez viene de otra base dBase IV.
Una vez que esté funcional la voy a dejar prolija. Es que quiero de una vez por todas migrar definitivamente la base que estoy usando pero para no enloquecerme al dar el salto al vacío todavía conservo los nombres de la BD ACCESS

Pd: Mar del Plata ,Argentina
Te pido mil disculpas, se me escaparon 2 registros que debía haber borrado de la tabClientes (el 4 y el 5 ) si es que los puedes borrar.
Un abrazo enorme desde el SUR
Daniel

Re: [RESUELTO] alcular edad act. a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 10:15 pm
por mauricio
Pero compañero de donde sacas el Ramón, soy Mauricio...

¿Te refieres a los datos de los campos 4 y 5?, si es así ya los he borrado...

Saludos y te anoto en mi lista de comidas ahora que vaya a la hermosa Argentina...

Un abrazo...

Re: [RESUELTO] alcular edad act. a partir fecha nacimiernto

Publicado: Mié Sep 29, 2010 10:21 pm
por danielmorbelli
JE JE, Mauricio, estoy para un GERIÁTRICO!!!
Un Abrazo!!

Re: [RESUELTO] calcular edad act. a partir fecha nacimiernto

Publicado: Jue Sep 30, 2010 12:15 am
por danielmorbelli
BINGO!!! se me mojó el fuego....estoy de vuelta
Tomando los datos desde la tabla no hay problemas , pero si lo hago desde una consulta (y necesito que sea desde consulta), no da error, pero en txtMeses pone "0 años y 0 meses" -en linux-(habiendo ingresado una fecha válida).
Daniel

Re: [RESUELTO] calcular edad act. a partir fecha nacimiernto

Publicado: Jue Oct 07, 2010 6:43 am
por mauricio
Hola Daniel...

Necesitas una clase de "paciencia", no se por que se me hace que eres medio atrabancado (aquí en México algo así como desesperado)...

Cometiste el mismo error de la primera vez. En tu tabla el campo fecha es el número 36, pero en tu consulta (que son otra cosa) el campo es el número 3.

Me debes otra comida por distraído.


Saludos

P.D. Procura no abrir un hilo marcado como resuelto, es probable que no se vea, llegue a este de casualidad, gracias...

Re: [RESUELTO] calcular edad act. a partir fecha nacimiernto

Publicado: Jue Oct 07, 2010 12:00 pm
por danielmorbelli
Uyyyyy, voy a tener que cocinar una vaca entera!!!! :crazy: :knock:
Pido disculpas a Todos y sobre todo al gran maestro!
Ándale, aquí a tu frase sería "Me debés otra comida por bolu.." (le falta la 1º nota musical para completar la palabra)
Un abrazo
Daniel

Re: [RESUELTO] calcular edad act. a partir fecha nacimiernto

Publicado: Lun Abr 10, 2017 8:01 pm
por vic2003
la formula
=AÑOS(A2;HOY();0) &";" & MESES(A2;HOY ();0)-ENTERO(MESES(A2;HOY ();0)/12)*12
El resultado:
año;mes

si la fecha de nacimiento es 11/04/2015
si la fecha de hoy es 10/04/2017
el resultado devolverá: 1;11 o sea 1 año y 11 meses

si deseas que aparezcan los textos 'años' y 'meses' puedes dejar la formula así:
=AÑOS(A2;HOY();0) &"años y " & MESES(A2;HOY ();0)-ENTERO(MESES(A2;HOY ();0)/12)*12 &" meses"
.
Si trabajas con una versión en inglés (que yo no tengo) creo que la formula sería:
=YEARS(A2;TODAY();0) &";" & MONTHS(A2;TODAY ();0)-INT(MONTHS(A2;TODAY ();0)/12)*12

Suerte!