powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Количество дней до события
25 сообщений из 32, страница 1 из 2
Количество дней до события
    #35963958
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здраствуйте, есть в таблице поле (god_rojd) типа date хранящее дату рождения. Мне нужно узнать разницу в днях между текущей датой и датой рождения, разницу выводить в TextBox.
Все это нужно для установки фильтра, на форме есть кнопка "Показать именинников", при нажатии на кнопку должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней.
Формат даты: SET DATE GERMAN
...
Рейтинг: 0 / 0
Количество дней до события
    #35963967
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Количество дней до события
    #35963969
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где то недавно это обсуждалось :-) На страницы так 2-е, 3-и.
...
Рейтинг: 0 / 0
Количество дней до события
    #35963970
AK-Shah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thisform.txtDateRojd.Value = DATE()-date_rojd
...
Рейтинг: 0 / 0
Количество дней до события
    #35963975
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.sql.ru/forum/actualthread.aspx?tid=649550
...
Рейтинг: 0 / 0
Количество дней до события
    #35964028
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AK-Shah,
твой спосо не канает, потому что тут учитывается год разница между 1988 и 2008 годом составит примерно 7000 дней. в итоге я никогда неполучу при таком способе, что до дня рождения человеку осталось 30 дней.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964059
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GoshaShttp://www.sql.ru/forum/actualthread.aspx?tid=649550
Ненашол там именно для моего случая примера. Я ту тему два раза читал до того как создал свою.
Там промежутки и тд и тп. А мне надо конкретное количество дней до дня рождения. Я недогнал как сделать через промежутки.

Пытался даже:
В данном случае Date() имеет значени 30.04.09, а plan_sotr.god_rojd имеет значение 03.06.1988
thisfotm.text21.value = RIGHT(DTOS(DATE()),4)-RIGHT(DTOS(plan_sotr.god_rojd),4)
При выполнении в текстебоксе получаю: 04300603
...
Рейтинг: 0 / 0
Количество дней до события
    #35964065
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Количество дней до события
    #35964222
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set date german
set century on

? ? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17}))

Ps. до моего дня рождения осталось ....
...
Рейтинг: 0 / 0
Количество дней до события
    #35964237
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisaerЗдраствуйте, есть в таблице поле (god_rojd) типа date хранящее дату рождения. Мне нужно узнать разницу в днях между текущей датой и датой рождения, разницу выводить в TextBox.
Все это нужно для установки фильтра, на форме есть кнопка "Показать именинников", при нажатии на кнопку должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней.
Формат даты: SET DATE GERMAN

Это круто.

TextBox.value=date()-god_rojd
SET FILTER TO date()-god_rojd<30

Или надо с десяток ссылок в инете ?
...
Рейтинг: 0 / 0
Количество дней до события
    #35964240
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guest12345set date german
set century on

? ? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17}))

Ps. до моего дня рождения осталось ....

Спасибо очень помогло. Только у меня тут пришлось поменять фигурные скобки на круглые.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964242
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rewareDisaerЗдраствуйте, есть в таблице поле (god_rojd) типа date хранящее дату рождения. Мне нужно узнать разницу в днях между текущей датой и датой рождения, разницу выводить в TextBox.
Все это нужно для установки фильтра, на форме есть кнопка "Показать именинников", при нажатии на кнопку должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней.
Формат даты: SET DATE GERMAN

Это круто.

TextBox.value=date()-god_rojd
SET FILTER TO date()-god_rojd<30

Или надо с десяток ссылок в инете ?

Так как ты написал нереботает нехера!!! Так сгодится только если у тебя год рождения и текущий год одинаковы. А когда у тебя разница в 20 лет будет, ты никогда число <30 неполучишь. иди проверь если невериш. разница между датами 2009 года и 1988 года примерно равны 7000 дням.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964248
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Disaer[quot Guest12345]set date german
set century on

? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17}))

Ps. до моего дня рождения осталось ....

Спасибо очень помогло. Только у меня тут пришлось поменять фигурные скобки на круглые.[/quot

Только надо смотреть если результат положительный, то до текущего события осталось
столько дней сколько получается, а если отрицательный, значит событие уже прошло,
и не совсем наверно правильно показывает, ну мысль наверно можно поправить
в нужном направлении
...
Рейтинг: 0 / 0
Количество дней до события
    #35964256
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guest12345Disaer[quot Guest12345]set date german
set century on

? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17}))

Ps. до моего дня рождения осталось ....

Спасибо очень помогло. Только у меня тут пришлось поменять фигурные скобки на круглые.[/quot

Только надо смотреть если результат положительный, то до текущего события осталось
столько дней сколько получается, а если отрицательный, значит событие уже прошло,
и не совсем наверно правильно показывает, ну мысль наверно можно поправить
в нужном направлении

Угу в некоторых случаях получается отрицательный ответ, поэтому я к этому результату длаю проверку.
d = INT(((YEAR(DATE())-YEAR((plan_sotr.god_rojd)))*365.25)-(DATE() - (plan_sotr.god_rojd)))
IF d>=0
thisform.text21.Value = d
ELSE
thisform.text21.Value = d+365
ENDIF
...
Рейтинг: 0 / 0
Количество дней до события
    #35964263
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Disaer
Угу в некоторых случаях получается отрицательный ответ, поэтому я к этому результату длаю проверку.
d = INT(((YEAR(DATE())-YEAR((plan_sotr.god_rojd)))*365.25)-(DATE() - (plan_sotr.god_rojd)))
IF d>=0
thisform.text21.Value = d
ELSE
thisform.text21.Value = d+365
ENDIF

Да, так в целом почти правильно, только 1 следующий день после рождения
неправильно показывает 0 дней, а все остальные дни нормально12345
...
Рейтинг: 0 / 0
Количество дней до события
    #35964266
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю так правильно будет

SET TALK OFF
SET DATE GERMAN
SET CENTURY on
CLEAR

mydata={^1972.05.17}
d1=INT(((YEAR(DATE())-YEAR(mydata))*365.25)-(DATE() - mydata))

IF d1>0
d2 = d1
ELSE
IF d1=0
IF DAY(mydata)=DAY(DATE())
d2=0
ELSE
d2=365
ENDIF
ELSE
d2 = d1+365
ENDIF
ENDIF

MESSAGEBOX('До моего дня рождения осталось:'+ALLTRIM(STR(d2))+' дней.')
...
Рейтинг: 0 / 0
Количество дней до события
    #35964292
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю проще всего так :)

d = DATE(YEAR(DATE()),MONTH(DATE()),DAY(DATE()))-DATE(YEAR(DATE()),MONTH(plan_sotr.god_rojd),DAY(plan_sotr.god_rojd))
IF d<0
d = d*(-1)
thisform.text21.Value = d
ELSE
thisform.text21.Value = d
ENDIF

(PS: только вот незнаю как теперь фильтр поставить, таблица называется sotrydnik, имя поля god_rojd. Мне нада только те записи, у которых количество дней до дня рождения не превышает 30. Set filter похоже тут непрокатит, может это всо запихнуть в курсор? Помогите :) )
...
Рейтинг: 0 / 0
Количество дней до события
    #35964319
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окончательный вариант оформленный в виде функции

SET TALK OFF
SET DATE GERMAN
SET CENTURY on
CLEAR

mydata1={^1972.05.17}
mydata2=DATE()
mydata3={^2009.12.31}
mydata4={^2010.01.01}

* первый параметр функции dodobday - день рождения
* второй необязательный, по умолчанию равен DATE()
* ? dodobday()
? DATE(), ' - ', mydata1, dodobday(mydata1)
?
? mydata2, ' - ', mydata1, dodobday(mydata1,mydata2)
?
? {^2009.05.16}, ' - ', mydata1, dodobday(mydata1,{^2009.05.16})
?
? {^2009.05.17}, ' - ', mydata1, dodobday(mydata1,{^2009.05.17})
?
? {^2009.05.18}, ' - ', mydata1, dodobday(mydata1,{^2009.05.18})
?
? mydata3, ' - ', mydata1, dodobday(mydata1,mydata3)
?
? mydata4, ' - ', mydata1, dodobday(mydata1,mydata4)

FUNCTION dodobday
PARAMETERS d1,d2
PRIVATE d3,d4
IF parameters()<1
MESSAGEBOX('Задайте параметры функции dodobday:'+CHR(10)+CHR(13)+'d1, d2 - две даты')
RETURN .f.
ENDIF
IF parameters()=1
d2=DATE()
IF VARTYPE(d1) # 'D'
MESSAGEBOX('Задайте параметры функции dodobday:'+CHR(10)+CHR(13)+'d1 - дата')
RETURN .f.
ENDIF
ENDIF
IF parameters()=2
IF VARTYPE(d1) # 'D' AND VARTYPE(d2) # 'D'
MESSAGEBOX('Задайте параметры функции dodobday:'+CHR(10)+CHR(13)+'d1, d2 - две даты')
RETURN .f.
ENDIF
ENDIF
d3= LTRIM(STR(YEAR(d2))) + RIGHT(DTOC(d1,1),4)
d3= CTOD('^'+LEFT(d3,4)+'.'+SUBSTR(d3,5,2)+'.'+RIGHT(d3,2))
IF (d3-d2)<0
d3= LTRIM(STR(YEAR(d2)+1)) + RIGHT(DTOC(d1,1),4)
d3= CTOD('^'+LEFT(d3,4)+'.'+SUBSTR(d3,5,2)+'.'+RIGHT(d3,2))
ENDIF
RETURN d3-d2
ENDFUNC
...
Рейтинг: 0 / 0
Количество дней до события
    #35964321
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Disaer
Так как ты написал нереботает нехера!!! Так сгодится только если у тебя год рождения и текущий год одинаковы. А когда у тебя разница в 20 лет будет, ты никогда число <30 неполучишь. иди проверь если невериш. разница между датами 2009 года и 1988 года примерно равны 7000 дням.

А можно печатным языком, или эмоции захлестывают ?

? {^2009-01-01}-{^1988-01-01} возвращает 7671. Под VFP9+SP2. Под WinXP+SP3. У вас не так ? Можно внятно обьяснить, что не устраивает ? "Что ясно представляется, то ясно излагается" (C) Не помню кто.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964323
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rewareDisaer
Так как ты написал нереботает нехера!!! Так сгодится только если у тебя год рождения и текущий год одинаковы. А когда у тебя разница в 20 лет будет, ты никогда число <30 неполучишь. иди проверь если невериш. разница между датами 2009 года и 1988 года примерно равны 7000 дням.

А можно печатным языком, или эмоции захлестывают ?

? {^2009-01-01}-{^1988-01-01} возвращает 7671. Под VFP9+SP2. Под WinXP+SP3. У вас не так ? Можно внятно обьяснить, что не устраивает ? "Что ясно представляется, то ясно излагается" (C) Не помню кто.

Читаем первое сообщение. Там явно сказано что нужно отбирать людей у которых до дня рождения осталось 30 или менее дней.
Теперь читаем читаем твой текст: "{^2009-01-01}-{^1988-01-01} возвращает 7671 дней . Помоему 30 и 7671 день сильно отличаются :) 7671 получается из за тго, что ФокПро щитают разницу между датами в днях! Поэтому чтобы выводилась разница в днях, нужно в переменную занести дату рождения человека, предварительно заменив год на текущий.
Теперь вам понятно?
...
Рейтинг: 0 / 0
Количество дней до события
    #35964369
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Disaer
Читаем первое сообщение. Там явно сказано что нужно отбирать людей у которых до дня рождения осталось 30 или менее дней.
Теперь читаем читаем твой текст: "{^2009-01-01}-{^1988-01-01} возвращает 7671 дней . Помоему 30 и 7671 день сильно отличаются :) 7671 получается из за тго, что ФокПро щитают разницу между датами в днях! Поэтому чтобы выводилась разница в днях, нужно в переменную занести дату рождения человека, предварительно заменив год на текущий.
Теперь вам понятно?

Да мне давно все понятно. Надеюсь, и вам после столь долгих и глубоких рассуждений стало понятно, что проблема не в том, чтобы отфильтровать по количеству оставшихся дней, а в решении огромной технической проблемы - подстановки нужного (текущего) года в дату рождения. Или тред еще на двести мессаг разовьется ?
...
Рейтинг: 0 / 0
Количество дней до события
    #35964396
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше помогите теперь выбрать данные из таблицы, либо в новую таблицу, либо в курсор, где сотруднику осталось 30 или менее дней до ДР.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964781
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisaerЛучше помогите теперь выбрать данные из таблицы, либо в новую таблицу, либо в курсор, где сотруднику осталось 30 или менее дней до ДР.

Чего ради страждущего не сделаешь :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE CURSOR drs (fio c( 20 ), dr d)
INSERT INTO drs (fio, dr) VALUES ('Петров', {^ 1990 . 01 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Иванов', {^ 1990 . 05 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Сидоров', {^ 1990 . 06 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Павлов', {^ 1990 . 07 . 21 })

SELECT fio, dr, DAY(drs.dr) as p1, MONTH(drs.dr) as p2 FROM drs ;
	WHERE DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()< 30  AND ;
	DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()> 0  AND ;
	NOT EMPTY(DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()) ;
	INTO CURSOR drs2

BROWSE FIELDS fio, dr
CLOSE DATABASES
RETURN
...
Рейтинг: 0 / 0
Количество дней до события
    #35964824
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisaerGoshaS http://www.sql.ru/forum/actualthread.aspx?tid=649550
Ненашол там именно для моего случая примера. Я ту тему два раза читал до того как создал свою.
Там промежутки и тд и тп. А мне надо конкретное количество дней до дня рождения. Я недогнал как сделать через промежутки.

Читаем постановку задачи по приведенной ссылке

Из справочника персонала выбрать всех людей, у которых день рождения на этой неделе, вне зависимости от года
Или выражаясь вашими словами

должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 7 дней.
Читаем вашу постановку задачи

должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней.
Т.е. отличие вашей задачи от той, что по ссылке всего лишь в том, что вам надо указать интервал не в 7 дней, а в 30. Решение там приведено. Надо всего-лишь заменить число 7 на число 30.
...
Рейтинг: 0 / 0
Количество дней до события
    #35965018
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С некоторыми изменениями для подстраховки от високосного года :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE CURSOR drs (fio c( 20 ), dr d)
INSERT INTO drs (fio, dr) VALUES ('Петров', {^ 1990 . 01 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Сидоров', {^ 1990 . 05 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Семенов', {^ 1990 . 06 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Павлов', {^ 1990 . 07 . 21 })

wh="iif(NOT EMPTY(DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))),"+ ;
	"DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()<30,"+ ;
	"DATE(YEAR(DATE()), 2, 28)-DATE()<30) AND "+ ;
	"iif(NOT EMPTY(DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))),"+ ;
	"DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()>0,"+ ;
	"DATE(YEAR(DATE()), 2, 28)-DATE()>0)"
	
SELECT fio, dr FROM drs ;
	WHERE &wh ;
	INTO CURSOR drs2
IF _TALLY= 1 
	=MESSAGEBOX('Опять Сидорова поздравлять...')
ENDIF 
BROWSE FIELDS fio, dr
CLOSE DATABASES
RETURN
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Количество дней до события
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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