Помогите разобраться в BITHSDAY.

Обсуждение программ nnCron и nnCron LITE

Помогите разобраться в BITHSDAY.

Postby MasterW » Sun, 11 Jun 2006, 16:52

#( birthdays
OnceADay
<(
: birthdays.txt S" birthdays.txt" ;
VARIABLE fb
CREATE bline 256 ALLOT
CREATE bname 64 ALLOT
VARIABLE bdate
VARIABLE byears
VARIABLE bdays
\ start reminding <pre-period> days before the birthday
5 CONSTANT pre-period
)>
Action:
birthdays.txt R/O OPEN-FILE-SHARED IF DROP ERR-MSG: "Can't open %birthdays.txt% file" EXIT THEN fb !
BEGIN bline 250 fb @ READ-LINE THROW WHILE
bline SWAP
<TIB
get-number Year@ get-number get-number YMD>DATE bdate !
Year@ SWAP - byears !
1 WORD COUNT 63 MIN bname PLACE
CUR-DATE bdate @ DATE- NEGATE DUP 0 > OVER pre-period < AND
IF bdays !
MSG: "Birthday reminder!!!%crlf%%bname COUNT%%crlf%Remining days: %bdays @%.%crlf%Aged: %byears @%.%crlf%Don't forget to send greeting card!"
\ do smth useful here - play a little melody, for example
ELSE DROP THEN
TIB>
REPEAT
DROP
fb @ CLOSE-FILE DROP
)#

Как сделать, чтоб задача выполнялась автоматически?
MasterW
 
Posts: 52
Joined: Sat, 10 Jun 2006, 16:07
Location: RND

Postby Nicholas_Nemtsev » Tue, 13 Jun 2006, 15:58

Она и так автоматически выполняется. Только один раз в день при запуске системы. Настрой другое время, например:
Time: * 10-17 * * * *
OnceADay
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby AlikasS » Wed, 28 Jun 2006, 05:48

а еще для удобства можно заменить строку
CUR-DATE bdate @ DATE- NEGATE DUP 0 > OVER pre-period < AND
на
CUR-DATE bdate @ DATE- NEGATE DUP -1 > OVER pre-period < AND
и при текущем празднике (сегодня) инфо о нем тоже будет отображаться.
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Без года, но с изменяемым периодом ожидания

Postby Elk » Thu, 24 May 2007, 13:48

Тема, наверное, уже устарела, да и то, что я хочу предложить, –ежу понятные вещи, но все равно отпишусь здесь.
В первоначальном примере "напоминалки" из example.tab меня смущали две вещи:
1) Зачем нужен год? Нет, я понимаю, что некоторым, наверное, интересно знать, сколько же лет исполнилось тому-то, но в большинстве случаев ведь мы об этом не задумываемся.
2) Дни заблаговременного предупреждения – постоянная. Мне нужно, чтобы каждую дату можно было получать с разным предупреждением.
В общем, я немного переделал эту процедуру (да простят меня многоуважаемые Немцев и Кондаков), плюс даты "вывернул" - не год-месяц-день, а день-месяц, как у всех нормальных русских, и вот, что у меня получилось:

##############################################################################
# This task will reminds you about birthdays of your friends.
# Just create a text file 'birthdays.txt' with the following info on each
# line (without '#' line comment):
#
# 23 2 5 ELK
# Where 23rd of February (2) is my birthday and it has 5 days in advance to warn me about it

#( birthdays
OnceADay
<(
: birthdays.txt S" birthdays.txt" ;
VARIABLE fb
CREATE bline 256 ALLOT
CREATE bname 64 ALLOT
VARIABLE bdate
VARIABLE bdays
\ start reminding <pre-period> days before the birthday
VARIABLE pre-period
)>
Action:
birthdays.txt R/O OPEN-FILE-SHARED IF DROP ERR-MSG: "Can't open %birthdays.txt% file" EXIT THEN fb !
BEGIN bline 250 fb @ READ-LINE THROW WHILE
bline SWAP
<TIB
Year@ get-number get-number SWAP YMD>DATE bdate !
get-number 1+ pre-period !
1 WORD COUNT 63 MIN bname PLACE
bdate @ CUR-DATE DATE- DUP -1 > OVER pre-period @ < AND
IF bdays !
START-APP: Remind {\qc %bname COUNT%\par\par\fs20 Remaining days: \b %bdays @%}|c=Birthday reminder
ELSE DROP THEN
TIB>
REPEAT
DROP
fb @ CLOSE-FILE DROP
)#

Ах да, чуть не забыл. Для вывода напоминания на экран я использую свою маленькую программку. Вместо нее можно использовать MSG: или REMINDER, наверное, только тогда не забудьте из текста убрать RTF элементы.
Elk
 
Posts: 13
Joined: Sat, 02 Dec 2006, 11:07

Postby dimapplk » Tue, 24 Jul 2007, 18:06

А не поможете переделать эту напоминалку дней рожденя в ПРОСТО НАПОМИНАЛКУ. Т.е. нужно чтобы она понимала дату в формате nncron и у мела нопоминать о чем-то раз в месяц, о чем-то раз в квртал, год или, например, по средам.
dimapplk
 
Posts: 29
Joined: Tue, 24 Jul 2007, 17:52

Postby SaMM » Tue, 24 Jul 2007, 23:43

А может кто ни будь подсказать, как работают следующие слова:
Code: Select all
get-number
WORD
<TIB ...  TIB>
SaMM
 
Posts: 236
Joined: Fri, 25 Aug 2006, 12:33

Postby AlikasS » Sat, 28 Jul 2007, 17:11

dimapplk wrote:А не поможете переделать эту напоминалку дней рожденя в ПРОСТО НАПОМИНАЛКУ. Т.е. нужно чтобы она понимала дату в формате nncron и у мела нопоминать о чем-то раз в месяц, о чем-то раз в квртал, год или, например, по средам.
можно ничего не переделывать, а просто использовать классический режим nnCron
Code: Select all
* 10 * * 1-5 * nncron.exe S" Напоминание" MsgBox BYE

или составлять простейшую задачу:
добавить задачу, на вкладке выставить необходимое время и периодичность, на вкладке действия выбрать "Отобразить сообщение", вписать сообщение.
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Помогите разобраться в BITHSDAY.

Postby alx » Mon, 29 Jul 2013, 10:49

Присоединюсь к вопросу:
А может кто ни будь подсказать, как работают следующие слова:
Code: Select all
get-number


Хотелось бы выводить не только число дней до дня рождения, но и саму дату.

Подскажите, пожалуйста, как сохранить в переменную значения месяца и числа?
alx
 
Posts: 5
Joined: Mon, 22 Jul 2013, 10:16

Re: Помогите разобраться в BITHSDAY.

Postby VoidVolker » Mon, 29 Jul 2013, 17:53

alx wrote:Присоединюсь к вопросу:
А может кто ни будь подсказать, как работают следующие слова:
Code: Select all
get-number


Оно просто забирает из входного потока строку и конвертирует её в число.
Code: Select all
: get-double  get-string S>DOUBLE ;
: get-number get-double  D>S ;

alx wrote:Хотелось бы выводить не только число дней до дня рождения, но и саму дату. Подскажите, пожалуйста, как сохранить в переменную значения месяца и числа?

А какова задача-то? Подробное описание работы с датами и переменными есть в мануале.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Помогите разобраться в BITHSDAY.

Postby alx » Tue, 30 Jul 2013, 14:07

Задача - чтоб birthday reminder выводил в сообщении дату события (dd.mm), а не только количество дней до него (n), например:

День рождения у XXX dd.mm! Осталось дней: n

Code: Select all
Action:
  birthdays.txt R/O OPEN-FILE-SHARED IF DROP ERR-MSG: "Can't open %birthdays.txt% file" EXIT THEN fb !
  BEGIN bline 250 fb @ READ-LINE THROW WHILE
    bline SWAP
    <TIB
       get-number Year@ get-number get-number YMD>DATE bdate ! \здесь распарсивается дата, если я правильно понимаю; из нее мне нужно сохранять второе и третье число и выводить их в MSG
       Year@ SWAP - byears !
       1 WORD COUNT 63 MIN bname PLACE
       CUR-DATE bdate @ DATE- NEGATE DUP 0 > OVER pre-period < AND
       IF bdays !
          MSG: "Birthday reminder!!!%crlf%%bname COUNT%%crlf%Remining days: %bdays @%.%crlf%Aged: %byears @%.%crlf%Don't forget to send greeting card!"


Никак не могу найти подобную ситуацию в мануалах... Если она уже была, прошу прощения; буду благодарна, если укажете ссылку.
alx
 
Posts: 5
Joined: Mon, 22 Jul 2013, 10:16

Re: Помогите разобраться в BITHSDAY.

Postby AlikasS » Wed, 31 Jul 2013, 03:24

одна из вариаций задачи
Code: Select all
#( предупреждения о ближайших праздниках
: birthdays.txt S" %NNCRON-HOME-DIR%\Note\birthdays.txt" EVAL-SUBST ;
: prazdnik.txt S" %NNCRON-HOME-DIR%\Note\prazdnik.txt" EVAL-SUBST ;
Time: 0 * * * * *
Also
WatchFile: "%birthdays.txt"

VARIABLE fb
USER-VALUE bline
USER-VALUE bname
USER-VALUE bend
VARIABLE bdate
VARIABLE byear
VARIABLE bday
-10 CONSTANT after-periodd
16 CONSTANT pre-periodd
: task-body-pazdn { \ q--day q--mon -- }

birthdays.txt EXIST? NOT IF EXIT THEN

256 ALLOCATE THROW TO bline
164 ALLOCATE THROW TO bname
164 ALLOCATE THROW TO bend
FILE-WRITE: "%prazdnik.txt%" ""
   birthdays.txt R/O OPEN-FILE-SHARED
   IF DROP TMSG: "Can't open %birthdays.txt% file" 5
   bline FREE DROP
   bname FREE DROP
   bend FREE DROP
   EXIT
   THEN
   fb !

FILE-APPEND: "%prazdnik.txt%" "дата формирования  отчета%crlf%%hh%:%mm% %DD%.%MM%.%YYYY%%crlf%%crlf%"

  BEGIN bline 250 fb @ READ-LINE THROW WHILE
    bline SWAP
    <TIB
       get-number Year@ get-number get-number TO q--day TO q--mon
\ SWAP DUP 0 = IF DROP Mon@ THEN SWAP

q--mon 0 = q--day 0 = NOT AND
IF \ 1IF
Mon@ TO q--mon

   Day@ q--day - NEGATE DUP after-periodd > SWAP pre-periodd < AND
   NOT IF 
      q--mon 1 + DUP 13 = IF DROP 1 THEN  TO q--mon
   THEN


THEN \ 1IF

q--mon q--day YMD>DATE bdate !
 
       Year@ SWAP ?DUP IF -  byear ! ELSE DROP 999999999 byear ! THEN
\ если разница между годом в файле и текущим отрицательна ( будущий год)
\ обнуляем дату из файла что бы строку с этой датой не обрабатывать
byear @ 0 < IF 0 bdate ! THEN
       1 WORD COUNT 163 MIN bname PLACE


       CUR-DATE bdate @ DATE- NEGATE DUP after-periodd > OVER pre-periodd < AND
       IF bday !
\      RE-MATCH: "%bname COUNT%" "/!/x"
\      IF
\      S" * " bend PLACE
\      ELSE
\      S" " bend PLACE
\      THEN

bday @ 0 = IF FILE-APPEND: "%prazdnik.txt%" "%QUOTE%%bend COUNT%%bname COUNT%%QUOTE%%crlf%Сегодня!" THEN
bday @ 0 > IF FILE-APPEND: "%prazdnik.txt%" "%QUOTE%%bend COUNT%%bname COUNT%%QUOTE%%crlf%Осталось дней: %bday @% до %bdate @ DATE>S%." THEN
bday @ 0 < IF FILE-APPEND: "%prazdnik.txt%" "%QUOTE%%bend COUNT%%bname COUNT%%QUOTE%%crlf%Прошло дней: %bday @ -1 *% от %bdate @ DATE>S%." THEN

FILE-APPEND: "%prazdnik.txt%" "%crlf%От даты прошло: %[if] byear @ 999999999 =%нет данных%[else]%%byear @% лет ( %Year@ byear @ -%г.)%[end]%.%crlf%%crlf%"
     
ELSE DROP THEN
    TIB>
  REPEAT
  DROP
  fb @ CLOSE-FILE DROP
fb @ FREE DROP
bline FREE DROP
bname FREE DROP
bend FREE DROP
;
Action:
['] task-body-pazdn CATCH ?DUP IF ." Error with birthdays - " . CR THEN
)#
в конце отработки задачи в файле prazdnik.txt лежит необходимая информация.
формат вывода такой
дата формирования отчета
11:22 31.07.2013

"ежемесячная ерунда"
Сегодня!
От даты прошло: нет данных.

"День Рождения Танько"
Прошло дней: 6 от 25-07-2013.
От даты прошло: 38 лет ( 1975г.).

"День Рождения Васько"
Осталось дней: 6 до 06-08-2013.
От даты прошло: 33 лет ( 1980г.)


задача отрабатывает по условиям в начале каждого часа или при изменении файла с праздниками
настраивается здесь
Code: Select all
Time: 0 * * * * *
Also
WatchFile: "%birthdays.txt"

где лежит файл с праздниками, настраивается здесь
Code: Select all
: birthdays.txt S" %NNCRON-HOME-DIR%\Note\birthdays.txt" EVAL-SUBST ;

где будет лежать результирующий файл, здесь
Code: Select all
: prazdnik.txt S" %NNCRON-HOME-DIR%\Note\prazdnik.txt" EVAL-SUBST ;

период до и после праздника настраивается здесь
Code: Select all
-10 CONSTANT after-periodd
16 CONSTANT pre-periodd

можно в birthdays.txt указывать дату как
0000 11 31
- для случая когда год не помнишь
или
2003 00 15
- для случая когда есть какая то ежемесячная фигня :)
или
2014 01 15
- на будущее время, дата будет пропущена в 13 году
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Помогите разобраться в BITHSDAY.

Postby alx » Fri, 02 Aug 2013, 11:15

Спасибо большое за подробней ответ! :)
alx
 
Posts: 5
Joined: Mon, 22 Jul 2013, 10:16


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 4 guests