home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
568a.lha
/
RexxRMF_v1.1
/
videorental.rexx
< prev
Wrap
OS/2 REXX Batch file
|
1991-09-11
|
18KB
|
555 lines
/* ---------------------------------------------------------------
Example illustrating use of 'linking' multiple files and indexes
This example 'links' three files together in an attempt to simulate
a 'relational' database for a fictious video rental store.
File 1 - videofile -
contains all videos in the store
primary key is a 'videonumber' which can occur
multiple times because of multiple copies of the
same video.
alternate keys are videorating
videocopynumber
renting customer number
hold for customer number
File 2 - customerfile -
contains names and addresses of registered
video patrons.
primary key is a unique 'customernumber'
alternate keys are customerlastname
customerbalance (if any)
File 3 - rentalfile -
rental history of each video by customer
primary key is 'videonumber'
alternate keys are customernumber
rentaldate
videcopynumber
I hope the relationship between the tree files is obvious.
The rentalfile links the videofile to the customer file.
* --------------------------------------------------------------- */
/* ------------------- Record Layout Strings --------------------- */
customerrecord = " custnumber custfirst custlast custaddr custcity custstate,
custzip custphone custareacode custdeposit custbalance"
videorecord = " videonum videotitle videocopy videorating videopudate,
videopuprice videosaleprice videoavail videohold videocust"
rentalrecord = " rentalcustnumber rentalvideonum rentalvideocopy rentaldate"
/* --- make library available --- */
x = addlib("RexxRMF.library",0,-30,0)
if exists("videofile") = 1 then
loadfile = 0
else
loadfile = 1
/* will allow duplicate keys in primary index for videos */
/* primary index is video number */
rmfvideos = open_rmf("videofile")
say "videofile " any_err(rmfvideos)
/* will NOT allow duplicate keys in primary index for customers */
/* primary index is customer number */
rmfcustomers = open_rmf("customerfile",1)
say "customersfile " any_err(rmfcustomers)
/* will allow duplicates in any index for rentals */
rmfrentals = open_rmf("rentalfile")
say "rentalfile " any_err(rmfrentals)
if loadfile = 1 then /* create data/index files */
do
r = loaddata()
if r = 0 then /* file creation failed */
do
if rmfvideos ~= '0000 0000'x then
call close_rmf(videofile,1)
if rmfcustomers ~= '0000 0000'x then
call close_rmf(rmfcustomers,1)
if rmfrentals ~= '0000 0000'x then
call close_rmf(rmfrentals,1)
if exists('videofile') then
delete 'videofile'
if exists('customerfile') then
delete 'customerfile'
if exists('rentalfile') then
delete 'rentalfile'
if exists('videofile.rmfindex') then
delete 'videofile.rmfindex'
if exists('customerfile.rmfindex') then
delete 'customerfile.rmfindex'
if exists('rentalfile.rmfindex') then
delete 'rentalfile.rmfindex'
say " ... BIG ERROR !!! Unable to create data/index files ... "
exit
end
end
x = open(outwin,"CON:0/0/640/200//s")
/* just some console escape sequences */
eraseconsolescreen = '9b48 9b4a'x
offsetwrites = '9b39 3978'x
offsettop = '9b39 3979'x
resettop = '9b79'x
resetwrites = '9b78'x
EOD = '9b4a'x
EOL = '9b4b'x
CURSORUP = '9b46'x
CURSORDOWN = '9b45'x
/* --------- Our Menu --------- */
do forever
zout = writech(outwin,rowcol(1,1)EOD)
zout = writeln(outwin,'0a'x copies(' ',16)color(2,1)"Your Get Rich Quick Video Rental Store" color(1,0) '0a'x)
zout = writeln(outwin,'0a'x copies(' ',28) color(1,0)"M E N U"'0a'x'0a'x)
zout = writeln(outwin,'0a'x copies(' ',24) color(1,0)"1)." color(3,0)" Customer Inquiry")
zout = writeln(outwin,'0a'x copies(' ',24) color(1,0)"2)." color(3,0)" Video Inquiry")
zout = writeln(outwin,'0a'x copies(' ',24) color(1,0)"X)." color(3,0)" Enter" color(2,0)"X"color(3,0)" to exit")
zout = writeln(outwin,'0a'x'0a'x'0a'x)
zout = writech(outwin, copies(' ',23) color(1,0)"Enter Option 1 or 2 or X: ")
op = readln(outwin)
select
when op = 1 then /* our CUSTOMER INQUIRY */
do
do forever
zout = writech(outwin,rowcol(1,1)EOD)
x = customerhistory()
if x > 50 then leave
end
end
when op = 2 then /* our VIDEO INQUIRY */
do
zout = writech(outwin,rowcol(1,1)EOD)
vx = videohistory(0)
do forever
vx = videohistory(vx)
if vx > 99999 then leave
if vx = 0 then leave
end
end
when op = 'X' then leave
when op = 'x' then leave
otherwise nop
end
end
/* ---------- Save Files --------- */
call writech(outwin,rowcol(1,1)EOD)
call writech(outwin,rowcol(12,32)color(2,1)"Saving Video Data"color(1,0))
x = close_rmf(rmfvideos)
call writech(outwin,rowcol(1,1)EOD)
call writech(outwin,rowcol(12,32)color(2,1)"Saving Customer Data"color(1,0))
x = close_rmf(rmfcustomers)
call writech(outwin,rowcol(1,1)EOD)
call writech(outwin,rowcol(12,32)color(2,1)"Saving Rental Data"color(1,0))
x = close_rmf(rmfrentals)
x = close(outwin)
exit
/*-------------------------------------------------------------------------*
*- -*
*-------------------------------------------------------------------------*/
customerhistory:
zout = writech(outwin,'0a'x "Enter Customer Name or Number ?")
customer = readln(outwin)
customer = strip(customer)
if customer = '' then return 99
if datatype(customer) = 'NUM' then /* entered a customer number */
do
l = length(customer)
if l > 4 then
do
zout = writeln(outwin,"Invalid customer number, must be 4digits or less")
return 0
end
customer = (copies('0',(4-l)) || customer) /* append leading zeros */
end
else /* else if not numeric assume entered a customer last name */
customer = upper(customer)
/* READ THE CUSTOMER FILE */
/* the primary index (0) indexes on customer number */
/* the first alternate (1) indexes on customer last name */
if datatype(customer) = 'NUM' then /* READ BY CUSTOMER NUMBER */
x = read_rmf_record(rmfcustomers,0,customerrecord,customer,'K')
else /* READ BY CUSTOMER LAST NAME */
x = read_rmf_record(rmfcustomers,1,customerrecord,customer,'K')
if x = 0 then
do
zout = writeln(outwin,'0a'x'0a'x"Customer:" customer "NOT FOUND")
zout = writech(outwin,'0a'x'0a'x"Press Return to Continue ...")
x = readln(outwin)
return 0
end
/* DISPLAY CUSTOMER RECORD */
zout = writeln(outwin,'0a'x color(3,0)"Cust#:" color(2,0)custnumber)
zout = writeln(outwin,color(3,0)" Name :" color(2,0)custfirst custlast )
zout = writeln(outwin,color(3,0)" Addrs:" color(2,0)custaddr )
zout = writeln(outwin,color(3,0)" City :" color(2,0)custcity custstate custzip )
zout = writeln(outwin,color(3,0)" Phone:" color(2,0)'('custareacode')' custphone )
zout = writeln(outwin,rowcol(5,40)color(3,0)"Deposit On File:" color(2,0)custdeposit )
zout = writeln(outwin,rowcol(6,40)color(3,0)"Balance Due:" color(2,0)custbalance)
zout = writeln(outwin,rowcol(9,1))
zout = writech(outwin,offsetwrites)
zout = writeln(outwin,color(2,1)"Film# CP Rented Title"copies(' ',23)"Rating"color(1,0)'0a'x)
zout = writech(outwin,offsettop)
/* READ THE RENTAL FILE FOR THIS CUSTOMER */
x = read_rmf_record(rmfrentals,1,rentalrecord,custnumber,'K')
if x = 0 then zout = writeln(outwin, "No rental records found")
displayed = 0
do while x = 1 /* the NEXT_RMF_RECORD below will set x to zero */
/* READ THE VIDEO FILE TO GET VIDEO INFO */
y = read_rmf_record(rmfvideos,0,videorecord,rentalvideonum,'K')
if y = 1 then
do
title = substr(videotitle,1,32," ")
zout = writeln(outwin, rentalvideonum rentalvideocopy rentaldate title videorating)
displayed = displayed + 1
end
if displayed = 9 then
do
x = writech(outwin,'0a'x'0a'x"Press Return to Continue ...")
x = readln(outwin)
x = writech(outwin,'9b46 9b4b'x) /* move up and erase line */
x = writech(outwin,'9b46'x) /* to effect scrolling */
x = writech(outwin,'9b46'x)
displayed = 0
end
/* get the next rental record for this customer */
x = next_rmf_record(rmfrentals,1,rentalrecord)
end
x = writech(outwin,'0a'x"**** **** End of List **** ****")
x = writech(outwin,'0a'x'0a'x"Press Return to Continue ...")
x = readln(outwin)
zout = writech(outwin,resetwrites)
zout = writech(outwin,resettop)
return 1
/*-------------------------------------------------------------------------*
*- -*
*-------------------------------------------------------------------------*/
videohistory:
parse arg vidnumber
if vidnumber = 0 then
do
/* GET LIST OF VIDEO NUMBERS */
vidnode = find_pos(rmfvideos,0,1) /* find first record in index */
zout = writech(outwin,copies(' ',29) color(2,1)"Video Numbers" color(1,0) '0a'x " ")
displayed = 0
linecnt = 0
do while vidnode ~= '0000 0000'x /* vidnode is a POINTER to node in the tree */
thevideonumberis = " " || key_value(vidnode)
zout = writech(outwin,(color(2,1) || thevideonumberis || color(1,0)) )
displayed = displayed + 1
if displayed > 7 then
do
displayed = 0
zout = writech(outwin,(color(2,1) || " " || '0a'x || color(1,0) || " ") )
linecnt = linecnt + 1
if linecnt > 8 then leave
end
vidnode = next_unique(rmfvideos,0) /* low-level functions dont do any I/O */
end
vidnumber = get_a_video_number()
end /* if vidnumber = 0 */
zout = writech(outwin,color(1,0))
if vidnumber > 99999 then return 999999
if vidnumber = 0 then return 999999
/* READ THE VIDEO FILE TO GET VIDEO INFO */
do forever
x = read_rmf_record(rmfvideos,0,videorecord,vidnumber,'K')
if x = 1 then leave /* found video in file */
zout = writeln(outwin,rowcol(12,1)"Video Number:" vidnumber "NOT FOUND")
zout = writech(outwin, rowcol(21,1))
zout = writech(outwin,"Press Return to Continue ...")
zin = readln(outwin)
vidnumber = get_a_video_number()
if vidnumber > 99999 then return 999999
if vidnumber = 0 then return 999999
end
currentcust = ''
currenthold = ''
videocust = random(1,100) /* generate a customer number */
if videocust > 0 then /* READ CUSTOMER FILE FOR CURRENT RENTER */
do
videocust = copies('0',(4-length(videocust))) || videocust
custfound = read_rmf_record(rmfcustomers,0,customerrecord,videocust,'K')
if custfound then
currentcust = custfirst custlast
else
videocust = '0000'
end
videohold = random(1,100) /* generate a customer number */
if videohold = videocust then
videohold = 0
if videohold > 0 then /* READ CUSTOMER FILE FOR, HOLD FOR CUSTOMER */
do
videohold = copies('0',(4-length(videohold))) || videohold
holdfound = read_rmf_record(rmfcustomers,0,customerrecord,videohold,'K')
if holdfound then
currenthold = custfirst custlast
else
videohold = '0000'
end
/* HOW MANY COPIES WE GOT */
count = key_count(rmfvideos,0,vidnumber,'K')
zout = writeln(outwin,rowcol(12,1)" Video#:" videonum " Number of copies:" count)
title = substr(videotitle,1,32,' ')
zout = writech(outwin,color(3,0)" Title :")
zout = writeln(outwin,color(2,0)title color(3,0) "Copy#:" color(2,0)videocopy color(3,0)"Rating:" color(2,0)videorating)
zout = writeln(outwin,color(3,0)" Date Purchased:"color(2,0)videopudate)
zout = writeln(outwin,color(3,0)" Purchase Price:"color(2,0)videopuprice)
zout = writeln(outwin,color(3,0)" Sale Price :"color(2,0)videosaleprice)
zout = writeln(outwin,color(3,0)" Available :"color(2,0)videoavail)
zout = writeln(outwin,color(3,0)" Hold For :"color(2,0)videohold color(3,0)" Name:" color(2,0)currenthold)
zout = writeln(outwin,color(3,0)" Current Renter:"color(2,0)videocust color(3,0)" Name:" color(2,0)currentcust)
zout = writech(outwin, rowcol(21,1))
x = writech(outwin, color(1,0) "Press Return to Continue ...")
x = readln(outwin)
return get_a_video_number()
/*-------------------------------------------------------------------------*
*- -*
*-------------------------------------------------------------------------*/
get_a_video_number:
do forever
zout = writech(outwin,rowcol(12,1)EOD)
zout = writech(outwin,rowcol(21,1) color(1,0)"Enter Video Number ?")
vidn = readln(outwin)
if vidn = '' then leave
if datatype(vidnumber) = 'NUM' then
do
vl = length(vidn)
if vl > 5 then
do
zout = writech(outwin, color(1,0) rowcol(12,1) EOD)
zout = writeln(outwin,"Invalid Video Number, must be 5digits or less")
zout = writech(outwin, rowcol(21,1))
zout = writech(outwin,"Press Return to Continue ...")
zin = readln(outwin)
end
vidn = (copies('0',(5-vl)) || vidn) /* append leading zeros */
if vidn = '00000' then return 999999
return vidn
end
else
do
zout = writeln(outwin,"Invalid Video Number, must be Numeric")
zout = writech(outwin, rowcol(21,1))
zout = writech(outwin,"Press Return to Continue ...")
zin = readln(outwin)
end
end
return 999999
/*-------------------------------------------------------------------------*
*- -*
*-------------------------------------------------------------------------*/
rowcol:
parse arg row,col
outb = '9b'x || row || ';' || col || 'H'
return outb
/*-------------------------------------------------------------------------*
*- -*
*-------------------------------------------------------------------------*/
color:
parse arg fg,bg
outb = '9b'x || '0;3' || fg || ';4' || bg || 'm'
return outb
/*-------------------------------------------------------------------------*
*- -*
*- Load RMF files with data -*
*- This is only called when the rmf files do not exists -*
*- -*
*-------------------------------------------------------------------------*/
loaddata:
x = open(viddata,"viddata",'R')
if x = 0 then
do
zout = writeln(outwin, "could not open video data file")
return 0
end
x = open(rentdata,"rentdata",'R')
if x = 0 then
do
zout = writeln(outwin, "could not open rental data file")
return 0
end
x = open(custdata,"custdata",'R')
if x = 0 then
do
zout = writeln(outwin, "could not open customer data file")
return 0
end
/* LOAD CUSTOMER DATA */
do forever
cdata = readln(custdata)
if eof(custdata) = 1 then leave
if substr(cdata,1,1) = '#' then iterate
parse var cdata custnumber ',' custfirst ',' custlast ',' custaddr ',' ,
custcity ',' custstate ',' custzip ',' custphone ',' ,
custareacode ',' custdeposit ',' custbalance
lastname = upper(custlast)
if custbalance > 0 then
x = write_rmf_record(rmfcustomers,customerrecord,custnumber,1,lastname)
else
x = write_rmf_record(rmfcustomers,customerrecord,custnumber,1,lastname,2,custbalance)
if x = 0 then
do
say "Write Failed " any_err(rmfcustomers)
say custfirst custlast custnumber
end
end
/* LOAD VIDEO DATA */
do forever
vdata = readln(viddata)
if eof(viddata) = 1 then leave
if substr(vdata,1,1) = '#' then iterate
parse var vdata videonum ',' videotitle ',' videocopy ',' videorating ',' ,
videopudate ',' videopuprice ',' videosaleprice ',' ,
videoavail ',' videohold ',' videocust
filmcopy = strip((videonum || videocopy))
if videoavail = 'Y' then
x = write_rmf_record(rmfvideos,videorecord,videonum,1,videorating,4,filmcopy)
else
if videohold > 0 then /* hold video for this customer */
x = write_rmf_record(rmfvideos,videorecord,videonum,1,videorating,2,videohold,4,filmcopy)
else
if videocust > 0 then /* this customer has it */
x = write_rmf_record(rmfvideos,videorecord,videonum,1,videorating,3,videocust,4,filmcopy)
if x = 0 then
do
say "Write failed" any_err(rmfvideos)
say videonum videocopy
end
end
/* LOAD RENTAL DATA */
do forever
rdata = readln(rentdata)
if eof(rentdata) = 1 then leave
if substr(rdata,1,1) = '#' then iterate
parse var rdata rentalcustnumber ',' rentalvideonum ',' rentalvideocopy ',' rentaldate
filmcopy = strip( (rentalvideonum || rentalvideocopy) )
x = write_rmf_record(rmfrentals,rentalrecord,rentalvideonum,1,rentalcustnumber,2,rentaldate,3,filmcopy)
end
x = close(viddata)
x = close(rentdata)
x = close(custdata)
return 1