FoxPro/Visual FoxPro - RESTAR FECHAS

   
Vista:

RESTAR FECHAS

Publicado por sebastian (244 intervenciones) el 13/09/2010 17:20:57
Hola programadores necesito restar dos fechas pero que me muestre los meses si es posible tambien los dias, por ejemplo 01/05/2010 - 02/09/2010 = 4 M, 1 D. Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:RESTAR FECHAS

Publicado por es_binario (757 intervenciones) el 13/09/2010 18:26:03
Aqui esta un link, directamente no esta lo que deseas pero te dice cuantos dias tiene un mes y asi tu recorres los meses que hay entre tus 2 fechas y despues le pones los dias adicionales, asi de facil, tendras que pensarle un poco pero nada que no puedas resolver.

el link de las funcones.
http://www.portalfox.com/index.php?name=News&file=article&sid=1162&mode=nested&order=0&thold=0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:RESTAR FECHAS

Publicado por Juanma Cruz (508 intervenciones) el 13/09/2010 19:21:24
Que tal una funcion como:

Function MesesDias
Lparameters Alfa, Omega
Local nMeses as Integer, nResto as Integer, cResultado as String
Store 0 to nMeses, nResto
Store "" to cResultado
Do while Gomonth(alfa,1)<omega
nMeses= nMeses+1
alfa= Gomonth(alfa,1)
EndDo
nResto= Omega-Alfa
Text to cResultado textmerge noshow pretext 7
<<Alltrim(Str(nMeses,10,0))>>M <<Alltrim(Str(nResto,10,0))>>D
EndText
Return (cResultado)


Donde

Alfa: Fecha Inicial
Omega= Fecha final

Devuelve una cadena de texto con los meses y días.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:RESTAR FECHAS

Publicado por VICTOR PEREZ (278 intervenciones) el 16/09/2010 02:18:40
Me parece fantastico la funcion de JuanMa Cruz. Ya la probe y me funciono bien, claro que cambie lo de TEXT EndTEXT pues no me mostraba el resultado.

Yo uso una rutina para calcular la EDAD de mis pacientes. Tengo pacientes desde 7 dias hasta muchos años.

Esta es mi rutina

EDAD=0
edad1=0

EDAD= ((DATE() - m.nacimiento)/ 365.25)

If INT(edad) < 1
edad1 = (edad * 12)
endif


if edad1 <>0
if int(edad1)=0
edad1=edad*365.25
sedad= ltrim(str(int(edad1))) + " DIAS"
else
sedad= ltrim(str(INT(edad1))) + " MESES "
endif
endif

IF INT(EDAD) >= 1 .AND. INT(EDAD) <= 5
IF (EDAD - INT(EDAD)) = 0
sedad= ltrim(str(INT(edad))) + " AÑOS "
ENDIF

IF INT((EDAD - INT(EDAD)*5)) <>0

IF (INT((EDAD - INT(EDAD))*12)) > 1
sedad= ltrim(str(INT(edad))) + " " + LTRIM(STR(INT((EDAD - INT(EDAD))*12))) + "/12 AÑOS"
ELSE
IF INT(EDAD) = 1
sedad= ltrim(str(INT(edad))) + " AÑO"
ELSE
sedad= ltrim(str(INT(edad))) + " AÑOS"
ENDIF
ENDIF

ELSE
sedad= ltrim(str(INT(edad))) + " Y " + LTRIM(STR(INT((EDAD - INT(EDAD))*12*30))) + " DIAS"
ENDIF

ELSE
if int(edad) >= 5
sedad= ltrim(str(INT(edad))) + " AÑOS"
endif
ENDIF

Donde m.nacimiento es la fecha de nacimiento del paciente tomado del formulario donde se introducen los datos de los nuevos pacientes.

Esta rutina la coloco en el evento LostFocus del campo nacimiento. Y la informacion se guarda en la variable "sedad".

Claro que este programita lo hice para mi clinica porque me interesa conocer si es mayor de "X" años la edad en Años. Si es menor de "X" años la Edad en Años y meses ...y si es menor de 1 año la edad en meses.

Prueba poniendo varias fechas de nacimiento y veras los resultados...

Saludos,.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:RESTAR FECHAS

Publicado por Juanma Cruz (508 intervenciones) el 16/09/2010 11:02:57
¡¿Cómorrrr que no el Text /EndText no te daba resultado?! La acabo de probar y funciona, jejeje.

Claro, como la definí como función, no funciona por sí sola, devuelve un resultado.

Así puedes usarla dentro de un programa, tantas veces como sea necesario, dándole los parámetros que gustes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:RESTAR FECHAS

Publicado por victor perez (278 intervenciones) el 17/09/2010 01:07:57
HOla,

Creo que fue un error mio al implementar la funcion directa. Es decir, no usarla como funcion , sino como un PRG.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:RESTAR FECHAS

Publicado por VICTOR PEREZ (278 intervenciones) el 16/09/2010 02:18:41
Me parece fantastico la funcion de JuanMa Cruz. Ya la probe y me funciono bien, claro que cambie lo de TEXT EndTEXT pues no me mostraba el resultado.

Yo uso una rutina para calcular la EDAD de mis pacientes. Tengo pacientes desde 7 dias hasta muchos años.

Esta es mi rutina

EDAD=0
edad1=0

EDAD= ((DATE() - m.nacimiento)/ 365.25)

If INT(edad) < 1
edad1 = (edad * 12)
endif


if edad1 <>0
if int(edad1)=0
edad1=edad*365.25
sedad= ltrim(str(int(edad1))) + " DIAS"
else
sedad= ltrim(str(INT(edad1))) + " MESES "
endif
endif

IF INT(EDAD) >= 1 .AND. INT(EDAD) <= 5
IF (EDAD - INT(EDAD)) = 0
sedad= ltrim(str(INT(edad))) + " AÑOS "
ENDIF

IF INT((EDAD - INT(EDAD)*5)) <>0

IF (INT((EDAD - INT(EDAD))*12)) > 1
sedad= ltrim(str(INT(edad))) + " " + LTRIM(STR(INT((EDAD - INT(EDAD))*12))) + "/12 AÑOS"
ELSE
IF INT(EDAD) = 1
sedad= ltrim(str(INT(edad))) + " AÑO"
ELSE
sedad= ltrim(str(INT(edad))) + " AÑOS"
ENDIF
ENDIF

ELSE
sedad= ltrim(str(INT(edad))) + " Y " + LTRIM(STR(INT((EDAD - INT(EDAD))*12*30))) + " DIAS"
ENDIF

ELSE
if int(edad) >= 5
sedad= ltrim(str(INT(edad))) + " AÑOS"
endif
ENDIF

Donde m.nacimiento es la fecha de nacimiento del paciente tomado del formulario donde se introducen los datos de los nuevos pacientes.

Esta rutina la coloco en el evento LostFocus del campo nacimiento. Y la informacion se guarda en la variable "sedad".

Claro que este programita lo hice para mi clinica porque me interesa conocer si es mayor de "X" años la edad en Años. Si es menor de "X" años la Edad en Años y meses ...y si es menor de 1 año la edad en meses.

Prueba poniendo varias fechas de nacimiento y veras los resultados...

Saludos,.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:RESTAR FECHAS

Publicado por Hitiel hitielhb@gmail.com (2 intervenciones) el 06/01/2017 16:34:28
Buen día Juan Ma Cruz

Disculpa mi ignorancia, cómo hago para usar tu función ?

Yo ya tengo capturada la fecha en el formulario y el text donde debo mostrar la edad pero no se como implementarlo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:RESTAR FECHAS

Publicado por Fidel José (365 intervenciones) el 06/01/2017 23:15:06
Hitiel
Como ya pasaron casi seis años de la respuesta de Juan Cruz, te propongo otra.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
* Alternativa para un método de Usuario del form
LOCAL ldFecha_Nacimiento,loGet as Object
ldFecha_nacimiento = Thisform.Text1.Value
IF !EMPTY(m.ldFechaNacimiento)
	loGet = Get_Edad(m.ldFecha_Nacimiento)
	IF !loGet.Error
		thisform.txt_Edad.Value = loGet.str_large
		thisform.txt_Birthday.Value = loGet.BirthDay
	ENDIF
	loGet = null
ENDIF
 
* Alternativa para Valid/LostFocus del TextBox de INgreso
LOCAL loGet As Object
IF !EMPTY(this.value)
	loGet = Get_Edad(This.Value)
	IF !loGet.Error
		thisform.txt_Edad.Value = loGet.str_large
		thisform.txt_Birthday.Value = loGet.BirthDay
	ENDIF
	loGet = null
ENDIF

Esta es la función.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
PROCEDURE Get_Edad
*!* -----------------------------------------------
*!* Parameteres
*!*	td_Inf es la fecha inferior
*!*	td_sup es la fecha superior o Date() (default)
*!* -----------------------------------------------
*!*	Devuelve un objeto con las propiedades:
*!*		Dias
*!*		Meses
*!*		Anios
*!*		Str_large
*!*		Str_ml
*!*		Str_short
*!*		BirthDay
*!* -----------------------------------------------
*!*	Envió y respuesta
*!*		loGet = get_Edad(DATE(1971,2,28) )
*!*		IF !loResp.Error
*!*			? loGet.Str_Large
*!* 		? loGet.BirthDay
*!*		ENDIF
*!*		loGet = null
*!* -----------------------------------------------
LPARAMETERS td_Inf,td_sup
TRY
	LOCAL lnAnios,;
		lnDias,;
		lnMeses,;
		lnAnio_Calc,;
		lnMes_Calc,;
		lnDias_Inf,;
		lnDias_Sup,;
		loREsp as Object, ;
		loex AS Exception
 
	loResp = NEWOBJECT("Empty")
	ADDPROPERTY(loResp,"Error",.t.)
 
	IF VARTYPE(m.td_sup)#"D"
		td_sup = DATE()
	ENDIF
	if VARTYPE(m.td_Inf)!="D"
		* Toma el inicio del año de td_sup
		td_Inf = DATE(YEAR(td_sup),1,1)
	endif
 
	* Verifica que td_Inf <= td_Sup
	IF m.td_Inf > m.td_Sup
		ld_Pas = m.td_Inf
		td_Inf = m.td_Sup
		td_Sup = m.ld_Pas
	ENDIF
 
	lnAnios = YEAR(m.td_sup)-YEAR(m.td_Inf) - 1
	lnMeses = 12 - MONTH(m.td_Inf) + MONTH(m.td_sup) - 1
 
	IF m.lnMeses >= DAY(m.td_Sup)
		lnMeses = m.lnMeses + 1
	ENDIF
 
	IF m.lnMeses >= 12
		lnMeses = m.lnMeses - 12
		lnAnios = m.lnAnios + 1
	ENDIF
 
	lnDias_Inf = DAY(m.td_Inf)
	lnDias_Sup = DAY(m.td_sup)
 
	IF m.lnDias_Inf = m.lnDias_Sup
		lnDias = 0
	ELSE
		IF m.lnDias_Sup > m.lnDias_Inf
			lnDias = m.lnDias_Sup - m.lnDias_Inf + 1
		ELSE
			lnMes_Calc = MONTH(m.td_sup)-1
			lnAnio_Calc = YEAR(m.td_sup)
			IF lnMes_Calc = 0
				lnMes_Calc = 12
				lnAnio_Calc = m.lnAnio_Calc - 1
			ENDIF
 
			lnDias = m.lnDias_Sup + DAY(GOMONTH(DATE(m.lnAnio_Calc,m.lnMes_Calc,1),1) - 1) - m.lnDias_Inf
 
		ENDIF
	ENDIF
 
	*<Crear la Respuesta>
 
	ADDPROPERTY(loREsp,"Str_Short", TRANSFORM(m.lnAnios)+" Año" + IIF(m.lnAnios>1,"s "," ");
								+ TRANSFORM(m.lnMeses) +" Mes" + IIF(m.lnMeses>1,"es "," ") )
 
 
	ADDPROPERTY(loREsp,"Str_ml", "<y>"+TRANSFORM(m.lnAnios)+"</y>";
								+"<m>"+TRANSFORM(m.lnMeses)+"</m>";
								+"<d>"+TRANSFORM(m.lnDias)+"</d>")
 
	ADDPROPERTY(loResp,"Str_Large",TRANSFORM(m.lnAnios) + " Año" + IIF(m.lnAnios>1,"s "," ") ;
								+ TRANSFORM(m.lnMeses) + " Mes" + IIF(m.lnMeses>1,"es "," ") ;
								+ TRANSFORM(m.lnDias) + " Día" + IIF(m.lnDias>1,"s "," ") )
 
	ADDPROPERTY(loREsp,"Birthday",DATE(YEAR(DATE()),MONTH(m.td_Inf),DAY(m.td_Inf)))
	IF MONTH(m.td_Inf)=2 AND DAY(m.td_inf) = 29 AND EMPTY(loResp.BirthDay)
		loResp.BirthDay = DATE(YEAR(DATE()),3,1)
	ENDIF
 
	ADDPROPERTY(loResp,"Anios",m.lnAnios)
	ADDPROPERTY(loResp,"Meses",m.lnMeses)
	ADDPROPERTY(loREsp,"Dias", m.lnDias)
 
 
	*</Crear la Respuesta>
 
CATCH TO loex
	loex.UserValue = PROGRAM()
	* ShowError(loex)      && rutina que muestra el error atrapado.
FINALLY
	IF VARTYPE(loex) # "O"
		loResp.Error = .f.
	ENDIF
ENDTRY
REturn loResp
ENDPROC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar