FoxPro/Visual FoxPro - ayuda para calcular edad de personas

   
Vista:

ayuda para calcular edad de personas

Publicado por wilmer (14 intervenciones) el 27/01/2014 00:47:29
hola a todos me pueden ayudar

tengo un formulario donde ingreso los datos de una persona y todo eso, ahora lo q necesito es, q en un text1 ingreso la fecha de nacimiento y en text2 me salga la edad de la persona.

como debo hacer la programacion y en donde la ubico

desde ya les agredesco mucho
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

ayuda para calcular edad de personas

Publicado por Fidel José (558 intervenciones) el 27/01/2014 15:37:17
Puedes utilizar esta función (que no es fantástica, pero funciona).

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
PROCEDURE calcedad
LPARAMETERS xdFecha1,xdFecha2
******************************************
*xdFecha1 es la fecha inferior
*xdFecha2 es la fecha superior o Date()  && si se omite, toma la fecha actual
* Devueve un objeto Empty (objresp)
* con 4 propiedades:   Edad (Character) , Años (numeric), Meses (numeric)=, Dias (numeric)
* Si xdFEcha1 > xdFecha2 , devolverá NULL
*****************************************************************************************************
LOCAL nDetanos,nMeses,nDias,cTiempo,;
	cAno,cmes,cdia,zDias1,zDias2,;
	xmMes,xmAno
 
if EMPTY(xdFecha2)
	xdFecha2 =Date()
ENDIF
IF xdFecha1 > xdFecha2
	RETURN null
ENDIF
 
nDetanos =Year(xdFecha2)-Year(xdFecha1) - 1
nMeses =12-Month(xdFecha1) + Month(xdFecha2) - 1
IF DAY(xdFecha2)>=DAY(xdFecha1)
	nMeses=nMeses + 1
ENDIF
 
if nMeses >= 12
	nMeses =nMeses - 12
	nDetanos =nDetanos + 1
endif
 
if Day(xdFecha1)=Day(xdFecha2)
	nDias =0
else
	zDias1 =Day(xdFecha1)
	zDias2 =Day(xdFecha2)
	if Day(xdFecha2) > Day(xdFecha1)
		nDias =Day(xdFecha2)-Day(xdFecha1)
	else
		xmMes =month(xdFecha2)-1
		xmano =Year(xdFecha2)
		if xmMes = 0
			xmMes =12
			xmano =xmano-1
		endif
		*Zfin1 =bisumes(xmMes,xmano)
		DO case
			CASE INLIST(xmMes,1,3,5,7,8,10,12)
				zFin1=31
			CASE INLIST(xmMes,4,6,9,11)
				zFin1=30
			OTHERWISE
				zFin1=IIF(EMPTY(DATE(xmAno,xmMes,29)),28,29)
		ENDCASE
 
		nDias =Zdias2 + Zfin1 - Zdias1
	endif
endif
cano =iif(nDetanos>1," Años "," Año ")
cmes =iif(nmeses>1," Meses "," Mes ")
cdia =iif(ndias>1," Días "," Día ")
cTiempo =Ltrim(str(nDetanos))+cano+ltrim(str(nmeses))+cmes+ltrim(str(ndias))+cdia
 
* Crea el objeto de respuesta
objResp=NEWOBJECT("Empty")
ADDPROPERTY(objResp,"Edad",cTiempo)
ADDPROPERTY(objResp,"Años",nDetAnos)
ADDPROPERTY(objresp,"Meses",nMeses)
ADDPROPERTY(objresp,"Dias",nDias)
REturn objResp

La puedes ubicar donde quieras:
1) un Prg donde tengas otras funciones y procedures
2) una clase custom en una librería vcx (quitando PROCEDURE CALCEDAD)
3) Un método del mismo formulario (quitando PROCEDURE CALCEDAD)

En el evento Valid del TExt1, puedes poner (suponiendo que la función la colocas en un prg que está abierto con SET PROCEDURE TO)

IF NOT EMPTY(THIS.VALUE)
objResp=CalcEdad(this.value)
IF NOT ISNULL(objResp)
This.parent.text2.Value=objResp.Edad
ELSE
Messagebox("Fecha inválida")
RETURN 0
ENDIF
objResp=null
ENDIF
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

ayuda para calcular edad de personas

Publicado por wilmer (14 intervenciones) el 29/01/2014 04:12:19
hola amigo Fidel Jose, por mas que lo intente me sale "argument value type our count" son invalidos a que se debe esto
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

ayuda para calcular edad de personas

Publicado por Fidel José (558 intervenciones) el 29/01/2014 21:29:38
No sé en qué parte te sale el mensaje, pero revisa si el textbox que tiene la fecha tiene un dato tipo Date.
Para eso necesitas configurarlo como sigue:
1) Format="D". Luego
2) Value:
2.1) Si no le asignas un controlsource, entonces .Value=ctod(""). Si esto lo pones en el cuadro de propiedades del textbox, tienes que escribir el signo "=", o sea "=Ctod("")
2.2) Si le asignas una propiedad del formulario como ControlSource, por ejemplo, fecha, en el init de form iría
With thifsorm
.Fecha=Ctod("")
.TxtFEcha.Format="D"
.TxtFecha.ControlSource= "THISFORM.FECHA" && no necesitas configurar valor
ENDWITH

2.3) Si le asignas un controlsource que es un campo de un cursor o tabla, ese campo debe ser tipo "D" (fecha)
With thifsorm
.Fecha=Ctod("")
.TxtFEcha.Format="D"
.TxtFecha.ControlSource= "CursorNombre.FECHA" && no necesitas configurar valor
ENDWITH

De lo contrario, tendrás que transformar el valor, pero no te lo recomiendo porque pueden escribir cualquier cosa. Si lo configuras como Format="D" y Value=Ctod("") o el ControlSource apropiado, podrás establecer en el evento valid los controles que necesites.
Suponte un TxtFecha para ingresar la fecha de nacimiento:

Evento Valid (Ejemplo. No lo copies porque tiene funciones de usuario que tu no tienes, o como en el caso de calcedad() la respuesta en el modelo que te pasé es un objeto)
* Ficha de trabajador. Fecha de Nacimiento.
* aFEcha[2] tiene la cantidad de años de vida.
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
IF !empty(this.value)
	Dimension aFecha(4)
	Calcedad(This.Value,Date(),@aFEcha)
	canos=ltrim(str(afecha[2]))
	if aFecha[2]<14
		if aFecha[2]<0
			cMess="La persona no ha nacido aún y por lo tanto, no podría trabajar"
 
		endif
		if aFecha[2]=0
			cMess="Se trata de un Bebé!!!"
		endif
		if Between(aFecha[2],1,13)
			cMess="Está prohibido el trabajo de menores de 14 años."
		endif
		Messagebox(cMess,0,Th_mensaje)
		This.value=Ctod("")
		REturn 0
	endif
	if between(aFecha[2],14,17)
 
		if Between(aFecha[2],14,15)
			cMess="Podrá trabajar solamente 6 horas diarias."+chr(13);
			+"No se puede emplear en trabajo nocturno."+chr(13);
			+"Necesita Libreta de Trabajo y Autorización del Padre ó Tutor"
		endif
		if Between(aFecha[2],16,17)
			cMess="Menor de 18 años: necesita autorización del Padre ó Tutor"
		endif
		nMess=Messagebox(cMess+chr(13)+"Desea Continuar?",4,Th_mensaje)
		if nMess#6
			This.value=ctod("")
			return 0
		endif
	endif
	if aFecha[2]>130
		Messagebox("Persona de &canos años. Es un Dinosaurio!!!",0,th_mensaje)
		this.value=Ctod("")
		Return 0
	endif
	if aFecha[2] > 100
		MessageBox("Persona mayor de 100 años. Tal vez esté muerto",48,"Verificador")
		this.value=Ctod("")
		Return 0
	endif
	if aFecha[2] > 65
		nMess=MessageBox("Persona de &canos años. Verifique si es jubilado."+chr(13);
			+"Desea continuar?",4,th_mensaje)
		if nmess#6
			This.value=Ctod("")
			Return 0
		endif
	endif
endif
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

ayuda para calcular edad de personas

Publicado por wilmer (14 intervenciones) el 30/01/2014 17:16:23
hola amigo Fidel Jose mil disculpas x no haber explicado bien, ese mensaje me sale cuando empieza a recorrer cada linea de codigo y llega a nDetanos y todas las variables que estan en LOCAL,

nDetanos =Year(xdFecha2)-Year(xdFecha1) - 1 // AQUI ME SALE EL ERROR, A MI PARECE NO RECONOCE LAS V.
nMeses =12-Month(xdFecha1) + Month(xdFecha2) - 1
IF DAY(xdFecha2)>=DAY(xdFecha1)
nMeses=nMeses + 1
ENDIF

A lo mejor estoy mal en esto tal vez me pueder ayudarme a corregir mi error xq esto es nuevo para mi

muchas gracias
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

ayuda para calcular edad de personas

Publicado por Fidel José (558 intervenciones) el 30/01/2014 20:38:04
Reemplaza el código por este, a ver qué te aparece
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
PROCEDURE calcedad
LPARAMETERS xdFecha1,xdFecha2
***************************
*xdFecha1 es la fecha inferior
*xdFecha2 es la fecha superior o Date()
* Devueve un objeto Empty (objresp)
* con 4 propiedades:
* Edad, Años, Meses, Dias
************************************
LOCAL nDetanos,nMeses,nDias,cTiempo,;
	cAno,cmes,cdia,zDias1,zDias2,;
	xmMes,xmAno
IF VARTYPE(xdFEcha1)#"D"
	MESSAGEBOX("El primer parámetro debe ser tipo Date.")
	RETURN null
ENDIF
 
if VARTYPE(xdFecha2)#"D" OR EMPTY(xdFecha2)
	xdFecha2 =Date()
ENDIF
IF xdFecha1 > xdFecha2
	RETURN null
ENDIF
 
nDetanos =Year(xdFecha2)-Year(xdFecha1) - 1
nMeses =12-Month(xdFecha1) + Month(xdFecha2) - 1
IF DAY(xdFecha2)>=DAY(xdFecha1)
	nMeses=nMeses + 1
ENDIF
 
if nMeses >= 12
	nMeses =nMeses - 12
	nDetanos =nDetanos + 1
endif
 
if Day(xdFecha1)=Day(xdFecha2)
	nDias =0
else
	zDias1 =Day(xdFecha1)
	zDias2 =Day(xdFecha2)
	if Day(xdFecha2) > Day(xdFecha1)
		nDias =Day(xdFecha2)-Day(xdFecha1)
	else
		xmMes =month(xdFecha2)-1
		xmano =Year(xdFecha2)
		if xmMes = 0
			xmMes =12
			xmano =xmano-1
		endif
		*Zfin1 =bisumes(xmMes,xmano)
		DO case
			CASE INLIST(xmMes,1,3,5,7,8,10,12)
				zFin1=31
			CASE INLIST(xmMes,4,6,9,11)
				zFin1=30
			OTHERWISE
				zFin1=IIF(EMPTY(DATE(xmAno,xmMes,29)),28,29)
		ENDCASE
 
		nDias =Zdias2 + Zfin1 - Zdias1
	endif
endif
cano =iif(nDetanos>1," Años "," Año ")
cmes =iif(nmeses>1," Meses "," Mes ")
cdia =iif(ndias>1," Días "," Día ")
cTiempo =Ltrim(str(nDetanos))+cano+ltrim(str(nmeses))+cmes+ltrim(str(ndias))+cdia
 
* Crea el objeto de respuesta
objResp=NEWOBJECT("Empty")
ADDPROPERTY(objResp,"Edad",cTiempo)
ADDPROPERTY(objResp,"Años",nDetAnos)
ADDPROPERTY(objresp,"Meses",nMeses)
ADDPROPERTY(objresp,"Dias",nDias)
REturn objResp
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