""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
SET A TIMER TO RUN A PROGRAM AT A FUTURE DATE & TIME
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
PRODUCT : R:BASE VERSION : 3.1
CATEGORY : PROGRAMMING SUBCATEGORY : TOOLS
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
From Alex Rafferty, Rafferty Software, 6517 High Country Trail,
Arlington TX 76016. Alex is an R:BASE application developer. You can
reach him at 817-483-1316.
I developed TIMER.CMD for a client who wanted to load a large ASCII
file into his database outside of normal office hours. You can use it
to execute any R:BASE command file at a specified future date and time
such as overnight or on a weekend.
TIMER.CMD prevents invalid dates or times. You must enter times in the
24 hour clock format (HH:MM)--13:14 for 1:14 pm. When you activate the
timer, TIMER.CMD clears the screen but leaves a status message giving
the date and time settings and the current date and time.
Programming Examples
""""""""""""""""""""
TIMER.CMD shows developers how to use CHKKEY and GETKEY in a WHILE
loop to allow a user to interrupt a process with the press of a key.
Developers will also see how to create different colored DISPLAY
screens by taking snapshots of colored screens.
Create Colored SNAP Files
"""""""""""""""""""""""""
Create two colored SNAP files for TIMER.CMD to use to collect and
display the date and time. First, Use RBEDIT to create the following
two files. Leave the top line blank in each one. Name them TIME1 and
TIME2:
Here's TIME1:
+-----------------------------------+
| Date and time to begin procedure. |
| |
| DATE: TIME: |
| |
+-----------------------------------+
Here's TIME2:
+-----------------------------------+
| Date and time Procedure begins. |
| DATE: TIME: |
| |
| |
+-----------------------------------+
Next, run COLOR.CMD to make the colored SNAP files.
*( COLOR.CMD--Colored SNAP files.)
CLS
SET COLOR red ON cyan
DISPLAY time1
SNAP collect.snp FROM 2 1 TO 7 37
CLS
SET COLOR black ON cyan
DISPLAY time2
SNAP display.snp FROM 2 1 TO 7 37
SET COLOR white ON blue
Create ERROR.CMD
*( ERROR.CMD--called by TIMER.CMD)
SET VAR verr1 = .%1
SET VAR verr2 = 'Press any key to continue'
WRITE .verr1 AT 23 1 USING +
[^]_????????????????????????????+
????????????????????????????????+
??????????????????? cyan ON red
WRITE .verr2 AT 24 1 USING +
[^]_????????????????????????????+
????????????????????????????????+
??????????????????? cyan ON red
BEEP ; PAUSE ; CLS FROM 23 TO 24
CLEAR VAR verr1, verr2, %1
RETURN
Create TIMER.CMD
*( TIMER.CMD--Set run date and time.)
SET BELL OFF ; SET INSERT OFF
SET MESSAGES OFF
SET ERROR MESSAGES OFF
SET ERROR VAR verr
LABEL begin
SET DATE FORMAT MM/DD/YY
SET TIME FORMAT HH:MM
SET VAR vdttext TEXT = ('Currently:' & CTXT(.#DATE) & CTXT(.#TIME)), +
vfore TEXT = 'white', vback TEXT = 'blue'
SET COLOR .vfore ON .vback ; CLS
DISPLAY collect.snp AT 8, 12
WRITE ' ' AT 11 22 black ON gray
WRITE ' ' AT 11 39 black ON gray
WRITE 'mm/dd/yy' AT 10 22 white ON cyan
WRITE 'hh:mm' AT 10 39 white ON cyan
WRITE .vdttext AT 12 16 blue ON cyan
*( Set date.)
LABEL expdt1
CLEAR VAR vdte
SET VAR vdte DATE
FILLIN vdte=8 USING '' AT 11 22 black ON gray
IF verr <> 0 THEN
RUN error.cmd USING 'not a valid date MM/DD/YY'
WRITE ' ' AT 11 22 black ON gray
GOTO expdt1
ENDIF
IF vdte IS NULL THEN
GOTO endexp
ENDIF
IF vdte < .#DATE THEN
RUN error.cmd USING 'That date has passed.'
GOTO expdt1
ENDIF
*( Set time.)
LABEL expdt2
CLEAR VAR vtm2
SET VAR vtm2 TIME
SET TIME SEQ HHMM
FILLIN vtm2=5 USING '' AT 11 39 +
black ON gray
IF verr <> 0 THEN
RUN error.cmd USING 'not a valid time HH:MM'
WRITE ' ' AT 11 39 black ON gray
GOTO expdt2
ENDIF
IF vtm2 IS NULL THEN
GOTO expdt1
ENDIF
IF vdte <= .#DATE AND vtm2 < .#TIME THEN
RUN error.cmd USING 'That time has passed.'
WRITE ' ' AT 11 39 black ON gray
GOTO expdt2
ENDIF
LABEL timeron
NEW
SET DATE FORMAT MM/DD/YY
SET TIME FORMAT HH:MM
DISPLAY display.snp AT 8, 12
WRITE .vdte AT 10 24 black ON gray
WRITE .vtm2 AT 10 39 black ON gray
WRITE 'Press [F2] to Start timer.' AT 12 18 white ON cyan
WRITE 'Press [F6] to change the setting, or [Esc] to cancel.' +
AT 15 4 white ON cyan
LABEL ft
FILLIN vstr=0 USING '' AT 12 60
IF vstr IS NULL THEN
GOTO ft
ELSE
IF vstr = '[Esc]' THEN
GOTO endexp
ELSE
IF vstr = '[F6]' THEN
GOTO begin
ENDIF
IF vstr <> '[F2]' THEN
GOTO ft
ENDIF
ENDIF
ENDIF
IF #DATE > .vdte THEN *( [F2] pressed.)
GOTO toolate
ENDIF
SET VAR vtimer INT = 251, vwhms INT = 1
SET ESCAPE OFF
WHILE #DATE < .vdte THEN *( Date loop.)
SET COLOR gray ON black
SET DATE FORMAT 'WWW-MMM-DD'
SET VAR vset = ('Date set for -' & CTXT(.vdte) +
& 'Current date is -' & CTXT(#DATE))
WRITE .vset AT .vwhms 14
IF vtimer > 250 THEN
IF vwhms > 22 THEN
SET VAR vwhms = 1, vtimer = 0
ELSE
SET VAR vwhms=(.vwhms + 1), vtimer = 0
ENDIF
CLS
WRITE 'Timer activated, press [F5] to change or [Esc] to cancel.' +
AT .vwhms 5
SET VAR vwhms = (.vwhms + 1)
ENDIF
SET VAR vtimer = (.vtimer + 1), +
vchkkey = (CHKKEY(0))
IF vchkkey = 1 THEN
SET VAR vgetkey = (GETKEY(0))
IF vgetkey = '[Esc]' THEN
GOTO endexp
ENDIF
IF vgetkey = '[F5]' THEN
SET COLOR .vfore ON .vback
GOTO timeron
ENDIF
ENDIF
ENDWHILE
IF #TIME > .vtm2 THEN
*( By the time you pressed [F2],)
*( the date or time set had passed.)
LABEL toolate
SET VAR vdttext = +
('Current date' & CTXT(.#DATE) +
& 'Current time - ' + CTXT(.#TIME))
WRITE .vdttext AT 12 17 black ON gray
RUN error.cmd USING 'Date is past enter date & time again'
GOTO begin
ENDIF
WHILE #TIME < .vtm2 THEN *( Time loop.)
SET COLOR gray ON black
SET TIME FORMAT HH:MM:SS
SET VAR vset = ('Timer set for' & CTXT(.vtm2) & 'Current time is' +
& CTXT(#TIME))
WRITE .vset AT .vwhms 14
IF vtimer > 250 THEN
IF vwhms > 22 THEN
SET VAR vwhms = 1, vtimer = 0
ELSE
SET VAR vwhms = (.vwhms + 1), vtimer = 0
ENDIF
CLS
WRITE 'Timer activated. Press [F5] to change settings, [Esc] to cancel
.' +
AT .vwhms 5
SET VAR vwhms = (.vwhms + 1)
ENDIF
SET VAR vtimer = (.vtimer + 1), vchkkey = (CHKKEY(0))
IF vchkkey = 1 THEN
SET VAR vgetkey = (GETKEY(0))
IF vgetkey = '[Esc]' THEN
GOTO endexp
ENDIF
IF vgetkey = '[F5]' THEN
SET COLOR .vfore ON .vback
GOTO timeron
ENDIF
ENDIF
ENDWHILE
BEEP ; CLS *( Time up! Alarm goes off.)
SET COLOR .vfore ON .vback
*( Put RUN command here to run program.)
RUN your.cmd *( program. to execute.)
LABEL endexp
SET COLOR .vfore ON .vback
CLEAR VAR vtm2, vdte, vchkkey, vgetkey, vtimer, vwhms, vdttext, +
vtmtext, vfore, vback, vset, vstr, verr
*( Reset the environment.)
SET TIME FORMAT HH:MM:SS
SET TIME SEQ HHMMSS
SET DATE FORMAT MM/DD/YYYY
SET MESSAGES ON
SET ERROR MESSAGES ON
SET BELL ON ; SET INSERT ON
SET ESCAPE ON
RETURN
What TIMER.CMD Does
"""""""""""""""""""
First, TIMER.CMD asks you for the starting date and time. It uses an
error variable to test for an invalid date or time. Next, it checks
the entered date and time against the current date and time to keep
from inadvertently accepting a past date or time. In the event of an
error, it passes the error message to ERROR.CMD, which displays the
error in red.
After setting the date and time, press [F2] to start the timer, [F6]
to change the settings, or [Esc] to cancel. After starting the timer,
TIMER.CMD clears the screen, sets the screen colors to gray on black,
and displays a two-line message that moves approximately every 25
seconds to prevent screen burn-in. At any time, you can press [F5] to
change the settings or [Esc] to deactivate the timer.
TIMER.CMD uses two WHILE loops. Both loops use GETKEY and CHKKEY to
see if the user wishes to interrupt. The first WHILE loop executes as
long as the date set by the user is greater than the current date
(#DATE). When the two dates match, the loop breaks and moves on to the
second WHILE loop, which executes as long as the time set by the user
is greater than the current time (#TIME). Then a bell chimes to
indicate the time has expired, and TIMER.CMD executes the delayed
program.
The code you're running may need to reset some of the environment
settings set by TIMER.CMD. You may wish to change the environment
settings at the end of TIMER.CMD to suit your own configuration.