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

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

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

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

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

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

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




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

ldBirthDay = {^1972-02-01}
Age=Date()-ldBirthDay
? Age/365
...
Рейтинг: 0 / 0
Определение возраста
    #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
Определение возраста
    #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
Определение возраста
    #36105174
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
homik
Тут надо более точнее определиться с коэф.-ми 365.2 и 29.7
Коэффициент 365.2 означает, что у вас один високосный год каждые пять лет (включительно). В реальной ситуации, у нас один високосный год на каждые четыре года (включительно). То-есть, коэффициент должен быть 365.25.

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

С месяцами хуже. Коэффициента недостаточно.
...
Рейтинг: 0 / 0
Определение возраста
    #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
Определение возраста
    #36105248
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу раз хотите без кучи проверок и готовый пример то :

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

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

спасибо, сейчас сделаю
...
Рейтинг: 0 / 0
Определение возраста
    #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
Определение возраста
    #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
Определение возраста
    #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
Определение возраста
    #36105734
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот непруха.
Не хотел человек проверок. А ему навязывают и навязывают. Непорядок, однако :) :) :)
...
Рейтинг: 0 / 0
Определение возраста
    #36105766
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
homikНу вот непруха.
Не хотел человек проверок. А ему навязывают и навязывают. Непорядок, однако :) :) :)


да нет я не то чтобы не хотел проверок, я не хотел их думать и писать, думал может у кого похожее есть- посмотреть чтобы не заморачиваться но все равно пришлось самому всем спасибо
...
Рейтинг: 0 / 0
Определение возраста
    #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
Определение возраста
    #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
Определение возраста
    #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
Определение возраста
    #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
Определение возраста
    #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
Определение возраста
    #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
Определение возраста
    #36134538
pruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я когда-то написал и всегда использовал такую функцию

function years(mdr)
if type('mdr')!='D'.and.type('mdr')!='T'
return 1
endif
local i
*set step on
i=0
i=year(date())-year(mdr)
if month(mdr)>month(date()).or.(day(mdr)>day(date()) .AND. month(mdr)=>month(date()))
i=i-1
endif
return i
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Определение возраста
    #38019660
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений1111, смотрю ваш код для определения возраста по даже рождения, как я понял возраст вычисляется от системной даты, а как сделать так чтобы вместо системной даты можно было использовать дату из таблицы и результат определять просто как целое число, а не как в вашем коде
...
Рейтинг: 0 / 0
Определение возраста
    #38019675
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991 как сделать так чтобы вместо системной даты можно было использовать дату из таблицы
замени date() на свою переменную или поле с нужной датой.
...
Рейтинг: 0 / 0
Определение возраста
    #38019680
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991Евгений1111, смотрю ваш код для определения возраста по даже рождения, как я понял возраст вычисляется от системной даты, а как сделать так чтобы вместо системной даты можно было использовать дату из таблицы и результат определять просто как целое число, а не как в вашем коде

"а как сделать так чтобы вместо системной даты можно было использовать дату из таблицы"
Неужели тут может быть несколько вариантов?

"результат определять просто как целое число, а не как в вашем коде"
Из командного окна попробуй посмотреть на результат и вопрос отпадет.
...
Рейтинг: 0 / 0
Определение возраста
    #38019699
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, заменил он пишет невозможно найти такой объект.

lnYears=YEAR(pacient.dr)-year(ldBirthDay)
lnMonth=MONTH(pacient.dr)-MONTH(ldBirthDay)

вот так пишу показывает -40 лет. у меня есть таблица пациентов там у них дата рождения поле dr. Есть другая таблица где есть поле dat.obsl дата обследования. и вот мне нужно найти сколько лет было пациентам на момент обследования
...
Рейтинг: 0 / 0
Определение возраста
    #38019726
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чтобы просто как целое число выводил оказалось ерунда ))) в конец кода не посмотрел, а там готовый ответ. А как сделать чтобы для пациентов определять возраст на момент даты обследования
...
Рейтинг: 0 / 0
Определение возраста
    #38019739
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

Dima T тебе ж уже ответил
...
Рейтинг: 0 / 0
Определение возраста
    #38019782
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, Вот смотрите пожалуйста: без всяких дней и месяцев просто возраст определить пишу такой код из выше описанного, убрав все остальное. В поле pacient.dr дата рождения 1975.05.28, дата обследования поле sluch.data_2 равно 2012.09.13. пишу так:

Код: sql
1.
lnYears=YEAR(sluch.date_2)-year(pacient.dr)



вроде результат должен быть 37, а выводится 43. Не понимаю с чем это связано в курсоре pacient много таких пациентов, в курсоре sluch тоже много записей. и когда пишу так чтобы в поел agep курсора pacient вывести возрасты пишет объект pacient Не найден

Код: sql
1.
2.
SELECT pacient
pacient.agep=lnYears
...
Рейтинг: 0 / 0
Определение возраста
    #38019813
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
заметил что в курсоре дата идет так 28.05.1975 если в обеих курсорах дата в таком формате тоже мне кажется правильно должен результат выводится, однако не выводит
...
Рейтинг: 0 / 0
Определение возраста
    #38019822
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991IgorNG, Вот смотрите пожалуйста: без всяких дней и месяцев просто возраст определить пишу такой код из выше описанного, убрав все остальное. В поле pacient.dr дата рождения 1975.05.28, дата обследования поле sluch.data_2 равно 2012.09.13. пишу так:

Код: sql
1.
lnYears=YEAR(sluch.date_2)-year(pacient.dr)



вроде результат должен быть 37, а выводится 43. Не понимаю с чем это связано в курсоре pacient много таких пациентов, в курсоре sluch тоже много записей. и когда пишу так чтобы в поел agep курсора pacient вывести возрасты пишет объект pacient Не найден

Код: sql
1.
2.
SELECT pacient
pacient.agep=lnYears [color=red]&& Это ты пытаешься в таблицу записать? REPLACE pacient.agep WITH lnYears или INSERT - я не знаю что у тебя там должно бытть.[/color]



Из командного окна попробуй так:
d1 = {^1975.05.28}
d2 = {^2012.09.13}
?YEAR(d2) - YEAR(d1)
Ну и нужно проверить количество месяцев, а то будет прибавлять лишний год, если ДР еще не наступил
...
Рейтинг: 0 / 0
Определение возраста
    #38019832
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, если в таком формате то верно выводит, а в курсоре у меня дата так идет 28.05.1975 можно сделать чтобы дата была в формате 20.05.1975 или как поступить тут:

lnYears=YEAR(sluch.date_2)-year(pacient.dr)
...
Рейтинг: 0 / 0
Определение возраста
    #38019839
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понял почему 43 выводится и он правильно выводит 43 это оказывается возраст последнего человека она вычисляет. А как для всех пациентов вычислить?
...
Рейтинг: 0 / 0
Определение возраста
    #38019857
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

SCAN
...
ENDSCAN

или SELECT, но нужно связать две таблицы
...
Рейтинг: 0 / 0
Определение возраста
    #38019863
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lnYears хранит одно число и видимо он в конец его прописывает к последнему человеку. попробовал такой вариант тоже для последнего только вычисляет:
Код: sql
1.
REPLACE pacient.agep WITH year(usl.date_in)-year(pacient.dr)


Можно сделать чтобы вычислял возраст для первого например и сразу записывал в поле pacient.agep?
...
Рейтинг: 0 / 0
Определение возраста
    #38019868
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Scan помогло вроде. Сейчас проверю правильно ли обновил записи в курсоре для уверенности
...
Рейтинг: 0 / 0
Определение возраста
    #38019870
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991lnYears хранит одно число и видимо он в конец его прописывает к последнему человеку. попробовал такой вариант тоже для последнего только вычисляет:
Код: sql
1.
REPLACE pacient.agep WITH year(usl.date_in)-year(pacient.dr)


Можно сделать чтобы вычислял возраст для первого например и сразу записывал в поле pacient.agep?

Чем связаны таблицы usl и pacient
...
Рейтинг: 0 / 0
Определение возраста
    #38019917
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, можно связать по полям npolis и spolis, я проверил пару записей вроде правильно возраст определил для пациентов. Вы думаете логически неправильно вычисляет возраст?
...
Рейтинг: 0 / 0
Определение возраста
    #38019919
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот код который вычисляет возраст для всех пациентов:

Код: sql
1.
2.
3.
4.
SCAN
REPLACE pacient.agep WITH year(usl.date_in)-year(pacient.dr)
LOOP
ENDSCAN
...
Рейтинг: 0 / 0
Определение возраста
    #38019938
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

Не думаю.
Во-первых зачем LOOP
Во вторых SCAN...ENDSCAN работает по одной выбранной таблице. Поэтому, данные из второй таблицы (pacient) будут браться из одной и той же записи.
...
Рейтинг: 0 / 0
Определение возраста
    #38019947
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, Loop чтобы передать управление обратно Scan. Ну не знаю вроде как правильно вычисляет. Если есть более правильный вариант напиши.
...
Рейтинг: 0 / 0
Определение возраста
    #38019958
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991вот код который вычисляет возраст для всех пациентов:

Код: sql
1.
2.
3.
4.
SCAN
REPLACE pacient.agep WITH year(usl.date_in)-year(pacient.dr)
LOOP
ENDSCAN



Не может этот код правильно вычислять возраст ВСЕХ пациентов, поскольку SCAN делаешь по таблице pacient и при этом из таблицы USL берешь ОДНО И ТО ЖЕ ЗНАЧЕНИЕ. Если только таблицы у тебя не связаны SET RELATION
...
Рейтинг: 0 / 0
Определение возраста
    #38019974
P-232
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: xml
1.
F1

не пробовал?
...
Рейтинг: 0 / 0
Определение возраста
    #38019991
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P-232
Код: xml
1.
F1

не пробовал?

Судя по всему - нет. Там букв много :)
...
Рейтинг: 0 / 0
Определение возраста
    #38020017
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, таблицы никак не связываю.. это курсоры полученные из xml файла. если так оставить тоже наверное ошибки нету потому что в курсоре usl поле data_in вернее год будет всегда одинаковым. помогите разобрать логику другой задачи, вернее это часть этой же задачи. есть таблица Hediag там есть основные поля age, compr и code - это код МКБ. Есть вычисленные возрасты пациентов в поле pacient.age. В курсоре sluch есть три поля ds0,ds1,ds2 это коды МКБ. и в курсоре usl есть поле ds тоже КОД МБК нужно проверить соответствие кода МБК для sluch - случай и для usl - услуга возрасту пациента.

поле age в hediag содержат такие значения 14 может 19 и т.д. а поле compr такие ">=", "<", ">". Для каждого кода МКБ в Hediag поля age и compr имеют свои значения. Не могу понять как проверять соответствие кода МКБ в sluch и usl для возраста.
...
Рейтинг: 0 / 0
Определение возраста
    #38020027
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проверяю два условия, а потом тормозит мозг ((

Код: sql
1.
2.
IF hediag.compr='>='
   IF pacient.agep>=hediag.age
...
Рейтинг: 0 / 0
Определение возраста
    #38020124
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот такой код набросал.. я не до конца понял задачу поэтому как мне кажется этот код должен работать правильно, но он не выводит ничего. хотя все условия учел

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
IF hediag.compr='>='
   IF pacient.agep>=hediag.age
      IF sluch.ds0=hediag.code AND sluch.ds1=hediag.code  AND sluch.ds2=hediag.code
         SELECT * FROM sluch
         ELSE
         MESSAGEBOX("Нету!")
      ENDIF
   ENDIF 
ELSE
Другое условие
...
Рейтинг: 0 / 0
Определение возраста
    #38020154
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991вот такой код набросал.. я не до конца понял задачу поэтому как мне кажется этот код должен работать правильно, но он не выводит ничего. хотя все условия учел

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
IF hediag.compr='>='
   IF pacient.agep>=hediag.age
      IF sluch.ds0=hediag.code AND sluch.ds1=hediag.code  AND sluch.ds2=hediag.code
         SELECT * FROM sluch
         ELSE
         MESSAGEBOX("Нету!")
      ENDIF
   ENDIF 
ELSE
Другое условие



Раз набросал такой код, то наверное, знаешь, что и куда этот код должен выводить?
...
Рейтинг: 0 / 0
Определение возраста
    #38020163
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, код должен выводить те случаи в которых код МКБ не соответствует возрасту пациента. но что-то ничего не выводит ни окно msgbox ни данные селекта
...
Рейтинг: 0 / 0
Определение возраста
    #38020170
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991вот такой код набросал.. я не до конца понял задачу поэтому как мне кажется этот код должен работать правильно, но он не выводит ничего. хотя все условия учел

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
IF hediag.compr='>='
   IF pacient.agep>=hediag.age
      IF sluch.ds0=hediag.code AND sluch.ds1=hediag.code  AND sluch.ds2=hediag.code
         SELECT * FROM sluch
         ELSE
         MESSAGEBOX("Нету!")
      ENDIF
   ENDIF 
ELSE
Другое условие



Ну предположи, что 1-е условие соблюдается, а 2-е - нет. Куда попадешь?
...
Рейтинг: 0 / 0
Определение возраста
    #38020181
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, хм.. этот момент я упустил. я не уверен что логика моего кода правильная. не совсем понял как проверить соответствие
...
Рейтинг: 0 / 0
Определение возраста
    #38020190
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все равно не выводит

IF hediag.compr='>='
if pacient.agep>=hediag.age
IF sluch.ds0=hediag.code AND sluch.ds1=hediag.code AND sluch.ds2=hediag.code
SELECT * FROM sluch
ELSE
MESSAGEBOX("12312")
ENDIF
ELSE
messagebox("11111")
ENDIF
ENDIF
...
Рейтинг: 0 / 0
Определение возраста
    #38020246
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ye/ может так тебе понятней станет почему ничего не выводит. Скорее всего select пустой

WAIT "hediag.compr = " + hediag.compr WINDOW
WAIT "pacient.agep = " + STR(pacient.agep) WINDOW
WAIT "hediag.age = " + STR(hediag.age) WINDOW
WAIT "hediag.code = " + hediag.code WINDOW
WAIT "sluch.ds0 = " + sluch.ds0 WINDOW
WAIT "sluch.ds1 = " + sluch.ds1 WINDOW
WAIT "sluch.ds2 = " + sluch.ds1 WINDOW
IF hediag.compr='>='
IF pacient.agep >= hediag.age
IF sluch.ds0 = hediag.code AND sluch.ds1 = hediag.code AND sluch.ds2 = hediag.code
SELECT * FROM sluch INTO CURSOR MyCursor
SELECT MyCursor
BROWSE
ELSE
MESSAGEBOX("12312")
ENDIF
ELSE
messagebox("11111")
ENDIF
ENDIF[/quot]
...
Рейтинг: 0 / 0
Определение возраста
    #38020260
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, сейчас пытаюсь разобраться. А вообще мой код правильно будет проверять соответствие кода МКБ т.е полей ds0,ds1,ds2 возрасту пациента? так как показано в таблице hediag? я выше описывал пример соответствия в hediag
...
Рейтинг: 0 / 0
Определение возраста
    #38020264
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще одно уточнение в sluch поля Ds0,ds1,ds2 имеют формат Z00.0 а в таблице Hediag поле code имеет формат Z000 без точки. надо еще и это учитывать в моем коде не учитывается т.к. не знаю
...
Рейтинг: 0 / 0
Определение возраста
    #38020273
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

Потому что описываешь мутно: "поле age в hediag содержат такие значения 14 может 19 и т.д. а поле compr такие ">=", "<", ">". "
Понятней нужно делать, потому что у тебя это перед глазами, а здесь ничего не видно. Если у тебя таблица, то и надо приводить таблицу, а не абстрактное перечисление.

age______headiag
14_______?????
19_______?????
...
Рейтинг: 0 / 0
Определение возраста
    #38020295
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, вот таблица и поля курсора пациент и sluch:

create cursor pacient ( ;
id_paс I, ;
vpolis I, ;
spolis C(3), ;
npolis C(16), ;
smo C(5), ;
smo_ogrn C(13), ;
smo_ok C(5), ;
smo_nam C(20), ;
novor I, ;
inogor C(6), ;
fam C(30), ;
im C(30), ;
ot C(30), ;
w I, ;
dr t, ;
fam_p C(30), ;
im_p C(30), ;
ot_p C(30), ;
w_p I, ;
dr_p t, ;
mr C(10), ;
doctype I, ;
docser C(3), ;
docnum I, ;
snils I, ;
okatog I, ;
okatop I, ;
comentz C(10), ;
agep I, ;
adres C(18))




CREATE CURSOR sluch ( ;
id C(12), ;
idcase I, ;
mcod C(6), ;
glpu C(6), ;
spolis C(3), ;
npolis C(16), ;
novor I, ;
usl_ok I, ;
vidpom I, ;
npr_mo I, ;
order I, ;
t_order I, ;
podr C(6), ;
profil I, ;
det I, ;
nhistory I, ;
date_1 t, ;
date_2 t, ;
ds0 C(6), ;
ds1 C(6), ;
ds2 C(6), ;
code_mes1 I, ;
code_mes2 I, ;
rslt I, ;
ishod I, ;
prvs I, ;
iddokt I, ;
os_sluch I, ;
idsp I, ;
ed_col I, ;
tarif I, ;
sumv I, ;
oplata I, ;
sump I, ;
refreason I, ;
sank_mek I, ;
sank_mee I, ;
sank_ekmp I, ;
comentz C(10), ;
inogor C(6), ;
pr_nov I)
...
Рейтинг: 0 / 0
Определение возраста
    #38020301
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, я привел одну строку из hediag чтобы было нагляднее как представлено соответствие кода МКБ возрасту
...
Рейтинг: 0 / 0
Определение возраста
    #38020397
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
с точкой в hediag.code проблем то не возникнет я думаю можно данные вывести в курсор и в курсоре заменить Z000 на Z00.0 при помощи STUFF(). .а вот логику не до конца понял я.
...
Рейтинг: 0 / 0
Определение возраста
    #38021029
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы проверить в таблице hediag первую в первой записи поле age сделал 1, а поле compr=">=" и пишу следующий код:
Тут выбираю в курсор все записи из hediag и поле code из формата Z000 делаю таким Z00.0
Код: sql
1.
2.
3.
4.
5.
6.
SELECT * FROM hediag INTO CURSOR curs1 readwrite
SELECT curs1 
scan
replace curs1.code with STUFF(code,4,0,'.')
loop
endscan



а тут проверяю, если поле compr=">=" если поле pacient.age>=curs1.age то идет проверка кода МКБ они равны в hediag и в курсоре sluch, но результат в курсор cr не выводится и brow не выводит ничего на экран. может в коде у меня логика неправильная?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
IF curs1.compr='>=' 
   if pacient.agep>=curs1.age
      IF sluch.ds0=curs1.code 
         SELECT * FROM sluch  INTO CURSOR cr
         SELECT cr
         brow
      ENDIF 
   ENDIF 
ENDIF
...
Рейтинг: 0 / 0
Определение возраста
    #38021034
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
насколько я понимаю логика проверки соответствия кода МКБ возрасту должна быть такой: нужно проверить равно ли поле hediag.compr например ">=", далее больше ли или равно поле pacient.agep полю hediag.age. Если больше или равно нужно проверить равен ли код МКБ из sluch коду МКБ из hediag.code и если они равны то получается код МКБ из случая соответствует возрасту этого пациента. но что-то программно не получается сделать или не до конца понял логику я
...
Рейтинг: 0 / 0
Определение возраста
    #38021247
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди, у меня такой даже не работает. Почему? Не понятно. в первой записи поле pacient.agep=37 , а поле curs1.age=1, также первая запись поле curs1.compr=">=". Ведь должен по логике выводиться messagebox? что за непонятки?

Код: sql
1.
2.
3.
4.
5.
IF curs1.compr=">="
   if pacient.agep>=curs1.age
 MESSAGEBOX("111")
   ENDIF 
ENDIF 
...
Рейтинг: 0 / 0
Определение возраста
    #38021283
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
if curs1.age=1
messagebox("111")
endif

не работает.. у меня свет вырубился недавно и немного глючить стал fox может быть из-за этого?
...
Рейтинг: 0 / 0
Определение возраста
    #38021334
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991не работаетТекст ошибки где?
курсор curs1 вообще существует или как?
...
Рейтинг: 0 / 0
Определение возраста
    #38021350
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, существует конечно.. текст ошибки нету.. логику задачи до конца понять не могу и возможно я что-то не так пишу в условиях.
...
Рейтинг: 0 / 0
Определение возраста
    #38021362
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991текст ошибки нетуЗначит, curs1.age<>1. Всё логично

Ещё раз можете описать, как связаны таблицы "пациент" и "случай"? Связь "хедиага" с ними вроде бы ясна...
...
Рейтинг: 0 / 0
Определение возраста
    #38021389
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, pacient и sluch можно связать по полям npolis и spolis. Если нужно могу привести все поля из курсорв
...
Рейтинг: 0 / 0
Определение возраста
    #38021422
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, поле age Не пустое, а просто он видимо проверяет весь курсор и на последней записи останавливается. а там age равно 18, но все равно по логике должен был вроде выдать результат. Просто я не понял до конца логику видать.. третий день вожусь((
...
Рейтинг: 0 / 0
Определение возраста
    #38021445
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991, переходим в выделенную тему, так, думаю, лучше будет.
...
Рейтинг: 0 / 0
Определение возраста
    #38022976
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

Включи эту UDF в SELECT:
UDF определения полных лет
Код: plsql
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.
* вх.параметры: дата рождения (формат: дата), дата проверки/обследования (формат: дата)
* результат: количество полных лет (числовой, =>0)
* 1-й параметр не в формате DATA: -1 
* 2-й параметр не в формате DATA: -2 
* 1-й параметр > 2-й параметр: -3 
FUNCTION Full_Years
PARAMETERS Dr, Do
PRIVATE k, d1, cOldDate, cOldCent
IF TYPE("Dr")#'D'
	RETURN -1
ENDIF
IF TYPE("Do")#'D'
	RETURN -2
ENDIF
IF Dr > Do
	RETURN -3
ENDIF
IF DAY(Dr)=29 AND MONTH(Dr)=2 AND MOD(YEAR(Dr),4)=0
* здесь зависит от того, как принято определять возраст в вашей конторе
* некоторые пишут  Dr=Dr+1, но ИМХО, это неправильно
	Dr=Dr-1
ENDIF
cOldDate=SET("DATE")
cOldCent=SET("CENTURY")
SET DATE TO GERMAN
SET CENTURY ON
k=1
d1=LEFT(DTOC(Dr),6)
DO WHILE .T.
	IF CTOD(d1+STR(YEAR(Dr)+k,4)) >= Do
		EXIT
	ELSE
		k=k+1
	ENDIF 
ENDDO
SET DATE TO (cOldDate)
SET CENTURY &cOldCent
RETURN k-1
ENDFUNC

...
Рейтинг: 0 / 0
Определение возраста
    #38023122
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, Сейчас попробую разобраться в вашем коде.

Но у меня возник вопрос.

Написал такой же код для проверки соответствия кода МКБ для случая возрасту пациента вот код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT distinct p.fam,p.im,p.agep as vozrast,sl.ds0 as MKB,sl.ds1 as MKB, sl.ds2 as MKB;
 ,cast(icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age;
   ,alltrim(hediag.compr)=='<=',pacient.agep<=hediag.age;
   ,alltrim(hediag.compr)=='<',pacient.agep<hediag.age;
   ,alltrim(hediag.compr)=='>=',pacient.agep>=hediag.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join sluch sl on p.spolis=sl.spolis and p.npolis=sl.npolis;
left join hediag h on chrtran(alltrim(sl.ds0),'.','')==alltrim(h.code) OR  chrtran(alltrim(sl.ds1),'.','')==alltrim(h.code) OR chrtran(alltrim(sl.ds2),'.','')==alltrim(h.code)



В таблице Hediag специально изменил возраст которому соответствует этот код на 45 лет, у пациента возраст определяется 43 года. Если я правильно понимаю работу этого кода то происходит выборка только тех случаев (случаи она должна выводить) для которых код МКБ соответствует возрасту. Но т.к. я в hediag сделал возраст для кода Z000 45 а у пациента с таким кодом возраст 43. то не должен был этот случай выводиться, но он выводится. Почему так?
...
Рейтинг: 0 / 0
Определение возраста
    #38023160
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для случая тоже самое кстати. А мне нужно чтобы выводились только те случаи или услуги в которых код МКБ соответствует возрасту.
...
Рейтинг: 0 / 0
Определение возраста
    #38023165
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для услуг точнее то же самое
...
Рейтинг: 0 / 0
Определение возраста
    #38023202
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот тут он же как я понимаю вычисляет поле compr равно ли ">=" если да то получается он возраст тоже пациента увеличивает? так что ли?

Код: sql
1.
icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age



так же не должно быть
...
Рейтинг: 0 / 0
Определение возраста
    #38023276
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если можно помогите проверить соответствие кода МКБ таким образом,а то что-то он все коды МКБ выводит: Сначала проверять эти условия, а потом уже вычислять возраст пациентов и проверять соответствие кода МКБ, я тут набросал код но он не выводит ничего

Код: sql
1.
2.
3.
4.
5.
IF hediag.compr='>='
    IF pacient.agep>=hediag.age
        *******
    endif
endif




вот мой код для того случая когда поле compr >=

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
*!*	IF hediag.compr='>='
*!*	   IF pacient.agep>=hediag.age
*!*	      SELECT pacient.fam,sluch.ds0,sluch.ds1,sluch.ds2 ;
*!*	      FROM sluch ;
*!*	      join pacient  on pacient.spolis=sluch.spolis AND pacient.npolis=sluch.npolis;
*!*	      left join hediag h on CHRTRAN(ALLTRIM(sluch.ds1),'.','')==ALLTRIM(h.code)
*!*	      ENDIF 
*!*	ENDIF
...
Рейтинг: 0 / 0
Определение возраста
    #38023282
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

UDF включаешь в .prg-файл, который подключаешь командой SET PROCEDURE.
а в селекте просто вызов: Full_years(<дата_рождения>,<дата_обслед.>).
Результат обрабатываешь с помощью IIF() в том же селекте.
...
Рейтинг: 0 / 0
Определение возраста
    #38023298
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, в селекте во-первых, я не понял как где его писать, а во-вторых, тот код, который мне тут написали кажется выдает все случаи, хотя нужно выводить только те случаи для которых код МКБ соответствует возрасту пациента.

я так понимаю icase Вычисляет выражение и выводит результат.
так вот если писать
Код: sql
1.
icase(alltrim(hediag.compr)=='>=',pacient.agep>hediag.age) 



он проверит является ли поле compr равным ">=" если равен то pacient.age сделает большим или равным hediag.age. Или он не так делает? но в хелпе читал работа этой функции описана так
...
Рейтинг: 0 / 0
Определение возраста
    #38023326
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

плохо читал. Селект ничего не делает, он отбирает записи согласно заданным условиям
...
Рейтинг: 0 / 0
Определение возраста
    #38023339
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я знаю что он выбирает согласно условию. но в том коде который мне тут написали есть icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age

мне интересно что тут он делает? если поле compr='>' pacient.agep>hediag.age. Вот тут разве он не увеличивает возраст пациента?
...
Рейтинг: 0 / 0
Определение возраста
    #38023345
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошу объяснить этот кусок:

Код: sql
1.
2.
3.
4.
cast(icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
...
Рейтинг: 0 / 0
Определение возраста
    #38023360
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

И что ты из этого кода до сих пор не понял?

Выбрать записи, где hediag.compr равно '>' и pacient.agep больше hediag.age
...
Рейтинг: 0 / 0
Определение возраста
    #38023380
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, запутался я.. если так делает. то почему выводится тот случай у которого возраст пациента меньше чем возраст в hediag.age. Я в поле hediag.age прописал 45 для кода Z000, в случаях есть такой случай у которого код равен Z000 и возраст пациента 43. В код, который мне тут выложили и этот случай выводит в результатах. для услуг также
...
Рейтинг: 0 / 0
Определение возраста
    #38023686
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNGВыбрать записи, где hediag.compr равно '>' и pacient.agep больше hediag.ageНет, выберутся все записи. Но там, где pacient.agep больше hediag.age, в последнем поле будет true, а где меньше - false.
...
Рейтинг: 0 / 0
Определение возраста
    #38023687
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991то почему выводится тот случай у которого возраст пациента меньше чем возраст в hediag.ageсм. предыдущий пост.
...
Рейтинг: 0 / 0
Определение возраста
    #38024045
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, А как сделать так чтобы выводились только те записи которые соответствуют возрасту пациента? мне не нужно все выводить.. т.к. эти данные я потом буду выводить в отчет. и нужно вывести только те которые соответствуют возрасту
...
Рейтинг: 0 / 0
Определение возраста
    #38024271
Дима1991tanglir, А как сделать так чтобы выводились только те записи которые соответствуют возрасту пациента? мне не нужно все выводить.. т.к. эти данные я потом буду выводить в отчет. и нужно вывести только те которые соответствуют возрасту
Написать запрос, который использует данный запрос в качестве источника исходных данных.
Будет что-то типа:
Код: sql
1.
Select ... from (select ....) as a where a.logical = .T. 


А в Where указать, что надо отбирать только те записи, где CheckMKB.logical = true
...
Рейтинг: 0 / 0
Определение возраста
    #38024490
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С...кий, т.е написать такой код?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Select sluch.ds0,ds1,ds2
from (;
SELECT distinct p.fam,p.im,p.agep as vozrast,sl.ds0 as MKB,sl.ds1 as MKB, sl.ds2 as MKB;
 ,cast(icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age;
   ,alltrim(hediag.compr)=='<=',pacient.agep<=hediag.age;
   ,alltrim(hediag.compr)=='<',pacient.agep<hediag.age;
   ,alltrim(hediag.compr)=='>=',pacient.agep>=hediag.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join sluch sl on p.spolis=sl.spolis and p.npolis=sl.npolis;
left join hediag h on chrtran(alltrim(sl.ds0),'.','')==alltrim(h.code) OR  chrtran(alltrim(sl.ds1),'.','')==alltrim(h.code) OR chrtran(alltrim(sl.ds2),'.','')==alltrim(h.code)
)
as a where a.logical = .T. 



и он мне будет выводить только те случаи где код МКБ (поля ds0,ds1,ds2) соответствует возрасту пациента?
...
Рейтинг: 0 / 0
Определение возраста
    #38024503
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991, ёшкин кот, ну вникните уже в смысл джойнов, в конце-то концов.

Да и к тому же что вообще за запрос у вас получился (даже если закрыть глаза на безумный джойн с хедиагом):
Код: sql
1.
2.
Select sluch.ds0,ds1,ds2
from (подзапрос) as a where a.logical = .T. 

Алиас подзапроса - "а", никаких других таблиц/курсоров во внешнем запросе нет. Откуда прикажете фоксу брать поле sluch.ds0?
Да и в самом подзапросе нет поля с именем "logical", а вы пытаетесь по нему фильтровать...
...
Рейтинг: 0 / 0
Определение возраста
    #38024865
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, я же с самого начала попросил помочь в запросе, потому что не понял до конца смысл задачи, потом написали тут код с джойнами, но оказалось что он выводит все случаи, но мне нужно чтобы выводились только те для которых код мкб совпадает с возрастом. я бы сам изменил код, но не понял ваш код с джойнами, logical и checkmkb. поэтому прошу подсказать как сделать так чтобы выводились не все случаи а именно те у которых совпадает
...
Рейтинг: 0 / 0
Определение возраста
    #38025054
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да фигнёй вы тут, коллеги, занимаетесь. Если ты прогаммёр, а не тот, кто пишет "я фокс только изучаю", то эту "проблему" немного напрягшись можно решить. Хреново, друзья, что башкой чё то стали мало работать. А стали просить готовые коды, что есть бездарно и неэстетично. Ну ты посиди час-другой, сам сообразишь, как этот алгоритм оформить. Некрасиво программёру такие вещи назойливо просить.
...
Рейтинг: 0 / 0
Определение возраста
    #38025224
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, это не я предложил брать, а Станиславский, который выше написал как сделать. я лишь написал так как он сказал.
...
Рейтинг: 0 / 0
Определение возраста
    #38025231
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сейчас фокса нету под рукой. скажите такой код будет работать как мне надо (т.е выдавать только те случаи для которых код мкб совпадает с возрастом пациента. считается что возраст уже определен на момент выполнения этого куска кода) ??? Это только для случая когда поле compr='>'

Код: sql
1.
2.
3.
4.
5.
6.
if hediag.compr=">"
   if pacient.agep>hediag.age
      select sluch.ds0,sluch.ds1,sluch.ds2 ;
      from sluch sl ;
      join pacient p on p.spolis=sl.spolis and p.npolis=sl.npolis ;
      left join hediag h on chrtran(alltrim(sl.ds0),'.','')==alltrim(h.code) ;
...
Рейтинг: 0 / 0
Определение возраста
    #38026136
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991скажите такой код будет работать как мне надонет.
...
Рейтинг: 0 / 0
Определение возраста
    #38026215
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, Почему нет? представленный тут код, все услуги или случаи выводит. Мне так не нужно чтобы выводилось. Как переделать мне этот код, чтобы выводить только те услуги, в которых соответствует возрасту код мкб

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT distinct u.ds as MKB;
 ,cast(icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age;
   ,alltrim(hediag.compr)=='<=',pacient.agep<=hediag.age;
   ,alltrim(hediag.compr)=='<',pacient.agep<hediag.age;
   ,alltrim(hediag.compr)=='>=',pacient.agep>=hediag.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join usl u on p.spolis=u.spolis and p.npolis=u.npolis;
left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)



или вот я пишу чертов код, но ничего не делает этот код. Уважаемые программисты, почему ничего не делает мой код? и как переделать его?

Код: sql
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.
IF hediag.compr='>'
   IF pacient.agep>hediag.age
      SELECT usl.ds FROM pacient p ;
      join usl u on p.spolis=u.spolis and p.npolis=u.npolis ;
      left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)
   ENDIF 
ELSE
IF hediag.compr='>='
   IF pacient.agep>=hediag.age
      SELECT usl.ds FROM pacient p ;
      join usl u on p.spolis=u.spolis and p.npolis=u.npolis ;
      left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)
   ENDIF 
ELSE
IF hediag.compr='<'
   IF pacient.agep<hediag.age
      SELECT usl.ds FROM pacient p ;
      join usl u on p.spolis=u.spolis and p.npolis=u.npolis ;
      left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)
   ENDIF 
ELSE
IF hediag.compr='<='
   IF pacient.agep<=hediag.age
      SELECT usl.ds FROM pacient p ;
      join usl u on p.spolis=u.spolis and p.npolis=u.npolis ;
      left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)
   ENDIF 
ENDIF
ENDIF
ENDIF 
ENDIF 
...
Рейтинг: 0 / 0
Определение возраста
    #38026232
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991tanglir, Почему нет? представленный тут код, все услуги или случаи выводит. Мне так не нужно чтобы выводилось. Как переделать мне этот код, чтобы выводить только те услуги, в которых соответствует возрасту код мкб
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT distinct u.ds as MKB;
 ,cast(icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age;
   ,alltrim(hediag.compr)=='<=',pacient.agep<=hediag.age;
   ,alltrim(hediag.compr)=='<',pacient.agep<hediag.age;
   ,alltrim(hediag.compr)=='>=',pacient.agep>=hediag.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join usl u on p.spolis=u.spolis and p.npolis=u.npolis;
left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)


Тут написано выбрать все, вот и выбирается все. В поле CheckMKB ты получаешь три значения:
.T. - возраст подходит под условие
.F. - возраст не подходит под условие
.NULL. - неизвестное условие, надо дописать в запрос проверку этого условия
Если тебе надо только где возраст подходит под условие, то выбирай только те записи где CheckMKB = .T.

Дима1991или вот я пишу чертов код, но ничего не делает этот код. Уважаемые программисты, почему ничего не делает мой код? и как переделать его?
Код: sql
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.
IF hediag.compr='>'
   IF pacient.agep>hediag.age
      SELECT usl.ds FROM pacient p ;
      join usl u on p.spolis=u.spolis and p.npolis=u.npolis ;
      left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)
   ENDIF 
ELSE
IF hediag.compr='>='
   IF pacient.agep>=hediag.age
      SELECT usl.ds FROM pacient p ;
      join usl u on p.spolis=u.spolis and p.npolis=u.npolis ;
      left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)
   ENDIF 
ELSE
IF hediag.compr='<'
   IF pacient.agep<hediag.age
      SELECT usl.ds FROM pacient p ;
      join usl u on p.spolis=u.spolis and p.npolis=u.npolis ;
      left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)
   ENDIF 
ELSE
IF hediag.compr='<='
   IF pacient.agep<=hediag.age
      SELECT usl.ds FROM pacient p ;
      join usl u on p.spolis=u.spolis and p.npolis=u.npolis ;
      left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)
   ENDIF 
ENDIF
ENDIF
ENDIF 
ENDIF 


Ты сам-то пробовал осмыслить что написал? Ты проверяешь ОДНУ запись, а потом выбираешь ВСЕ или не выбираешь ни одной.
IF работает с текущей записью таблицы, а SELECT со всей таблицей.

Допиливай первый вариант. Он уже почти рабочий у тебя.
...
Рейтинг: 0 / 0
Определение возраста
    #38026246
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, Если я правильно вас понял, то получается нужно первый вариант использовать как подзапрос в другом запросе который будет делать выборку по условию where checkmkb=.t. ? и должен быть код типа:

select u.ds from (описанный подзапрос) where checkmkb=.t. ?
...
Рейтинг: 0 / 0
Определение возраста
    #38026289
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991нужно первый вариант использовать как подзапрос в другом запросе который будет делать выборку по условию where checkmkb=.t. ?Да.
Или дописать к исходному запросу это же условие, только в секции having.
...
Рейтинг: 0 / 0
Определение возраста
    #38026304
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, Так правильно? Только в результате пустая выборка получается

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT distinct u.ds as MKB;
 ,cast(icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age;
   ,alltrim(hediag.compr)=='<=',pacient.agep<=hediag.age;
   ,alltrim(hediag.compr)=='<',pacient.agep<hediag.age;
   ,alltrim(hediag.compr)=='>=',pacient.agep>=hediag.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join usl u on p.spolis=u.spolis and p.npolis=u.npolis;
left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code) ;
HAVING checkmkb=.t.
...
Рейтинг: 0 / 0
Определение возраста
    #38026312
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если писать просто запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT u.ds as MKB;
 ,cast(icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age;
   ,alltrim(hediag.compr)=='<=',pacient.agep<=hediag.age;
   ,alltrim(hediag.compr)=='<',pacient.agep<hediag.age;
   ,alltrim(hediag.compr)=='>=',pacient.agep>=hediag.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join usl u on p.spolis=u.spolis and p.npolis=u.npolis;
left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code) 



то в результате выводятся все случаи услуг и поле chemkb в котором все значения равны .NULL. почему везде null если есть услуги у которых возраст пациента соответствует коду мкб
...
Рейтинг: 0 / 0
Определение возраста
    #38026314
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991, запрос правильный. Ну а выборка... попробуйте создать таблицы с такими записями, чтобы точно были записи в результате, и выполните запрос на них. Если не получится - эти тестовые таблицы выложите тут.
ЗЫ. а может, splolis/npolis - не числа, а строки? тогда оберните их в аллтрим и сравнивайте с помощью "==".
...
Рейтинг: 0 / 0
Определение возраста
    #38026321
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991то в результате выводятся все случаи услуг и поле chemkb в котором все значения равны .NULL.Значит, что-то с джойном таблицы "хедиаг". Давайте сюда таблицу хедиаг и по паре строк из таблиц "пациент", "услуга" (тех, в которых точно должно быть соответствие).
...
Рейтинг: 0 / 0
Определение возраста
    #38026409
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, spolis и npolis это строки. А на счет hediag в таблице в некоторых случаях поле compr пустое. Может поэтому? таблице hediag нельзя ничего менять.
...
Рейтинг: 0 / 0
Определение возраста
    #38026434
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что-то у меня фокспро глючит не смог удалить ненужные записи из hediag поэтому дам ссылку чтобы скачать архив. Там Hediag,pacient и usl таблицы

Ссылка
...
Рейтинг: 0 / 0
Определение возраста
    #38027003
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А нельзя ли сделать так? Проверить поля hediag.age и hediag.compr. Далее случай 1, если поле compr=">" и возраст пациента больше чем hediag.age, то проверить соответствует ли код МКБ этому возрасту, если да то занести эту услугу в курсор, если нет перейти ко второму случаю?
...
Рейтинг: 0 / 0
Определение возраста
    #38027519
frms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gomo(д_рожд, 12*кол_во_лет) < дата_границы

или

*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION возраст
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PARAMETERS _дат1, _дат2
if _дат2<_дат1
RETURN 'Не верно заданы даты! (Дата рождения должна быть меньше даты определения возраста)'
endif
_gg =YEAR(_дат2) - YEAR(_дат1)
_mm =MONTH(_дат2)- MONTH(_дат1)
_dd =DAY(_дат2) - DAY(_дат1)

IF _dd<0
_mm=_mm-1
ENDIF
IF _mm<0
_gg=_gg-1
_mm=12+_mm
ENDIF

_xxx=IIF(INLIST(VAL(RIGHT(STR(_gg,2),1)),1,2,3,4),"г.","л.")
_gg=IIF(_gg=0,"",STR(_gg,2)+_xxx)
_mm=IIF(_mm=0,"",STR(_mm,2)+"мес.")
_возраст=_gg+' '+_mm
***----------------------------------------------------------------------
IF (ALLT(_возраст)="1мес.".AND._dd<0).OR.EMPTY(_возраст)
_кол_дней=ALLT(STR(_дат2-_дат1))
_назв_д=""
DO CASE
CASE _кол_дней="11".OR._кол_дней="12".OR._кол_дней="13".OR._кол_дней="14"
_назв_д="дней"
CASE SUBSTR(_кол_дней,LEN(_кол_дней))="1"
_назв_д="день"
CASE SUBSTR(_кол_дней,LEN(_кол_дней))="2"
_назв_д="дня"
CASE SUBSTR(_кол_дней,LEN(_кол_дней))="3"
_назв_д="дня"
CASE SUBSTR(_кол_дней,LEN(_кол_дней))="4"
_назв_д="дня"
OTHERWISE
_назв_д="дней"
ENDCASE
_возраст=_кол_дней+_назв_д
ENDIF
RETURN _возраст
...
Рейтинг: 0 / 0
Определение возраста
    #38027845
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выяснилось, что код не совсем правильно проводит выборку. Я оставил в таблице hediag 5-6 записей и в полях compr указал все возможные условия (>,<,>=,<=). Указал возрасты в поле age. Код такой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT u.ds as MKB;
   ,cast(icase(alltrim(hediag.compr)=='>',pacient.agep>hediag.age;
   ,alltrim(hediag.compr)=='<=',pacient.agep<=hediag.age;
   ,alltrim(hediag.compr)=='<',pacient.agep<hediag.age;
   ,alltrim(hediag.compr)=='>=',pacient.agep>=hediag.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join usl u on ALLTRIM(p.spolis)==ALLTRIM(u.spolis) and ALLTRIM(p.npolis)==ALLTRIM(u.npolis);
left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code) 



Когда запускаю программу и нажимаю кнопку для выполнения выборки в результате выводятся все значения а в поле checkmkb везде стоит F. Далее у меня стоит еще одна кнопка, которая отображает услуги, пациентов, и случаи, когда ее нажимаю отображает все и если потом нажать ту же кнопку которая выполняет вышеуказанный код, то в поле Checkmkb уже везде T.
Помогите разобраться в чем причина?
...
Рейтинг: 0 / 0
Определение возраста
    #38027855
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. код не выводит правильно. В hediag есть код МКБ который соответствует пациенту возраст, которого <=1 года, а в таблице пациент у пациента с таким кодом возраст больше чем 1 год. Следовательно в этом поле должен был checkmkb иметь значение F, но он выдает то T то F
...
Рейтинг: 0 / 0
Определение возраста
    #38027862
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверьте у себя пожалуйста.. Вы говорите код почти готовый, но вот так по разному выводит. Выкладываю весь проект и файлы. (Файлы скинуть в корень диска C)
...
Рейтинг: 0 / 0
Определение возраста
    #38027975
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991Проверьте у себя пожалуйста..Проверил.
Вот здесь 13409609 вы писалиДима1991дополнил код tanglir условиями которые вообще могут быть в hegiag.compr получилось так: - так вот, получилось совсем не то, что было изначально.
Вот здесь 13424847 уже я сам сказал
tanglirДима1991, запрос правильный., но ошибся - запрос всё-таки неправильный, просто я тогда не заметил этот косяк (в глаза он не бросается).

Разберитесь с алиасами, и всё станет нормально. Хинт - смотрите мой запрос в той теме, ищите отличия от своего в селект-части.
...
Рейтинг: 0 / 0
Определение возраста
    #38027989
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, В какой теме искать ваш код? можно ссылку? А то столько кодов тут, не разберешь какой из них подходящий. И еще вопрос. Ваш код на который вы указываете правильный или косяк есть?
...
Рейтинг: 0 / 0
Определение возраста
    #38028007
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот ваш код в другой теме:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select p.что_нибудь,u.что_нибудь
 ,cast(icase(alltrim(h.compr)=='>',p.agep>h.age
   ,alltrim(h.compr)=='<=',p.agep<=h.age
   ,.null.
  ) as logical
 ) as CheckMKB
from pacient p 
join usl u on p.spolis=u.spolis and p.npolis=u.npolis
left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code)



вот код, который я изменил под свой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select p.npolis,u.ds ;
 ,cast(icase(alltrim(h.compr)=='>',p.agep>h.age ;
   ,alltrim(h.compr)=='<=',p.agep<=h.age ;
   ,alltrim(h.compr)=='<',p.agep<h.age ;
   ,alltrim(h.compr)=='>=',p.agep>=h.age ;
   ,.null. ;
  ) as logical ;
 ) as CheckMKB ;
from pacient p ;
join usl u on p.spolis=u.spolis and p.npolis=u.npolis ;
left join hediag h on alltrim(u.ds)==chrtran(alltrim(h.code),'.','') 



Но по-прежнему во всех полях выдает F. Вы можете у себя проверить и выложить рабочий код? Уже сколько неделя прошла а я с места не сдвинулся
...
Рейтинг: 0 / 0
Определение возраста
    #38028100
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991Но по-прежнему во всех полях выдает F.А у меня - нет (см. рисунок)
Так что теперь смотрите у себя, я в запросе тоже ничего больше не менял.
Ну, кроме путей к файлам, ибо у вас с путями швах.
И отдельное вам огромное спасибо за кривой рид эвентс - пропишите уже clear events хоть в unload формы, что ли...

Дима1991Ваш код на который вы указываете правильный или косяк есть?Правильный.
Дима1991Уже сколько неделя прошла а я с места не сдвинулсяИ кто в этом виноват?
...
Рейтинг: 0 / 0
Определение возраста
    #38028122
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, а выложите этот проект пожалуйста, а то что-то непонятно. Вроде один и тот же код, только пути разные
...
Рейтинг: 0 / 0
Определение возраста
    #38028161
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Говорю же - менял только запрос, вот он
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT  p.spolis,p.npolis,h.code,p.agep,h.compr,h.age,u.ds as MKB;
   ,cast(icase(alltrim(h.compr)=='>',p.agep>h.age;
   ,alltrim(h.compr)=='<=',p.agep<=h.age;
   ,alltrim(h.compr)=='<',p.agep<h.age;
   ,alltrim(h.compr)=='>=',p.agep>=h.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join usl u on ALLTRIM(p.spolis)==ALLTRIM(u.spolis) and ALLTRIM(p.npolis)==ALLTRIM(u.npolis);
left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code) 

, остальное всё то же самое.
...
Рейтинг: 0 / 0
Определение возраста
    #38028198
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, у меня фокспро глючит кажется жестко.. я ваш код вставил он даже указанные поля не выводит в результат.. Заново создам проект и посмотрю сейчас
...
Рейтинг: 0 / 0
Определение возраста
    #38028473
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да уж когда вывожу одно поле из ds.usl то везде выдает F , а когда ваш код вписал нормально выдает. Да и фокс глючит пришлось заново проект создавать а иначе не выдавал. Теперь если я захожу оставить только те услуги для которых код МКБ не соответствует возрасту пациента я могу написать

Код: sql
1.
HAVING checkmkb=.f.

или
Код: sql
1.
HAVING checkmkb=.t.


и будет выводить только те которые соответствуют или не соответствуют да? checkmkb если False значит не соответствует. так ведь?
...
Рейтинг: 0 / 0
Определение возраста
    #38028486
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обнаружил ошибку.

Вот в таблице hediag код E343 соответствует пациентам у которых возраст < или = 1. У пациента с услугой у которого код Е343 возраст 6 и 15 лет. А в результате выдается эти услуги как те у которых код мкб не соответствует возрасту. А тут в чем загвоздка?

дополнил код tanlir'a прописав после всего
Код: sql
1.
HAVING checkmkb=.f.
...
Рейтинг: 0 / 0
Определение возраста
    #38028494
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991фокс глючит пришлось заново проект создаватьЭто ваш код в каком-то месте глючит.
Дима1991так ведь?да.
...
Рейтинг: 0 / 0
Определение возраста
    #38028503
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой )) или это я запутался))
...
Рейтинг: 0 / 0
Определение возраста
    #38028504
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991Обнаружил ошибку.Хватит уже, а?
авторв таблице hediag код E343 соответствует пациентам у которых возраст < или = 1Это верно.
авторУ пациента с услугой у которого код Е343 возраст 6 и 15 летНу пусть будет такой пациент.
авторА в результате выдается эти услуги как те у которых код мкб не соответствует возрастуИ? если услуга соответствует возрасту менее одного года , то, ясен хрен, для человека с возрастом более одного года она будет признанна неподходящей...
...
Рейтинг: 0 / 0
Определение возраста
    #38028506
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*признана
...
Рейтинг: 0 / 0
Определение возраста
    #38028513
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, Нет вроде ваш код правильный.. У пациента возраст 6 и 15 лет, а код Е343 может услуга с кодом Е343 может быть только у тех пациентов возраст которых <=1 тогда он выводит эти услуги как те у которых код МКБ не соответствует возрасту. Правильно же вроде..
...
Рейтинг: 0 / 0
Определение возраста
    #38028516
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991Обнаружил ошибку.

Вот в таблице hediag код E343 соответствует пациентам у которых возраст < или = 1. У пациента с услугой у которого код Е343 возраст 6 и 15 лет. А в результате выдается эти услуги как те у которых код мкб не соответствует возрасту. А тут в чем загвоздка?

дополнил код tanlir'a прописав после всего
Код: sql
1.
HAVING checkmkb=.f.



А что, разве соответствует?

Heading <= 1
У пациента 6 и 15
...
Рейтинг: 0 / 0
Определение возраста
    #38028517
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, Извиняюсь, сразу не подумал просто. Вам спасибо большое.
...
Рейтинг: 0 / 0
Определение возраста
    #38028670
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно еще один вопрос. Теперь тоже самое пытаюсь сделать для случаев. есть курсор sluch но вместо поля ds в нем три поля ds0,ds1,ds2. Это тоже коды МКБ, которые хранятся в hediag.

Этот же код, переделал под случаи, но он вместо полей ds0,ds1,ds2 использует как мне кажется тоже самое поле usl.ds. и в результате получается тот же результат что и для услуг. Хотя код МКБ тут уже другой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT  p.spolis,p.npolis,h.code,p.agep,h.compr,h.age,sl.ds0 as MKB0,sl.ds1 as MKB1,sl.ds2 as MKB2;
   ,cast(icase(alltrim(h.compr)=='>',p.agep>h.age;
   ,alltrim(h.compr)=='<=',p.agep<=h.age;
   ,alltrim(h.compr)=='<',p.agep<h.age;
   ,alltrim(h.compr)=='>=',p.agep>=h.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join sluch sl on ALLTRIM(p.spolis)==ALLTRIM(sl.spolis) and ALLTRIM(p.npolis)==ALLTRIM(sl.npolis);
left join hediag h on chrtran(alltrim(sl.ds0),'.','')==alltrim(h.code) ;
HAVING checkmkb=.f.
...
Рейтинг: 0 / 0
Определение возраста
    #38028685
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет все работает. такого кода просто не было в hedag. Получилось. Всем спасибо.
...
Рейтинг: 0 / 0
Определение возраста
    #38029620
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, в функциях не разбираюсь я в фокспро вообще.. Ваш код который вычисляет дату, можно сделать так чтобы при выполнении программы она вычисляла возрасты и записывала результат в поле pacient.agep ?

Код: sql
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.
* вх.параметры: дата рождения (формат: дата), дата проверки/обследования (формат: дата)
* результат: количество полных лет (числовой, =>0)
* 1-й параметр не в формате DATA: -1 
* 2-й параметр не в формате DATA: -2 
* 1-й параметр > 2-й параметр: -3 
FUNCTION Full_Years
PARAMETERS Dr, Do
PRIVATE k, d1, cOldDate, cOldCent
IF TYPE("Dr")#'D'
	RETURN -1
ENDIF
IF TYPE("Do")#'D'
	RETURN -2
ENDIF
IF Dr > Do
	RETURN -3
ENDIF
IF DAY(Dr)=29 AND MONTH(Dr)=2 AND MOD(YEAR(Dr),4)=0
* здесь зависит от того, как принято определять возраст в вашей конторе
* некоторые пишут  Dr=Dr+1, но ИМХО, это неправильно
	Dr=Dr-1
ENDIF
cOldDate=SET("DATE")
cOldCent=SET("CENTURY")
SET DATE TO GERMAN
SET CENTURY ON
k=1
d1=LEFT(DTOC(Dr),6)
DO WHILE .T.
	IF CTOD(d1+STR(YEAR(Dr)+k,4)) >= Do
		EXIT
	ELSE
		k=k+1
	ENDIF 
ENDDO
SET DATE TO (cOldDate)
SET CENTURY &cOldCent
RETURN k-1
ENDFUNC
...
Рейтинг: 0 / 0
Определение возраста
    #38029645
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991Jonny540, в функциях не разбираюсь я в фокспро вообще.. Ваш код который вычисляет дату, можно сделать так чтобы при выполнении программы она вычисляла возрасты и записывала результат в поле pacient.agep ?Можно.
Одно небольшое исправление: не ">=",а ">"
Код: sql
1.
IF CTOD(d1+STR(YEAR(Dr)+k,4))  >  Do


Использовать готовую функцию, надеюсь, сможешь?
...
Рейтинг: 0 / 0
Определение возраста
    #38029646
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, в том то и дело что я не умею пользоваться функциями в фокспро, всю жизнь на делфи работал.. недавно только начал с фокспро.
...
Рейтинг: 0 / 0
Определение возраста
    #38029650
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991, 13413986
...
Рейтинг: 0 / 0
Определение возраста
    #38029657
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, там написано что в селекте надо писать, а потом через iif(). а в курсор нельзя вывести возрасты, а в селекте потом просто с полем из курсора работать?

хотел бы так если можно:

ВАШ_КОД
******
*****
в pacient.agep занести вычисленные возрасты
...
Рейтинг: 0 / 0
Определение возраста
    #38029667
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

Откуда брать исх. данные? Некогда весь топик перечитывать.
...
Рейтинг: 0 / 0
Определение возраста
    #38029697
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, возраст должен вычисляться на момент обследования. в курсоре pacient.dr это дата рождения этого пациента, а в услугах поле usl.data_1 это дата обследования. и надо вычислять возраст исходя из ээтого
...
Рейтинг: 0 / 0
Определение возраста
    #38029809
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

Как связаны pacient и usl, формат полей?
...
Рейтинг: 0 / 0
Определение возраста
    #38029818
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, они связаны полями spolis и npolis формат строковый (С)
...
Рейтинг: 0 / 0
Определение возраста
    #38029927
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

Что-то типа этого:
Код: sql
1.
2.
3.
4.
SELECT full_years(pacient.dr, usl.data_1) AS agesp ;  
FROM  paciebt INNER JOIN usl ;
ON  ALLT(pacient.spolis)+ALLT(pacient.npolis) == ALLT(usl.spolis)+ALLT(usl.npolis) ;
INTO CURSOR aaa

Это навскидку, возможно, есть ошибки, проверь.
...
Рейтинг: 0 / 0
Определение возраста
    #38029947
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, Проверил.. оказывается не data_1 а data_in ,но это неважно исправил это и мне выдает ошибку что data_in не найден, а в Курсоре usl есть такое поле

Код: sql
1.
2.
3.
4.
SELECT full_years(pacient.dr, usl.data_in) AS agep ;  
FROM  pacient INNER JOIN usl ;
ON  ALLT(pacient.spolis)+ALLT(pacient.npolis) == ALLT(usl.spolis)+ALLT(usl.npolis) ;
INTO CURSOR aaa
...
Рейтинг: 0 / 0
Определение возраста
    #38029966
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что значит Full_eyars does not exist
...
Рейтинг: 0 / 0
Определение возраста
    #38029971
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Full_eyars.prg does not exist точнее
...
Рейтинг: 0 / 0
Определение возраста
    #38029979
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой ой ой создал файл Full_years.prg и туда вписал функцию определения возраста.. в результирующем курсоре поле agep везде -1 получилось и причем возрастов гораздо много там чем пациентов (количество записей)
...
Рейтинг: 0 / 0
Определение возраста
    #38030002
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991причем возрастов гораздо много там чем пациентов (количество записей)потому что кол-во записей там не равно кол-ву пациентов, оно равно кол-ву записей об услугах, оказанных пациентам (зачем там джойн, по-вашему?).
...
Рейтинг: 0 / 0
Определение возраста
    #38030054
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, а почему везде -1 выдает?
...
Рейтинг: 0 / 0
Определение возраста
    #38030077
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

См. код:
Код: plsql
1.
2.
3.
4.
* результат: количество полных лет (числовой, =>0)
* 1-й параметр не в формате DATA: -1 
* 2-й параметр не в формате DATA: -2 
* 1-й параметр > 2-й параметр: -3 
...
Рейтинг: 0 / 0
Определение возраста
    #38030091
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, у меня в курсорах в таком виде дата 28.05.1975 12:00:00 AM тогда как сделать чтобы при заполнении курсора был формат даты? У меня тип стоит dr T
...
Рейтинг: 0 / 0
Определение возраста
    #38030107
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще такой вопрос, вы выводите вычисленные возрасты в курсор ааа, а можно вывести в тот же курсор pacient в поле agep?
...
Рейтинг: 0 / 0
Определение возраста
    #38030139
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991тогда как сделать чтобы при заполнении курсора был формат датыcast(поле as date)
Дима1991можно вывести в тот же курсор pacient в поле agep?читать про update
...
Рейтинг: 0 / 0
Определение возраста
    #38030189
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, У меня создается курсор

create cursor pacient ( ;
****
****
dr T;
*** )


вместо dr T так что ли писать cast(поле as date) ?? я имел ввиду можно ли сделать при создании тип поля таким какой нужен бл* вычисления
...
Рейтинг: 0 / 0
Определение возраста
    #38030201
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

D, бл*
...
Рейтинг: 0 / 0
Определение возраста
    #38030246
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, о вот сейчас получилось, в курсор ааа выводит возрасты точно такие же как и у меня были, но мне сказали что в моем случае будет плюс минус 1 год. Ваш код все таки и дни и месяца считает и правильнее сформирован. Теперь мне бы хотелось в pacient.agep занести эти возрасты только что-то не получается. Посмотрите мой код, я из usl добавил некоторые поля тоже

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT full_years(pacient.dr, usl.date_in) AS agep, usl.spolis,usl.npolis ;  
FROM  pacient INNER JOIN usl ;
ON  ALLT(pacient.spolis)+ALLT(pacient.npolis) == ALLT(usl.spolis)+ALLT(usl.npolis) ;
INTO CURSOR years

SELECT years
BROWSE

UPDATE pacient SET pacient.agep=years.agep WHERE pacient.spolis=years.spolis AND pacient.npolis=years.npolis
SELECT pacient
BROWSE 
...
Рейтинг: 0 / 0
Определение возраста
    #38030278
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991
Код: sql
1.
UPDATE pacient SET pacient.agep=years.agep WHERE ALLT(pacient.spolis)+ALLT(pacient.npolis) == ALLT(years.spolis)+ALLT(years.npolis)
...
Рейтинг: 0 / 0
Определение возраста
    #38030305
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, он все равно в первой записи делает 37 т.е. возраст первый возраст в курсоре ааа, а потом везде нули.. и в вашем случае и в моем случае так
...
Рейтинг: 0 / 0
Определение возраста
    #38030630
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

Блин, опять я на те же грабли... 12676279

Код: plsql
1.
2.
3.
4.
5.
SELECT years
GO TOP
SCAN
UPDATE pacient SET pacient.agep=years.agep WHERE ALLT(pacient.spolis)+ALLT(pacient.npolis) == ALLT(years.spolis)+ALLT(years.npolis)
ENDSCAN
...
Рейтинг: 0 / 0
Определение возраста
    #38030644
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, мда уж, а я вначале писал scan и go top не написал. Спасибо.
...
Рейтинг: 0 / 0
Определение возраста
    #38034524
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно 1 вопрос по поводу выборки... Я делаю сначала выборку из услуг в один курсор uslugi, затем выборку из случаев во второй курсор sluchai и потом из этих курсоров только нужные поля вывожу в третий курсор otch. А там у меня по два раза повторяются записи т.к. они содержались в первом и во втором курсоре. Можно ли сделать так чтобы в результирующем курсоре OTCH не повторялись записи. DISTINCT не помогает

Код: sql
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.
SELECT  p.spolis as Seriya,p.npolis as NPolisa,p.fam as Surname,p.im as Name,p.ot as Otch,p.w as Pol,h.code,p.agep as paAge,h.compr,h.age,u.date_in as Dateu,u.code_usl as KodUsl,u.ds as KodMKB,u.code_md as KodDoctor;
   ,cast(icase(alltrim(h.compr)=='>',p.agep>h.age;
   ,alltrim(h.compr)=='<=',p.agep<=h.age;
   ,alltrim(h.compr)=='<',p.agep<h.age;
   ,alltrim(h.compr)=='>=',p.agep>=h.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join usl u on ALLTRIM(p.spolis)==ALLTRIM(u.spolis) and ALLTRIM(p.npolis)==ALLTRIM(u.npolis);
left join hediag h on chrtran(alltrim(u.ds),'.','')==alltrim(h.code) ;
HAVING checkmkb=.f. INTO CURSOR uslugi

SELECT  p.spolis,p.npolis,h.code,p.agep,h.compr,h.age,sl.ds0,sl.nhistory as NTalona;
   ,cast(icase(alltrim(h.compr)=='>',p.agep>h.age;
   ,alltrim(h.compr)=='<=',p.agep<=h.age;
   ,alltrim(h.compr)=='<',p.agep<h.age;
   ,alltrim(h.compr)=='>=',p.agep>=h.age;
   ,.null.;
  ) as logical;
 ) as CheckMKB;
from pacient p ;
join sluch sl on ALLTRIM(p.spolis)==ALLTRIM(sl.spolis) and ALLTRIM(p.npolis)==ALLTRIM(sl.npolis);
left join hediag h on chrtran(alltrim(sl.ds0),'.','')==alltrim(h.code) ;
HAVING checkmkb=.f. INTO CURSOR sluchai

SELECT distinct uslugi.seriya,uslugi.npolisa,uslugi.surname,uslugi.Name,uslugi.Otch,uslugi.paAge,uslugi.Pol,uslugi.Dateu,uslugi.KodUsl,uslugi.KodMKB,uslugi.KodDoctor,uslugi.compr,uslugi.age,sluchai.NTalona ;
FROM uslugi,sluchai INTO CURSOR otch
SELECT otch
brow
...
Рейтинг: 0 / 0
Определение возраста
    #38034543
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991чтобы в результирующем курсоре OTCH не повторялись записи. DISTINCT не помогаетЕсли дистинкт не помогает, значит, какие-то поля в этих "одинаковых" записях всё-таки не совпадают.
...
Рейтинг: 0 / 0
Определение возраста
    #38034548
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991
Код: sql
1.
FROM uslugi,sluchai

ОМФГ
это же у вас полный декарт
срочно читать про селект до посинения!
...
Рейтинг: 0 / 0
Определение возраста
    #38034549
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, поля полностью идентичны
...
Рейтинг: 0 / 0
Определение возраста
    #38034553
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что значит декарт? Я такой сленг не понимаю )) скажите пожалуйста по русски
...
Рейтинг: 0 / 0
Определение возраста
    #38034564
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

полное декартово произведение таблиц uslugi и sluchai

за разъяснениями - на куры реляционной алгебры :)
...
Рейтинг: 0 / 0
Определение возраста
    #38034568
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, аа.. понял, а как тогда записать чтобы выборка происходила без повторяющихся записей
...
Рейтинг: 0 / 0
Определение возраста
    #38034571
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

я предполагаю, что вам нужен был union all.
...
Рейтинг: 0 / 0
Определение возраста
    #38034573
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или даже просто union.
...
Рейтинг: 0 / 0
Определение возраста
    #38034602
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что-то не получается: смотрите

Код: sql
1.
2.
3.
4.
5.
(SELECT distinct uslugi.seriya,uslugi.npolisa,uslugi.surname,uslugi.Name,uslugi.Otch,uslugi.paAge,uslugi.Pol,uslugi.Dateu,uslugi.KodUsl,uslugi.KodMKB,uslugi.KodDoctor,uslugi.compr,uslugi.age FROM uslugi) ;
union 
(SELECT sluchai.NTalona FROM sluchai) INTO CURSOR otch
SELECT otch
brow



пишет
Код: sql
1.
Statement is invalid.
...
Рейтинг: 0 / 0
Определение возраста
    #38035131
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991что-то не получается: смотрите

Код: sql
1.
2.
3.
4.
5.
(SELECT distinct uslugi.seriya,uslugi.npolisa,uslugi.surname,uslugi.Name,uslugi.Otch,uslugi.paAge,uslugi.Pol,uslugi.Dateu,uslugi.KodUsl,uslugi.KodMKB,uslugi.KodDoctor,uslugi.compr,uslugi.age FROM uslugi) ;
union 
(SELECT sluchai.NTalona FROM sluchai) INTO CURSOR otch
SELECT otch
brow



пишет
Код: sql
1.
Statement is invalid.



А токи с запятой кто будет ставить?
...
Рейтинг: 0 / 0
Определение возраста
    #38035252
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNGА токи с запятой кто будет ставить?да и скобки тут не нужны...
...
Рейтинг: 0 / 0
Определение возраста
    #38035295
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

две недели уже топик пишешь, бросай ты эту херь, не твое это, нафиг тебе эта казуистика непонятная?
...
Рейтинг: 0 / 0
Определение возраста
    #38035391
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точки с запятыми я ставлю и так. а вот попробовал без скобок другая ошибка появилась

Код: sql
1.
SELECTs are not UNION compatible. Number of fields do not match.



на счет того что не мое.. я только учить начал его.. в университете поверхностно прошли, сейчас заново изучаю
...
Рейтинг: 0 / 0
Определение возраста
    #38035585
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Определение возраста
    #38035595
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, я знаю что поля не совпадают у таблиц, поэтому спросил вначале есть ли какой-нибудь способ не выводить повторяющиеся записи? юнион тоже не помогает судя по всему
...
Рейтинг: 0 / 0
Определение возраста
    #38035628
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё, я пас.
...
Рейтинг: 0 / 0
Определение возраста
    #38035630
Дима1991,
Нужно связать два курсора. Либо через inner join
select ... from uslugi inner join sluchai on uslugi.<field1> = sluchai.<field2> and uslugi.<field2>=sluchai.<fieldN> where...,
либо, по старинке:
select ... from uslugi,sluchai where uslugi.<field1> = sluchai.<field2> and uslugi.<field2>=sluchai.<fieldN> and...
...
Рейтинг: 0 / 0
Определение возраста
    #38035636
Дима1991 я только учить начал его.. в университете поверхностно прошли, сейчас заново изучаю

Совет простой. Возьми книжку по SQL. Можно Грубера "Понимание SQL" и читай до просветления. Ибо Фокс 9.0 поддерживает почти все "примочки" стандарта SQL-92. Когда разберешься со стандартом - только тогда лезь в Фокс!!!
...
Рейтинг: 0 / 0
Определение возраста
    #38035650
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991на счет того что не мое.. я только учить начал его.. в университете поверхностно прошли, сейчас заново изучаю
Без обид. Пишу как думаю.

У тебя реально знаний чуть больше нуля. Совсем чуть-чуть больше. Тебе сначала надо подучится, а потом уже за самостоятельную работу браться. Прочитай книжку какую-нибудь, повыполняй примеры оттуда, разберись как они работают.
Почитай свои топики: "Я так написал, не работает" - "Исправь тут" - "Исправил, не помогло" - "Поставь точку с запятой" ... реально работа под диктовку. Обычно с таким отправляют на форум "работа", чтоб заплатил денег - получил результат.

Тут не курсы для начинающих. Никто тут лекции не читает, подразумевается что человек имеет базовые знания и не может решить конкретную задачу. Таким просто подсказывают направление в котором искать решение - а дальше сам.

Так что сначала тебе надо подучится. Судя по твоей настырности - упорства тебе не занимать :)
Если есть возможность - может где какие курсы читают в институтах, туда попробуй сунуться.

Удачи.
...
Рейтинг: 0 / 0
Определение возраста
    #38035703
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, я знаю что совсем немного знаю. Я вот устроился на работу, когда пришел мне сказали будешь заниматься изучением программного комплекса по медицине типа покупаем новую систему.. Но пока что ничего не купили и мне дают такие задания. Не думал что буду так долго работать с фокспро тут на работе, поэтому пока не купят программу приходится писать на фокс. А на счет SQL в университете на 3-4 курсе мы прошли полностью, но когда не практикуешься забываешь понемногу. Сейчас постепенно восстанавливаю забытое.
...
Рейтинг: 0 / 0
Определение возраста
    #38035908
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991,

Создай свой топик. Зачем в чужой-то все постить?
...
Рейтинг: 0 / 0
Определение возраста
    #38102735
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я возраст определяю красиво - вот так!

FUNCTION vozrast(sd,nk) && sd - Дата рождения, nk - сегодня или произвольная дата но больше sd
LOCAL s_year
s_year=YEAR(nk)-YEAR(sd)
s_year=IIF(GOMONTH(sd,s_year*12)>nk,s_year-1,s_year)
RETURN IIF(s_year<0,0,s_year)

Дарю!
...
Рейтинг: 0 / 0
Определение возраста
    #38144752
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На досуге протестила на скорость определение возраста на 30000 базе.
1.Вариант работал - 1.546 сек.
x=SECONDS()
SCAN
n=0
dr=Drod
DO WHILE dr<=DATE()
dr=GOMONTH(dr,12)
n=n+1
ENDDO
n=n-1 && Возраст
ENDSCAN
messageb(seco()-x)

2.Вариант работал - 0.360
x=SECONDS()
SCAN
n=0
dr=drod
DO WHILE dr<=DATE()
dr=GOMONTH(dr,120)
n=n+10
ENDDO
DO WHILE dr>DATE()
dr=GOMONTH(dr,-12)
n=n-1
ENDDO
n && Возраст
ENDSCAN
MESSAGEB(SECONDS()-x)

3.Вариант - 0.071 сек .
x=SECONDS()
td=DATE()
SCAN
dr=Drod
n=YEAR(td)-YEAR(dr)
n=IIF(GOMONTH(dr,n*12)>td,n-1,n)
n=IIF(n<0,0,n) && Возраст
ENDSCAN
MESSAGEBOX(SECONDS()-x)

и это ещё не предел?
...
Рейтинг: 0 / 0
Определение возраста
    #38144823
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Людмila , то. что скорости так изменяются - ничего удивительного. Вы же заменяте вложенный цикл на вычисление разности

А как вам это
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
x=SECONDS()

td=DATE()
ntd=VAL(DTOC(td,1))

SCAN
 dr=Drod
 n=INT((ntd-VAL(DTOC(dr,1))/1000)
ENDSCAN

MESSAGEBOX(SECONDS()-x)


а также
Код: sql
1.
2.
3.
FUNCTION Age(dBirth, dCurrent)
 RETURN INT((VAL(DTOC(dCurrent,1))-VAL(DTOC(dBirth,1)))/10000)
ENDFUNC
...
Рейтинг: 0 / 0
Определение возраста
    #38144828
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM
Код: sql
1.
 n = INT((ntd-VAL(DTOC(Datar,1)))/10000)
...
Рейтинг: 0 / 0
Определение возраста
    #38144867
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Децл выкраивает DTOS(dExpression) вместо - DTOС(dExpression,1)
...
Рейтинг: 0 / 0
Определение возраста
    #38145234
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4.Вариант от AndreTM - 0.055 сек.! (с DTOS())

Извините! сегодня перекомпилирую все проги.
...
Рейтинг: 0 / 0
Определение возраста
    #38145619
VIVA_CA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините!!! Уважаемая Людмила, просмотрите пожалуйста Ваш запрос "КА и индексация" и если можно ответьте.
...
Рейтинг: 0 / 0
Определение возраста
    #38158172
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ради спортивного интереса в данную Функцию добавила счетчик!
За 7 дней к ней обратилось около 18000! раз
улучшив производительность на 0.02сек - получилось за недалю 6 минут
...
Рейтинг: 0 / 0
187 сообщений из 187, показаны все 8 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определение возраста
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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