HP OpenVMS Systemsask the wizard |
The Question is:
I am trying to create a loop to go backwards in time with DCL. I can't seem to
get the syntax correct.
What I need to do is to search for all days before the current date and then
move those files to a different directory and insert them into a database in
date order.
The problem that I am having is that f$cvtime isn't recognizing anything before
yesterday and I need to be able to go at least three days back.
What I am trying looks like this:
$ on error then goto error exit
$ set uic [1,4]
$ set proc /priv = all
$ set def ds$edi
$ set def [.vdps]
$ X = 24
$ dayloop:
$ time = f$cvtime("TODAY" - x)
$ time = f$extr(5,5,TIME) - "-"
$ if f$sea("DPS''TIME'.ISO") .NES. ""
$ then
$ x = x + 24
$ goto dayloop
$ else
$ x = x - 24
$ time = f$cvtime("TODAY" - x)
$ time = f$extr(5,5,TIME) - "-"
$ if f$sea("DPS''TIME'.ISO") .nes. ""
$ then
$ copy DPS'TIME'.iso ds$bsc:bsc_dpsar_dsedi.rec;0
$ M
ZN "DSEDI"
S PROC="DPSAR"
D FILE^SSCRECV
$ del ds$bsc:bsc_dpsar_dsaec.rec;
$ del DPS'TIME'.ISO;
$ goto dayloop
$ else
$ reply/term = opa0: "BSC MSG: UPLOAD COMPLETE."
$ endif
$ endif
$ exit
The error that I get is this:
$ time = f$cvtime("TODAY" - x)
%DCL-W-IVATIME, invalid absolute time - use DD-MMM-YYYY:HH:MM:SS.CC format
\-47\
whenever x is larger than 24.
Is there a way to make f$cvtime reverse in this way?
The Answer is :
Please see the information on absolute, delta, and combination times
available in the OpenVMS documentation set (The OpenVMS User's Guide,
the DCL Dictionary) and in the OpenVMS HELP library, and please also
consider other available reference materials such as the Digital Press
book Writing Real Programs in DCL.
In this case, commands such as the following are likely of interest:
$ DIRECTORY/SINCE="-7-"
$ DIRECTORY/BEFORE="-1-"
$ DIRECTORY/SINCE="8-JAN-2003-2-"
$ DIRECTORY/BEFORE=YESTERDAY
$ DIRECTORY/BEFORE=YESTERDAY
$ DIRECTORY/SINCE=TOMORROW
$ DIRECTORY/SINCE="TOMORROW-1-"
You could also use a combination time as the input time value for the
DCL f$cvtime lexical function -- if wish to continue with your current
approach based on your DCL procedure. Please see the OpenVMS manuals
for details on the particular syntax of the combination time.
An example of a combination time specification follows:
f$cvtime("TODAY - ''X'-",,"Month")
The OpenVMS Wizard would also suggest the use of f$cvtime to extract the
required portions of the date string, and not parsing the date string
with f$extract. (Why introduce a Y10K problem into your own DCL code,
when a simple and supported -- and also easy for subsequent programmers
to understand, to debug, and to extend as needed -- alternative exists?)
Another approach for managing this date data is to load the contents of
the directory into an indexed file -- using a comparison-format date
as the (descending) key -- and then access the filename contents of
the record by its key. Indexed files are easily available from DCL
using the READ command, the WRITE command, the CREATE/FDL command,
and a very simple FDL file. (The first characters of each record
would be a string key, containing the comparison-format date. (The
OpenVMS Wizard would allow duplicates on this key.) The remaining
characters of each record in the file -- this field would be up to
255 characters wide, assuming ODS-2 -- would be the filename that
was associated with the particular date.)
Directly associated with this discussion are topics (3464), (3966),
(4399), and (7290).
Other related topics include (1233), (2315), (2943), (3009), (5313),
(6559), (7499), and likely others.
|