Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определение возраста / 25 сообщений из 187, страница 1 из 8
23.07.2009, 10:38
    #36104822
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Люди помогите плизз
недавно начал программировать на VFP
есть ли функция определение возраста
...
Рейтинг: 0 / 0
23.07.2009, 10:47
    #36104841
homik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Такой функции нет.
В хелпе найдите функции для работы с датами и через них.

З.Ы. Само по себе вычисление возраста - задача нетривиальная.
З.З.Ы . Как вариант, смотрите по ссылке
http://forum.foxclub.ru/read.php?32,177182,321849#msg-321849
...
Рейтинг: 0 / 0
23.07.2009, 11:01
    #36104896
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
homik,

Да я это уже понял, перерыл все что можно, может у кого есть готовая функция!!!
Заранее СПАСИБО!!!!!!
...
Рейтинг: 0 / 0
23.07.2009, 11:24
    #36104968
Определение возраста
Евгений1111homik,

Да я это уже понял, перерыл все что можно, может у кого есть готовая функция!!!
Готовая для кого? Вам же дали ссылку на статью, в которой достаточно ясно расписывается проблема расчета разницы дат. Вы ее прочитали?
...
Рейтинг: 0 / 0
23.07.2009, 11:30
    #36104997
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
[/quot]Готовая для кого? Вам же дали ссылку на статью, в которой достаточно ясно расписывается проблема расчета разницы дат. Вы ее прочитали?[/quot]

да в том то и дело что прочитал и не чего существенного там нет, я и сам могу написать только это куча проверок надо делать, может уже кто то с этим сталкивался и поможет избежать некоторых проблем
...
Рейтинг: 0 / 0
23.07.2009, 11:33
    #36105005
Определение возраста
Евгений1111Готовая для кого? Вам же дали ссылку на статью, в которой достаточно ясно расписывается проблема расчета разницы дат. Вы ее прочитали?[/quot]

да в том то и дело что прочитал и не чего существенного там нет, я и сам могу написать только это куча проверок надо делать, может уже кто то с этим сталкивался и поможет избежать некоторых проблем[/quot]Да этим сталкивались все, кто хоть каким-то боком связан с зарплатой, ЖКХ и т.д. Но у всех разные правила расчета. И потому каждый пишет для себя.
...
Рейтинг: 0 / 0
23.07.2009, 11:39
    #36105026
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
проходящий.Евгений1111Готовая для кого? Вам же дали ссылку на статью, в которой достаточно ясно расписывается проблема расчета разницы дат. Вы ее прочитали?

да в том то и дело что прочитал и не чего существенного там нет, я и сам могу написать только это куча проверок надо делать, может уже кто то с этим сталкивался и поможет избежать некоторых проблем[/quot]Да этим сталкивались все, кто хоть каким-то боком связан с зарплатой, ЖКХ и т.д. Но у всех разные правила расчета. И потому каждый пишет для себя.[/quot]




да я это понимаю, есть ли у кого готовый код очень хотелось бы посмотреть, просто в фоксе я чайник
...
Рейтинг: 0 / 0
23.07.2009, 11:57
    #36105081
homik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Ну раз хотите без кучи проверок и готовый пример то :

ldBirthDay = {^1972-02-01}
Age=Date()-ldBirthDay
? Age/365
...
Рейтинг: 0 / 0
23.07.2009, 12:17
    #36105138
homik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Ну или так, более наглядно :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
ldBirthDay = {^ 1972 - 02 - 01 }
Age=Date()-ldBirthDay
lnFlowYear=Age/ 365 . 2 
lnYears=INT(lnFlowYear)
lnMonth=FLOOR((lnFlowYear-lnYears)* 12 )
lnDay=((lnFlowYear-lnYears)* 12 -FLOOR((lnFlowYear-lnYears)* 12 ))* 29 . 7 
? 
? lnFlowYear
? lnYears," лет",lnMonth," месяцев",lnDay," дней"

Тут надо более точнее определиться с коэф.-ми 365.2 и 29.7
...
Рейтинг: 0 / 0
23.07.2009, 12:20
    #36105147
homik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
или так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ldBirthDay = {^ 1972 - 02 - 01 }
Age=Date()-ldBirthDay
lnFlowYear=Age/ 365 . 2 
lnYears=INT(lnFlowYear)
lnMonth=Floor((lnFlowYear-lnYears)* 12 )
lnDay=Ceiling(((lnFlowYear-lnYears)* 12 -lnMonth)* 29 . 7 )
? 
? lnFlowYear
? lnYears," лет",lnMonth," месяцев",lnDay," дней"
...
Рейтинг: 0 / 0
23.07.2009, 12:27
    #36105174
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
homik
Тут надо более точнее определиться с коэф.-ми 365.2 и 29.7
Коэффициент 365.2 означает, что у вас один високосный год каждые пять лет (включительно). В реальной ситуации, у нас один високосный год на каждые четыре года (включительно). То-есть, коэффициент должен быть 365.25.

Ограничение на этот коэффициент, такое: дата должна быть в пределах 01.03.1900 и 28.02.2100. Дело в том, что 1900 и 2100 годы - невисокосные.

С месяцами хуже. Коэффициента недостаточно.
...
Рейтинг: 0 / 0
23.07.2009, 12:32
    #36105189
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
homikили так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ldBirthDay = {^ 1972 - 02 - 01 }
Age=Date()-ldBirthDay
lnFlowYear=Age/ 365 . 2 
lnYears=INT(lnFlowYear)
lnMonth=Floor((lnFlowYear-lnYears)* 12 )
lnDay=Ceiling(((lnFlowYear-lnYears)* 12 -lnMonth)* 29 . 7 )
? 
? lnFlowYear
? lnYears," лет",lnMonth," месяцев",lnDay," дней"



спасибо только вот если месяц будет не 01 а больше сегодняшнего напр. 11 то месяц получается отрицательное и неправильное значение
...
Рейтинг: 0 / 0
23.07.2009, 12:46
    #36105248
homik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
авторНу раз хотите без кучи проверок и готовый пример то :

А это для чего я написал ?
Напильник в руки и "алга" :)
...
Рейтинг: 0 / 0
23.07.2009, 12:55
    #36105282
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
homikавторНу раз хотите без кучи проверок и готовый пример то :

А это для чего я написал ?
Напильник в руки и "алга" :)

спасибо, сейчас сделаю
...
Рейтинг: 0 / 0
23.07.2009, 14:22
    #36105559
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Евгений1111homikавторНу раз хотите без кучи проверок и готовый пример то :

А это для чего я написал ?
Напильник в руки и "алга" :)

спасибо, сейчас сделаю



вот что получилось

ldBirthDay = {^2008-06-29}
Age=Date()-ldBirthDay
lnFlowYear=Age/365.2
lnYears=INT(lnFlowYear)
lnMonth=Floor((lnFlowYear-lnYears)*12)
IF lnMonth<0 THEN
lnMonth=lnMonth+12
ENDIF
lnDay=Ceiling(((lnFlowYear-lnYears)*12-lnMonth)*29.7)
?
? lnFlowYear
? lnYears," лет",lnMonth," Месяцев",lnDay," дней"
...
Рейтинг: 0 / 0
23.07.2009, 14:52
    #36105649
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Евгений1111
вот что получилось

Хренова получилось.
Погрешность: 5 дней за 100 лет.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CLEAR
ldBirthDay = {^ 1910 . 01 . 01 }
ldStartDay = {^ 2010 . 01 . 01 }

Age=ldStartDay-ldBirthDay
lnFlowYear=Age/ 365 . 2 
lnYears=INT(lnFlowYear)
lnMonth=Floor((lnFlowYear-lnYears)* 12 )
IF lnMonth< 0  THEN 
lnMonth=lnMonth+ 12 
ENDIF
lnDay=Ceiling(((lnFlowYear-lnYears)* 12 -lnMonth)* 29 . 7 )
? 
? lnFlowYear
? lnYears," лет",lnMonth," Месяцев",lnDay," дней"

Поправьте константы, как-минимум.
2001200220032004Среднееянварь3131313131февраль2828282928.25март3131313131апрель3030303030май3131313131июнь3030303030июль3131313131август3131313131сентябрь3030303030октябрь3131313131ноябрь3030303030декабрь3131313131дней в году365365365366365.25дней в месяце30.4166666730.4166666730.4166666730.530.4375
...
Рейтинг: 0 / 0
23.07.2009, 15:12
    #36105720
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
А лучше всего вот так



ldBirthDay = {^2009-02-24}
lnYears=YEAR(DATE())-year(ldBirthDay)
lnMonth=MONTH(DATE())-MONTH(ldBirthDay)
IF lnMonth<0 THEN
lnMonth=lnMonth+12
ENDIF
y=31
f=28
m=31
a=30
_m=31
i=30
_i=31
_a=31
s=30
o=31
n=30
d=31
p=DAY(ldBirthDay)
l=DAY(DATE())
m1=l-p
IF m1>=0 then
lnDay=m1
ENDIF
IF m1<0 then
lnMonth=lnMonth-1
DO CASE
CASE MONTH(ldBirthDay)=1
lnDay=y-p+l
CASE MONTH(ldBirthDay)=2
IF MOD(YEAR(ldBirthDay),4)=0 then
lnDay=f+1-p+l
ELSE
lnDay=f-p+l
ENDIf
CASE MONTH(ldBirthDay)=3
lnDay=m-p+l
CASE MONTH(ldBirthDay)=4
lnDay=a-p+l
CASE MONTH(ldBirthDay)=5
lnDay=_m-p+l
CASE MONTH(ldBirthDay)=6
lnDay=i-p+l
CASE MONTH(ldBirthDay)=7
lnDay=_i-p+l
CASE MONTH(ldBirthDay)=8
lnDay=_a-p+l
CASE MONTH(ldBirthDay)=9
lnDay=s-p+l
CASE MONTH(ldBirthDay)=10
lnDay=o-p+l
CASE MONTH(ldBirthDay)=11
lnDay=n-p+l
CASE MONTH(ldBirthDay)=12
lnDay=d-p+l
ENDCASE
endif
? lnYears," лет",lnMonth," месяцев",lnDay," дней"
...
Рейтинг: 0 / 0
23.07.2009, 15:16
    #36105734
homik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Ну вот непруха.
Не хотел человек проверок. А ему навязывают и навязывают. Непорядок, однако :) :) :)
...
Рейтинг: 0 / 0
23.07.2009, 15:28
    #36105766
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
homikНу вот непруха.
Не хотел человек проверок. А ему навязывают и навязывают. Непорядок, однако :) :) :)


да нет я не то чтобы не хотел проверок, я не хотел их думать и писать, думал может у кого похожее есть- посмотреть чтобы не заморачиваться но все равно пришлось самому всем спасибо
...
Рейтинг: 0 / 0
23.07.2009, 15:33
    #36105777
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
ой строчку одну пропустил!!!!!

ldBirthDay = {^2008-11-23}
lnYears=YEAR(DATE())-year(ldBirthDay)
lnMonth=MONTH(DATE())-MONTH(ldBirthDay)
IF lnMonth<0 THEN
lnMonth=lnMonth+12
lnYears=lnYears-1
ENDIF
y=31
f=28
m=31
a=30
_m=31
i=30
_i=31
_a=31
s=30
o=31
n=30
d=31
p=DAY(ldBirthDay)
l=DAY(DATE())
m1=l-p
IF m1>=0 then
lnDay=m1
ENDIF
IF m1<0 then
lnMonth=lnMonth-1
DO CASE
CASE MONTH(ldBirthDay)=1
lnDay=y-p+l
CASE MONTH(ldBirthDay)=2
IF MOD(YEAR(ldBirthDay),4)=0 then
lnDay=f+1-p+l
ELSE
lnDay=f-p+l
ENDIf
CASE MONTH(ldBirthDay)=3
lnDay=m-p+l
CASE MONTH(ldBirthDay)=4
lnDay=a-p+l
CASE MONTH(ldBirthDay)=5
lnDay=_m-p+l
CASE MONTH(ldBirthDay)=6
lnDay=i-p+l
CASE MONTH(ldBirthDay)=7
lnDay=_i-p+l
CASE MONTH(ldBirthDay)=8
lnDay=_a-p+l
CASE MONTH(ldBirthDay)=9
lnDay=s-p+l
CASE MONTH(ldBirthDay)=10
lnDay=o-p+l
CASE MONTH(ldBirthDay)=11
lnDay=n-p+l
CASE MONTH(ldBirthDay)=12
lnDay=d-p+l
ENDCASE
endif
? lnYears," лет",lnMonth," месяцев",lnDay," дней"
...
Рейтинг: 0 / 0
23.07.2009, 16:08
    #36105897
George1974
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Replace Year With Max(Year(Date()) - Year(Nvl(Birthday,{})) - IIF(Month(Nvl(Birthday,{}))*100+Day(Nvl(Birthday,{})) > Month(Date())*100+Day(Date()),1,0),0) For !Empty(Nvl(Birthday,{}))
...
Рейтинг: 0 / 0
23.07.2009, 16:43
    #36106008
Евгений1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
George1974Replace Year With Max(Year(Date()) - Year(Nvl(Birthday,{})) - IIF(Month(Nvl(Birthday,{}))*100+Day(Nvl(Birthday,{})) > Month(Date())*100+Day(Date()),1,0),0) For !Empty(Nvl(Birthday,{}))

и что это значит, что то я не как не пойму!!!!!!! что то она не работает!!!!!
...
Рейтинг: 0 / 0
24.07.2009, 06:11
    #36106847
fvi
fvi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
FUNCTION Year_month
LPARAMETER tdDate_inp, tdDate_out
LOCAL lcReturn, ldSs, ldDate_flow, lnYear, lnMonth, lcYear, lcMonth

lcReturn = ''
IF tdDate_inp != CTOD("00.00.0000") AND tdDate_out != CTOD("00.00.0000")
ldSs = tdDate_inp
ldDate_flow = ldSs
lnYear = 0
ldSs = GOMONTH(ldSs,12)
DO WHILE( ldSs <= tdDate_out )
ldDate_flow = ldSs
ldSs = GOMONTH(ldSs,12)
lnYear = lnYear + 1
ENDDO

IF lnYear = 0 OR ldSs > tdDate_out
ldSs = ldDate_flow
lnMonth = 0
DO WHILE( ldSs <= tdDate_out )
ldDate_flow = ldSs
ldSs = GOMONTH(ldSs,1)
lnMonth = lnMonth + 1
ENDDO
ENDIF
lnMonth = lnMonth - 1

IF lnYear != 0
IF lnYear >= 10
lcReturn = STR(lnYear,3)
ELSE
lcReturn = STRTRAN(STR(lnYear,3),'0',' ')
ENDIF

DO CASE
CASE SUBSTR(STR(lnYear,3),2,1) = '1' OR SUBSTR(STR(lnYear,3),3,1) = '0'
lcYear = ' лет '

CASE SUBSTR(STR(lnYear,3),3,1) = '1'
lcYear = ' год '

CASE SUBSTR(STR(lnYear,3),3,1) = '0' OR ;
SUBSTR(STR(lnYear,3),3,1) = '5' OR ;
SUBSTR(STR(lnYear,3),3,1) = '6' OR ;
SUBSTR(STR(lnYear,3),3,1) = '7' OR ;
SUBSTR(STR(lnYear,3),3,1) = '8' OR ;
SUBSTR(STR(lnYear,3),3,1) = '9'
lcYear = ' лет '

CASE SUBSTR(STR(lnYear,3),3,1) = '2' OR ;
SUBSTR(STR(lnYear,3),3,1) = '3' OR ;
SUBSTR(STR(lnYear,3),3,1) = '4'
lcYear = ' года '
ENDCASE

lcReturn = lcReturn + lcYear
ENDIF

IF lnMonth != 0
IF lnMonth >= 10
lcReturn = lcReturn + STR(lnMonth,2)
ELSE
lcReturn = lcReturn + STRTRAN(STR(lnMonth,2),'0',' ')
ENDIF

DO CASE
CASE SUBSTR(STR(lnMonth,2),2,1) = '1'
lcMonth = ' месяц'

CASE SUBSTR(STR(lnMonth,2),2,1) = '0' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '5' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '6' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '7' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '8' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '9'
lcMonth = ' месяцев'

CASE SUBSTR(STR(lnMonth,2),2,1) = '2' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '3' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '4'
lcMonth = ' месяца'
ENDCASE

lcReturn = lcReturn + lcMonth
ENDIF

ENDIF

IF lnYear = 0 AND lnMonth = 0
lcReturn = '( Возраст: меньше месяца )'
ELSE
lcReturn = '( Возраст: ' + lcReturn + ' )'
ENDIF

RETURN lcReturn
ENDFUNC
****************************************
...
Рейтинг: 0 / 0
24.07.2009, 12:10
    #36107391
George1974
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Евгений1111George1974Replace Year With Max(Year(Date()) - Year(Nvl(Birthday,{})) - IIF(Month(Nvl(Birthday,{}))*100+Day(Nvl(Birthday,{})) > Month(Date())*100+Day(Date()),1,0),0) For !Empty(Nvl(Birthday,{}))

и что это значит, что то я не как не пойму!!!!!!! что то она не работает!!!!!

Данный код заполнял в таблице поле Year - количество полных лет (т.к. возраст все таки считают в целых годах а не в годах, месяцах, днях, часах, минутах и секундах) в зависимости от даты рождения - Birthday

Попробуй так:

Birthday = {^1974-01-30}
If !Empty(Nvl(Birthday,{}))
Year = Max(Year(Date()) - Year(Nvl(Birthday,{})) - IIF(Month(Nvl(Birthday,{}))*100+Day(Nvl(Birthday,{})) > Month(Date())*100+Day(Date()),1,0),0)
EndIf
?Year
...
Рейтинг: 0 / 0
24.07.2009, 15:52
    #36108210
Tohan_ORA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возраста
Вот мой вариант :-)

Код: plaintext
1.
set procedure to pr_dt
?fdt(date( 2008 , 2 , 29 ))
Код: plaintext
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.
FUNCTION fdt
&&Функция определения возраста 
&&input date{ 1967 , 1 , 29 }
&&output char 'year= ;month= ;days= '
LPARAMETERS dt1 as date
IF EMPTY(dt1)
	RETURN ''
endif

LOCAL y1,m1,d1,dt,dt2,y2,d2,m2,ddd,y,m,d,dm
&&дата рождения
&&dt1 =DATE( 2008 , 2 , 28 ) 
y1=YEAR(dt1)
m1=month(dt1)
d1=DAY(dt1)

&&текущ дата
dt2=DATE()
&&dt2=DATE( 2008 , 2 , 29 )
y2=YEAR(dt2)
m2=MONTH(dt2)

dt=gomonth(dt1, 12 *(y2-y1))

	DO case
	CASE dt2=dt
		y=y2-y1 &&лет
		m= 0  &&месяцев
		d= 0  &&дней
	CASE  dt2>dt
		y=y2-y1
		ddd=GOMONTH(dt,m2-m1)
		
		DO case
		case ddd<dt2
			 m=m2-m1 
			 d=dt2-ddd
		CASE ddd=dt2
			m=m2-m1
			d= 0 
		OTHERWISE
			m=m2-m1- 1 
			d=dt2-GOMONTH(dt,m)
		endcase
		
	
	CASE dt2<dt
		y=y2-y1- 1 
		dt=GOMONTH(dt1, 12 *y)
			IF YEAR(dt)<YEAR(dt2)
				dm=m2+( 12 -MONTH(dt))
			ELSE
				dm=m2-MONTH(dt)
			ENDIF
		
		ddd=GOMONTH(dt,dm)
		DO case
		case ddd>dt2
			 m=dm- 1 
			 ddd=GOMONTH(dt,m)
			 d=dt2-ddd
		CASE ddd=dt2
			m=dm
			d= 0 
		OTHERWISE
			m=dm
			d=dt2-ddd
		endcase	
		
	ENDCASE
	
RETURN 'year='+LTRIM(STR(y))+';month='+LTRIM(STR(m))+';days='+LTRIM(STR(d))
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определение возраста / 25 сообщений из 187, страница 1 из 8
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]