[RESUELTO] Edad (años, meses y días) y Fecha/Hora de Alta

Discute sobre las herramientas de la base de datos
Responder
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

[RESUELTO] Edad (años, meses y días) y Fecha/Hora de Alta

Mensaje por HSEGROD »

Hola gente.. otra vez por aquí... a ver si me podéis ayudar... :roll:

Base de datos de entrada de pacientes por Urgencias .
Me falla sólo dos cositas...
1) calcular la edad del paciente (incluyendo los días ya que si son niños pequeños es bastante importante ese dato)
2) implementar la fecha del Alta del Paciente.

En el primer punto, he mirado y remirado y hecho miles de combinaciones pero no logro poder hacerlo.
Tengo un campo Fecha de Nacimiento (FechaNac) y al lado un campo EDAD que se debería rellenar automáticamente al salir de la Fecha de Nacimiento.

Tengo este código pero... no me funciona

Código: Seleccionar todo

sub CalculaEdad( Fecha As Object) As String
Dim lFecha1 As Long
Dim lFecha2 As Long
Dim mDatos()
Dim iMeses As Integer
Dim sResultado As String
Dim xano as string
Dim xmes as string
Dim xdia as string
Dim stringano as string
Dim stringmes as string
Dim stringdia as string

Dim oForm As Object


    	oForm=Evento.Source                    
		Fecha = oForm.getByName("FechaNac") 

		If Fecha.Year = 0 Then
			lFecha1 = CLng(Date())
		Else
			lFecha1 = CLng(DateSerial(Fecha.Year,Fecha.Month,Fecha.Day))
		End If
		
		lFecha2 = CLng(Date())
		mDatos = Array( lFecha1, lFecha2, 0 )
		iMeses = FuncionCalc( "com.sun.star.sheet.addin.DateFunctions.getDiffMonths", mDatos() )
		
		xano = (iMeses \ 12)
		xmes = (iMeses Mod 12)
	
		if xano = 1 then
		stringano = " año y "
		else 
		stringano = " años y "
		end if
		
		if xano = 0 then
		stringano = ""
		end if
		
			if xmes = 1 then
		stringmes = " mes"
		else 
		stringmes = " meses"
		end if
		
		if xmes = 0 then
		stringmes = ""
		end if
		
			if xdia = 1 then
		stringmes = " día"
		else 
		stringdia = " días"
		end if
		
		if xdia = 0 then
		stringdia = ""
		end if
				
		sResultado = xano & stringano & xmes & stringmes & xdia & stringdia
	'	CalculaEdad = sResultado
		
		Evento.Source.getByName("EDAD").Text = sResultado
			
End sub

y con relación a la fecha del Alta del paciente... he podido poner automáticamente la Fecha de Entrada de la Urgencia pero aunque intento hacer lo mismo con el alta (esta vez con un BOTÓN) no me sale la dichosa fecha...

Código: Seleccionar todo

Sub DarAlta(Evento)

Dim oCtrl As Object, oForm As Object

    oForm=Evento.Source                                                                        ' Formulario afectado
    oCtrl = oForm.getByName("FechaAlt")                                                        ' Control fecha
    If oCtrl.BoundField.getString()<>"" Then  Exit sub                                         ' Si ya hay una fecha, salimos
    
    
    oCtrl.BoundField.UpdateString( Format(Now, "dd/mm/yyyy") & " " & Format(Now, "HH:mm:ss") ) ' Ponemos la fecha
        
end sub


Gracias por adelantado... ;)
Adjuntos
DragoOpenOffice.7z
(105.49 KiB) Descargado 262 veces
Última edición por mauricio el Lun Abr 16, 2018 10:21 pm, editado 2 veces en total.
Razón: Marcar icono de resuelto
Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Edad (años, meses y días) y Fecha/Hora de Alta

Mensaje por Longi »

Buenas!
Problema no menor!
Los años no son siempre iguales (hay bisisestos) y los meses tampoco, (los hay de 28, 30 y 31 días), con lo que, sin un automatismo a propósito, solo nos quedan aproximaciones.
Modifiqué tu consulta 'ConFiltro' y le añadí el cálculo de años, meses y días, con el error de aproximación que te comento en el apartado de los días, pero no he sabido hacer nada mejor:

Código: Seleccionar todo

SELECT "Tb_Pacientes".*, YEAR( NOW( ) ) - YEAR( "FNac" ) "AÑOS", CASEWHEN( DAY( NOW( ) ) - DAY( "FNac" ) <= 0, ( MONTH( NOW( ) ) - MONTH( "FNac" ) ) - 1, ( MONTH( NOW( ) ) - MONTH( "FNac" ) ) ) "MESES", CASEWHEN( DAY( NOW( ) ) - DAY( "FNac" ) <= 0, 30 + ( DAY( NOW( ) ) - DAY( "FNac" ) ), DAY( NOW( ) ) - DAY( "FNac" ) ) "DIAS" FROM "Tb_Pacientes"
Habría que saber si lo que quieres es tener solo la edad en la fecha de ingreso, o que vaya cambiando con el paso del tiempo (es un poco diferente).
En este hilo encontrarás más sugerencias:

http://140.211.11.67/en/forum/viewtopic ... 9&p=216861

Allí, para calcular la edad en macro encontrarás este código

Código: Seleccionar todo

calcAge= cint( year(Current) - year(Birth)) - Switch((month(Current) > month(Birth) ) ,0 , (month(Current) < month(Birth) ) ,1 ,  ( day(Current) < day(Birth) ) ,1,true, 0) 
Comprueba que esté todo bien. En SQL soy bastante más desastre que en el resto de cosas, así que no sería de extrañar que hubiese algo mal, y mucho menos que fuese muy, muy simplificable.
Ahora me pongo con la segunda parte de la pregunta! (aunque debiera ser un hilo aparte)

Un saludo! ;)
Última edición por Longi el Dom Abr 15, 2018 6:11 pm, editado 1 vez en total.
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Edad (años, meses y días) y Fecha/Hora de Alta

Mensaje por RMG »

Hola,

En este enlace tienes un ejemplo que te puede interesar. Además tirando de un poco de ingenio en una consulta he podido hacerlo con bastante aproximación. Mira si te sirve el ejemplo.

https://forum.openoffice.org/es/forum/v ... ses#p13252

Saludos
Adjuntos
DragoOpenOffice1.7z
(106.76 KiB) Descargado 272 veces
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Edad (años, meses y días) y Fecha/Hora de Alta

Mensaje por Longi »

Con respecto a la segunda cuestion debes cambiar la primera línea de la macro por esta otra:

Código: Seleccionar todo

    oForm=Evento.Source.Model.Parent                                                                        ' Formulario afectado
.

Creo que con eso sería suficiente.

Lo que tenías hasta ahora apuntaba al botón, así apuntas al formulario que tiene el botón. (simplemente una cuestión de puntería)

Otro saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: Edad (años, meses y días) y Fecha/Hora de Alta

Mensaje por HSEGROD »

Tema complicadísimo... :crazy: :crazy:

Gracias a ambos por contestar...
Al final no sé que hacer... ya que ambas respuestas tienen pequeños errores de días (como bien LONGI ya me advertía)...

He optado por coger la SQL que RMG me sugiere ya que es algo más aproximada, aunque me falla por ejemplo en un niño que cumple hoy 14 años ya le asigna 14 años y 3 días. Y en la de LONGI me saldría 14 años -1 mes +30 días (que casi es más correcta, si sumamos y restamos, pero no practicable.)

Bueno sigo dándole vueltas y lo dejo abierto un par de días más a ver si se os ocurre algo o a alguien más... :roll: :roll:

Longi.... Gracias por lo de la Fecha de Alta.. funcionó a la perfección... TÚ si que tienes puntería... :super: :super:
Adjuntos
DragoOpenOffice.7z
(107.11 KiB) Descargado 240 veces
Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Edad (años, meses y días) y Fecha/Hora de Alta

Mensaje por Longi »

Buenas!
Desde luego que lo de los -1 no son admisibles para nada. Ya dije que en SQL no ando de lo más fino.
He hecho otra aproximación, teniendo en cuenta que los años tienen 365.25 días (efecto del bisiesto), y que los meses tienen 30.4375 días (dividir 365.25 entre 12 meses del año). Sigue sin salir exacto, pero eso ya lo sabíamos....:

Código: Seleccionar todo

SELECT "Tb_Pacientes".*, FLOOR( DATEDIFF( 'DD', "FNac", CURDATE( ) ) / 365.25 ) "Años", FLOOR( ( DATEDIFF( 'DD', "FNac", CURDATE( ) ) / 365.25 - FLOOR( DATEDIFF( 'DD', "FNac", CURDATE( ) ) / 365.25 ) ) * 12 ) "Meses", CEILING( ( ( DATEDIFF( 'DD', "FNac", CURDATE( ) ) / 365.25 - FLOOR( DATEDIFF( 'DD', "FNac", CURDATE( ) ) / 365.25 ) ) * 12 - FLOOR( ( DATEDIFF( 'DD', "FNac", CURDATE( ) ) / 365.25 - FLOOR( DATEDIFF( 'DD', "FNac", CURDATE( ) ) / 365.25 ) ) * 12 ) ) * 30.4375 ) "Dias" FROM "Tb_Pacientes"
Seguiremos cabilando.....

Otro saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: Edad (años, meses y días) y Fecha/Hora de Alta

Mensaje por HSEGROD »

Gracias Longi... Te superas...

pero aún así me voy a quedar con tu anterior SQL, ya que intentando corregir con macro la diferencia de 30 días y pasándolo como si fuera un mes completo.... me sale un acierto del 99.9 % :bravo: :bravo:

Me refiero a esta...

Código: Seleccionar todo

SELECT "Tb_Pacientes".*, YEAR( NOW( ) ) - YEAR( "FNac" ) "Años", CASEWHEN( DAY( NOW( ) ) - DAY( "FNac" ) <= 0, ( MONTH( NOW( ) ) - MONTH( "FNac" ) ) - 1, ( MONTH( NOW( ) ) - MONTH( "FNac" ) ) ) "Meses", CASEWHEN( DAY( NOW( ) ) - DAY( "FNac" ) <= 0, 30 + ( DAY( NOW( ) ) - DAY( "FNac" ) ), DAY( NOW( ) ) - DAY( "FNac" ) ) "Dias" FROM "Tb_Pacientes"
Ahora está el problema de... sabré hacerlo...?? :lol:
Adjuntos
3consultas.7z
(64.7 KiB) Descargado 232 veces
Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Edad (años, meses y días) y Fecha/Hora de Alta

Mensaje por Longi »

Otra vez al ataque!
Esta vez es una macro.
Puse un botón y lo activé cada vez pulsando. Evidentemente hay que asignarlo a evento de formulario (al cambiar el registro), pero solo era para ver qué tal funcionaba.
Al principio estaba lúcido, pero poco a poco me fui apagando, y ya no sé si los cálculos son los apropiados (en un principio si.)
Al calcular años por un lado y meses por otro solo tenemos la influencia de la longitud de los meses, y creo que el efecto febrero está arreglado.
Mira a ver si la lucidez te viene a ti y puedes poner las condiciones para las diferencias entre los meses de 30 y los de 31 (no digamos ya los meses de 29 días....)
Cuando la diferencia entre el día actual y el día del nacimiento es negativo, se le resta a 28 o 30, según el caso, pero también le resta un mes a la diferencia entre meses.
Si la diferencia entre meses es a su vez negativa, se le resta un mes a 12 y se le resta uno al año, de tal manera que la única variable problemática son los dias, según el mes en el que estemos o en el que haya nacido el susodicho.

Código: Seleccionar todo

sub CalculaEdad( Evento) As String
Dim lFecha1 As Long
Dim lFecha2 As Long
Dim mDatos()
Dim iMeses As Integer
Dim sResultado As String
Dim xano as string
Dim xmes as string
Dim xdia as string
Dim stringano as string
Dim stringmes as string
Dim stringdia as string

Dim oForm As Object


    	oForm=Evento.Source.Model.Parent                    
		Fecha = CDate(oForm.getByName("FechaNac").Boundfield.String )
		A= year(NOW())-Year(Fecha)
		M= Month(Now())-Month(Fecha)
		D= Day(Now())-Day(Fecha)
		
        If Month(Now())=2 or Month(Fecha)=2 Then
        lonMes=28
        else
        lonMes=30
        End if
    
		
		If D<0 Then
		D=LonMes+D
		M= m-1
		If M<0 Then
		M=12+M
		A=A-1
		End if
		End if

		If A<1 or A>1 Then
		alfa= " años, "
		Else
		alfa= " año, "
		End if

		If M<1 or M>1 Then
		Beta= " meses y "
		Else
		Beta= " mes y "
		End if
	    
	    If D<1 or D>1 Then
		Gamma= " días."
		Else
		Gamma= " día."
		End if

		msgbox A & alfa & M & Beta & D & Gamma		
		
			
End sub
Otro saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: Edad (años, meses y días) y Fecha/Hora de Alta

Mensaje por HSEGROD »

LUCIDEZ... lucidez debe ser UNO DE TUS APELLIDOS.... :bravo: :bravo:

Vamos llevaba todo el día luchando con la "consulta SQL" e intentando hacer lo que TÚ has hecho en un momento...

Ha quedado de lujo y SIN ERROR de cálculo alguno... yo sólo lo he implementado a la salida del foco del Campo FechaNac y que lo mostrara en el campo EDAD... vamos,... DE LUJO. (ahora me toca estudiar bien la macro que... es complicadaaaa :ouch: )

Sólo queda intentar que dicho campo EDAD sea con fondo rojo (el campo o la fuente) si el paciente es mayor de 14 años... pero eso ya debe ser OTRO HILO, para no mezclar ideas.

Gracias mil... y saludos desde Gran Canaria.. :super:
Adjuntos
DragoOpenOffice.7z
(107.33 KiB) Descargado 266 veces
Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: [RESUELTO] Edad (años, meses y días) y Fecha/Hora de Al

Mensaje por Longi »

Perdona que sea tan pesado, y ya sé que lo tienes como resuelto, pero creo que sigue teniendo error (no se han tenido en cuenta los meses de 31 días.
La falta de inspiración que tenía ayer la he podido suplir casi totalmente:
Substituye las líneas:

Código: Seleccionar todo

        If Month(Now())=2 or Month(Fecha)=2 Then
        lonMes=28
        else
        lonMes=30
        End if
por estas otras:

Código: Seleccionar todo

      If Month(Fecha)=1 or Month(Fecha)=3 or Month(Fecha)=5 or Month(Fecha)=7 or Month(Fecha)=8 or Month(Fecha)=10 or Month(Fecha)=12 Then
      lonMes=31
      End if
      If Month(Fecha)=4 or Month(Fecha)=6 or Month(Fecha)=9 or Month(Fecha)=11 Then      
      lonMes=30
      End if
      If Month(Fecha)=2 Then
      lonMes=28
      End if
De esta forma restamos los días de forma correcta, con la única excepción de si nace en febrero de un año bisiesto.
He intentado con las funciones de calc. Primero para ver los días del mes, que aunque existe, parece que no funciona en este contexto, y lo mismo me pasó con la función de determinar los años bisiestos.
Así que creo que el único parche que le queda para que funcione a la perfección sería el de determinar los años bisiestos (podríamos hacerlo con un array rellenándolos a mano, pero es posible que no haya sabido implementar la función, pero sí que sea posible, así que si alguien se anima......

Otro saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: [RESUELTO] Edad (años, meses y días) y Fecha/Hora de Al

Mensaje por HSEGROD »

Uff.. tu EMPEÑO me asombra...

Ahora implemento tu nuevo descubrimiento... yo lo único que descubrí era que (a ver como lo explico) .... la rutina me daba errores negativos que no eran contemplados ya que sólo lo miraba cuando los días también eran negativos... lo solucioné desanidando el IF...

Al final... se ha quedado así.... (pendiente de implementar tu NUEVA IDEA...)

Código: Seleccionar todo

sub CalculaEdad( Evento) As String
Dim sResultado As String
Dim oForm As Object


      oForm=Evento.Source.Model.Parent                    
      Fecha = CDate(oForm.getByName("FechaNac").Boundfield.String )
      A= year(NOW())-Year(Fecha)
      M= Month(Now())-Month(Fecha)
      D= Day(Now())-Day(Fecha)
      
        If Month(Now())=2 or Month(Fecha)=2 Then
        lonMes=28
        else
        lonMes=30
        End if
    
      REM ----------------------- AQUÍ ES ES CAMBIO INDICADO ----------------------------
      If D<0 Then
      D=LonMes+D
      M= m-1
      END IF
      If M<0 Then
      M=12+M
      A=A-1
      End if
     REM ------------------------- FIN DEL CAMBIO ---------------------------------

      If A<1 or A>1 Then
      alfa= " años, "
      Else
      alfa= " año, "
      End if

      If M<1 or M>1 Then
      Beta= " meses y "
      Else
      Beta= " mes y "
      End if
       
       If D<1 or D>1 Then
      Gamma= " días."
      Else
      Gamma= " día."
      End if

    sResultado = A & alfa & M & Beta & D & Gamma      
      
         	oCtrl = oForm.getByName("txtEdad")                                                        ' Control Edad
        	oCtrl.BoundField.UpdateString(sResultado) 

IF A >13 then
oCtrl.BackgroundColor = RGB(247,255,0) 									'Ponemos en Amarillo si es mayor de 13 años
else
oCtrl.BackgroundColor = RGB(255,204,153)								' Ponemos de fondo el color predeterminado (Naranja10)
end if

End sub

Ahora a... poner lo nuevo.... Graciasssss mil.... :super: :super:
Apache OpenOffice 4.1.5 -- Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: [RESUELTO] Edad (años, meses y días) y Fecha/Hora de Al

Mensaje por HSEGROD »

Creo que se nos ha escapado un detalle... creo que importante...

Lo explico con un ejemplo...
niño nacido el 28/02/18.... aplicando ambas rutinas... sale 1MES Y 17 DIAS... cuando de verdad tiene 1MES Y 20 DÍAS...
creo que la forma de calcularlo es sabiendo los días que tiene el mes anterior AL QUE ESTAMOS ya que el niño ya cumplió "meses" el 28 anterior (marzo) y sólo queda saber los días transcurridos desde el mes anterior al que estamos ... del 28 de marzo al 17 de abril... (3 dias de marzo y 17 de abril)...

me he enrollado...?? :ucrazy:

voy a intentar hacerlo... pero... no prometo nada.... :knock:

Creo que se solucionaría así...

Código: Seleccionar todo

  If (Month(Now())-1) =1 or (Month(Now())-1) =3 or (Month(Now())- 1) =5 or (Month(Now())-1) =7 or (Month(Now())-1) =8 or (Month(Now())-1) =10 or (Month(Now())-1) =12 Then
           lonMes=31
           End if
           If (Month(Now())-1) =4 or (Month(Now())-1)  =6 or (Month(Now())-1) =9 or (Month(Now())-1) =11 Then     
           lonMes=30
           End if
           If (Month(Now())-1) =2 Then
           lonMes=28
           End if


o sea calculando según los días del mes anterior (de ahí lo de "-1")...

la Subrutina quedaría así...

Código: Seleccionar todo

REM ---------------------------------- SUPER  MACRO BY LONGI... -----------------------------------------------	
sub CalculaEdad( Evento) As String
Dim sResultado As String
Dim oForm As Object


      oForm=Evento.Source.Model.Parent                    
      Fecha = CDate(oForm.getByName("FechaNac").Boundfield.String )
      A= year(NOW())-Year(Fecha)
      M= Month(Now())-Month(Fecha)
      D= Day(Now())-Day(Fecha)
      
      msgbox D
      
    '    If Month(Now())=2 or Month(Fecha)=2 Then
    '    lonMes=28
    '    else
    '    lonMes=30
    '    End if
    
     If (Month(Now())-1) =1 or (Month(Now())-1) =3 or (Month(Now())- 1) =5 or (Month(Now())-1) =7 or (Month(Now())-1) =8 or (Month(Now())-1) =10 or (Month(Now())-1) =12 Then
           lonMes=31
           End if
           If (Month(Now())-1) =4 or (Month(Now())-1)  =6 or (Month(Now())-1) =9 or (Month(Now())-1) =11 Then     
           lonMes=30
           End if
           If (Month(Now())-1) =2 Then
           lonMes=28
           End if


      
      
      
      If D<0 Then
      D=LonMes+D
      M= m-1
      END IF
      If M<0 Then
      M=12+M
      A=A-1
      End if
     
      If A<1 or A>1 Then
      alfa= " años, "
      Else
      alfa= " año, "
      End if

      If M<1 or M>1 Then
      Beta= " meses y "
      Else
      Beta= " mes y "
      End if
       
       If D<1 or D>1 Then
      Gamma= " días."
      Else
      Gamma= " día."
      End if

    sResultado = A & alfa & M & Beta & D & Gamma      
      
         	oCtrl = oForm.getByName("txtEdad")                                                        ' Control Edad
        	oCtrl.BoundField.UpdateString(sResultado) 

IF A >13 then
oCtrl.BackgroundColor = RGB(247,255,0) 									'Ponemos en Amarillo si es mayor de 13 años
else
oCtrl.BackgroundColor = RGB(255,204,153)								' Ponemos de fondo el color predeterminado (Naranja10)
end if

End sub


sólo falta probarlo... :alarm:
Última edición por HSEGROD el Mar Abr 17, 2018 1:11 pm, editado 1 vez en total.
Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: [RESUELTO] Edad (años, meses y días) y Fecha/Hora de Al

Mensaje por Longi »

Mi lucidez se fue al traste con el tema de intentar tener en cuenta el mes en el que restar, y apuntas casi bien, pero no del todo, creo yo. El mes que hay que tener en cuenta es el de la fecha de hoy, y no el de la fecha de nacimiento, además de variar la cantidad de días en el mes (equivalente a lo de restar un uno).

Te dejo este otro parche:

Código: Seleccionar todo

      If Month(Now)=1 or Month(Now)=3 or Month(Now)=5 or Month(Now)=7 or Month(Now)=8 or Month(Now)=10 or Month(Now)=12 Then
      lonMes=30
      End if
      If Month(Now)=4 or Month(Now)=6 or Month(Now)=9 or Month(Now)=11 Then      
      lonMes=31
      End if
    
      If Month(Now)=2 Then
      lonMes=28
      End if
Con este cambio el problema sería en el año bisiesto, pero para los registros que se generen ese año, con lo que habría que cambiar a 29 en ese año en concreto.
Sigue probando a ver cómo va, pero por el momento yo le quitaría el resuelto al hilo.

Otro saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: [RESUELTO] Edad (años, meses y días) y Fecha/Hora de Al

Mensaje por HSEGROD »

Dije una cosa pero... al probar me di cuenta de lo que JUSTAMENTE tú también apuntas... por lo que he puesto " Month(Now())-1 "

estoy probando... ya comentaré.. pero... APUNTA A CORRECTO...


y ya que estamos.... solventará lo siguiente a LOS AÑOS BISIESTOS??

Código: Seleccionar todo

               If (Month(Now())-1) =1 or (Month(Now())-1) =3 or (Month(Now())- 1) =5 or (Month(Now())-1) =7 or (Month(Now())-1) =8 or (Month(Now())-1) =10 or (Month(Now())-1) =12 Then
           lonMes=31
           End if
           If (Month(Now())-1) =4 or (Month(Now())-1)  =6 or (Month(Now())-1) =9 or (Month(Now())-1) =11 Then     
           lonMes=30
           End if
       REM --------------- Intentando solventar si es año bisiesto... duradero hasta el año 2027 -------------------------------   
           If (Month(Now())-1) =2 Then
        	  IF Year(now()) = 2020 or Year(now())= 2024 then
          	  lonMes = 29
                else
                  lonMes=28
                  End if
	   End If

      
Última edición por HSEGROD el Mar Abr 17, 2018 3:51 pm, editado 1 vez en total.
Apache OpenOffice 4.1.5 -- Windows 10
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: [RESUELTO] Edad (años, meses y días) y Fecha/Hora de Al

Mensaje por RMG »

Hola,

Una idea para solucionar el año bisiesto.

En la condición si el mes es 2 poner si el año es divisible por 4 o sea resto cero igual a 29 si no 28.

Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: [RESUELTO] Edad (años, meses y días) y Fecha/Hora de Al

Mensaje por HSEGROD »

También lo había pensado pero... eso si que no sé realizarlo... seguro que hay que utilizar INT o algo parecido.. pero no sé... de todas maneras... no se comprobará hasta el 2020 (proximo año bisiesto) a no ser que forzemos a la maquina a que piense que ya estamos en ese año Now() = 2020
Apache OpenOffice 4.1.5 -- Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: [RESUELTO] Edad (años, meses y días) y Fecha/Hora de Al

Mensaje por Longi »

Solución 'refinitiva' al bisiesto (salvo error, por supuesto!)
Como se da por sentado, el código no es mío, el autor parece ser Ju@nK 2009 http://www.juank.es( aunque el enlace es muy posible que esté obsoleto, pero es la única referencia que encontré). El código original es en BVA, y lo adapté a lo que estamos usando. Lo encontré googleando.
Un bisiesto no es solo si es divisible por 4, tiene que serlo por 400 o bien divisible 4 y a la vez no divisible por 100:

Código: Seleccionar todo

           If (Month(Now())-1) =2 Then
              oSFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
              Fun  = oSFA.callFunction( "MOD", Array(Year(Now()),4))
              Fun1 = oSFA.callFunction( "MOD", Array(Year(Now()),100))
              Fun2 = oSFA.callFunction( "MOD", Array(Year(Now()),400))

              if Fun2=0 or (Fun=0 and Fun1<>0) Then
              lonMes = 29
              Else
              lonMes=28
              End if
          End If
A ver si lo acabamos entre todos de una vez!

Otro saludo! ;)

Pd, el enlace para el código en BVA es https://es.wikibooks.org/wiki/Algoritmo_bisiesto
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
HSEGROD
Mensajes: 53
Registrado: Mié Mar 14, 2018 4:25 pm

Re: [RESUELTO] Edad (años, meses y días) y Fecha/Hora de Al

Mensaje por HSEGROD »

Pues ... por fin... ya implementado...
No puedo saber exactamente (no sé, mas bien) si funciona... lo que sí sé es que NO AFECTA (o no cambia) los valores de las edades ya introducidas... por lo que deduzco que se sigue cogiendo como número de dias del mes de Febrero como 28 y no 29.

Editado... 18/04/2018-------------
Hoy me he levantado inspirado... por lo que como no me convencía poner edades como "0 años y 3 meses." o como "2 años, 0 meses y 3 días." he logrado hacerlo (ver macro)

Código: Seleccionar todo


sub CalculaEdad( Evento) As String
Dim sResultado As String
Dim oForm As Object


      oForm=Evento.Source.Model.Parent                    
      Fecha = CDate(oForm.getByName("FechaNac").Boundfield.String )
      A= year(NOW())-Year(Fecha)
      M= Month(Now())-Month(Fecha)
      D= Day(Now())-Day(Fecha)
      
    
           If (Month(Now())-1) =1 or (Month(Now())-1) =3 or (Month(Now())- 1) =5 or (Month(Now())-1) =7 or (Month(Now())-1) =8 or (Month(Now())-1) =10 or (Month(Now())-1) =12 Then
           lonMes=31
           End if
           If (Month(Now())-1) =4 or (Month(Now())-1)  =6 or (Month(Now())-1) =9 or (Month(Now())-1) =11 Then     
           lonMes=30
           End if
       REM --------------- Intentando solventar si es año bisiesto... duradero hasta el año 2027 -------------------------------   
     '      If (Month(Now())-1) =2 Then
     '   	  IF Year(now()) = 2020 or Year(now())= 2024 then
     '     	  lonMes = 29
     '           else
     '         lonMes=28
     '         End if
	 '		End If

		REM ------------------------------------------ Otra Forma de Solucionar Años Bisiestos (Adapatación BY LONGI) ---------------------
 		If (Month(Now())-1) =2 Then
              oSFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
              Fun  = oSFA.callFunction( "MOD", Array(Year(Now()),4))
              Fun1 = oSFA.callFunction( "MOD", Array(Year(Now()),100))
              Fun2 = oSFA.callFunction( "MOD", Array(Year(Now()),400))

              if Fun2=0 or (Fun=0 and Fun1<>0) Then
              lonMes = 29
              Else
              lonMes=28
              End if
          End If

      
      If D<0 Then
      D = lonMes - Day(Fecha) + Day(Now())
      M= m-1
      END IF
      If M<0 Then
      M=12+M
      A=A-1
      End if
     
      If A<1 or A>1 Then
      alfa= " años"
      Else
      alfa= " año"
      End if

      If M<1 or M>1 Then
      Beta= " meses"
      Else
      Beta= " mes"
      End if
       
       If D<1 or D>1 Then
      Gamma= " días."
      Else
      Gamma= " día."
      End if

	REM ---------- QUITANDO LOS VALORES CEROS ---------------------

	IF A = 0 And M = 0 and D > 0 then sResultado =  D & Gamma      
	IF A = 0 And M > 0 and D = 0 then sResultado =  M & Beta & "." 
	IF A > 0 And M = 0 and D = 0 then sResultado =  A & alfa & "."
	IF A > 0 And M > 0 and D = 0 then sResultado =  A & alfa & " y " & M & Beta & "."
	IF A > 0 And M = 0 and D > 0 then sResultado =  A & alfa & " y " & D & Gamma
	IF A = 0 And M > 0 and D > 0 then sResultado =  M & Beta & " y " & D & Gamma
	IF A > 0 And M > 0 and D > 0 then sResultado =  A & alfa & ", " & M & Beta & " y " & D & Gamma


           	oCtrl = oForm.getByName("txtEdad")                              ' Control Edad
        	oCtrl.BoundField.UpdateString(sResultado) 

	IF A >13 then
	oCtrl.BackgroundColor = RGB(247,255,0) 									'Ponemos de fondo Amarillo si es mayor de 13 años
	else
	oCtrl.BackgroundColor = RGB(255,204,153)								'Ponemos de fondo el color predeterminado (Naranja10)
	end if

End sub
Así que... ahora si que lo doy como RESUELTO, pero no me perdáis de vista, que acabo de empezar con los informes y SEGURAMENTE os necesitaré a tod@s... :lol: :lol:

Gracias por vuesta valiosa ayuda....

Adjunto Base Final (lo de FINAL , es un decir.. jjj).

Saluditos... :bravo: :bravo:
Adjuntos
DragoOpenOffice.7z
(108.86 KiB) Descargado 261 veces
Apache OpenOffice 4.1.5 -- Windows 10
Responder