OpenVMS Source Code Demos

rms-relative-demo.bas

1000	%title "OpenVMS-basic-rms-relative-demo_xxx.bas"
	%sbttl "RMS (Record Management Services) Demo"
	%ident "version 101.1"
	!========================================================================================
	! title  : OpenVMS-basic-rms-relative-demo_xxx.bas
        ! author : Neil Rieck (https://neilrieck.net/links/cool_openvms.html)
	! purpose: demos the use of RMS-based relative file access for novice OpenVMS programmers
        ! scope  : this educational program comes free of charge with no strings attached
        ! notes  : 1. OpenVMS-BASIC has 'built in' support for RMS (Record Management Services)
        !        : 2. edit environment: VT-220, 132 column, 8 column tab stops at 1,9,17,25,....
        !        : 3. all remarks begin in column 81
	! history:
	! ver who when   what
	! --- --- ------ ------------------------------------------------------------------------
	! 100 NSR 020828 1. original program
	!     NSR 020829 2. added record update
	! 101 NSR 050129 1. changed the phrase "Compaq" to "OpenVMS"
	!========================================================================================
	option type=explicit							! cuz tricks are for kids
	set no prompt								! no ? with INPUT
	!
	declare string constant k_rel_fs$ = "OpenVMS-basic-rms-relative-demo.dat"
	declare string constant k_program = "OpenVMS-BASIC-RMS-Relative-Demo"
	!
	!	mapped variables to 'lay out' a disk record
	!
	map (relative_demo)	string	d21_first_name	= 20		,! 20				&
					d21_last_name	= 20		,! 40				&
					d21_telephone	= 10		,! 50				&
					d21_address	= 20		,! 70				&
					d21_city	= 20		,! 90				&
					d21_postal	= 10		,!100				&
					fill$		= 50		,!150	room to grow		&
					d21_align	= 0		 ! to enforce map alignment
	map (relative_demo)	string	d21_whole_chunk	= 150		,!150				&
					d21_align	= 0		 ! to enforce map alignment
	!
	!	<<< declare variables >>>
	!
	declare	long	record_num%					,&
			handler_error%					,&
		string	junk$
	!
	!====================================================================================================
2000    print k_program                                                         ! display program name
        print string$( len(k_program), ascii("=") )                             ! now underline it
        on error goto trap                                                      ! legacy error handler support
        margin #0, 132                                                          ! this will not change the screen size
	!
	!	<<< delete all OpenVMS versions of our test file >>>
	!
	input "OK to delete 'demo data files'? (y/N) ";junk$
	junk$ = left$( edit$(junk$,32+2), 1)					! upcase, no white space
	goto sortie if junk$ <> "Y"
	when error in
	    while 1=1								! make sure we delete all versions
		kill k_rel_fs$							!
	    next								!
	use
	end when
	!
	!	<<< open the file >>>
	!
	!	notes:
	!	1. open k_rel_fs$  for input  as file #21	- the file must already exist
	!	2. open k_rel_fs$  for output as file #21	- a new file version is always created
	!	3. open k_rel_fs$             as file #21	- the file is created if it doesn't exit
	!
	input "OK to create/open 'demo data file'? (y/N) ";junk$
	junk$ = left$( edit$(junk$,32+2), 1)					! upcase, no white space
	goto sortie if junk$ <> "Y"
3000	when error in
		print "-i- opening file: "; k_rel_fs$
		open k_rel_fs$  as file #21					! create the file if it doesn't exist		&
			,access		modify					! we want to read + write			&
			,allow		modify					! allow others to read + write while we do it	&
			,map		relative_demo				!						&
			,organization	relative				!
		handler_error% = 0
	use
		handler_error% = err
		print "-e- error: "+str$( handler_error% )+" in phase #1"
		print "-i- text : "+ert$( handler_error% )
	end when
	goto sortie if handler_error% <> 0
	!
	!	<<< write some records >>>
	!
	input "OK to write 3 demo data records? (y/N) ";junk$
	junk$ = left$( edit$(junk$,32+2), 1)					! upcase, no white space
	goto sortie if junk$ <> "Y"
	when error in
		print "-i- writing file: "; k_rel_fs$
		d21_whole_chunk		= ""					! start with a clean buffer
		record_num%		= 0
		!
		d21_first_name		= "Joe"
		d21_last_name		= "Blow"
		d21_telephone		= "4165551111"
		d21_address		= "483 Bay Street"
		d21_city		= "Toronto"
		d21_postal		= "M5G2C9"
		record_num% = record_num% + 1
		put #21, record record_num%
		!
		d21_first_name		= "Fat"
		d21_last_name		= "Albert"
		d21_telephone		= "4165552222"
		d21_address		= "220 Simcoe Street"
		d21_city		= "Toronto"
		d21_postal		= "M5T1T4"
		record_num% = record_num% + 1
		put #21, record record_num%
		!
		d21_first_name		= "Ken"
		d21_last_name		= "Olsen"
		d21_telephone		= "4165553333"
		d21_address		= "129 Parker Street"
		d21_city		= "Toronto"
		d21_postal		= "01754"
		record_num% = record_num% + 1
		put #21, record record_num%
		!
		handler_error% = 0
	use
		handler_error% = err
		print "-e- error: "+str$( handler_error% )+" in phase #2"
		print "-i- text : "+ert$( handler_error% )
	end when
!~~~	goto sortie if handler_error% <> 0
	!
	gosub read_sequentially							! display all records
	!
	!	<<< read the file relatively (by record number) >>>
	!
	input "OK to display data records relatively? (y/N) ";junk$
	junk$ = left$( edit$(junk$,32+2), 1)					! upcase, no white space
	goto sortie if junk$ <> "Y"
	when error in
		print "-i- reading file: "; k_rel_fs$; " relatively"
		handler_error%	= 0
		record_num%	= 0
		while 1=1
			record_num% = record_num% + 1
			get #21, record record_num%, regardless			! read without applying a record lock
			print	"Record#   : ";str$( record_num% )
			print	"first name: ";	d21_first_name
			print	"last_name : ";	d21_last_name
			print	"telephone : ";	d21_telephone
			print	"address   : ";	d21_address
			print	"city      : ";	d21_city
			print	"postal    : ";	d21_postal
			print	"=============================="
			sleep 1
		next
	use
		handler_error% = err
		print "-e- error: "+str$( handler_error% )+" in phase #4 on record "+str$( record_num% )
		print "-i- text : "+ert$( handler_error% )
	end when
!~~~	goto sortie if handler_error% <> 0
	!
	!	<<< find/delete record "Blow" >>>
	!
	input "OK to delete record for 'Blow'? (y/N) ";junk$
	junk$ = left$( edit$(junk$,32+2), 1)					! upcase, no white space
	goto sortie if junk$ <> "Y"
	when error in
		reset #21							! rewind to BOF
		while 1=1
			get #21							! read with lock
			if d21_last_name = "Blow" then
				delete #21
				goto delete_done
			end if
		next
	use
		handler_error% = err
		print "-e- error: "+str$( handler_error% )+" in phase #5"
		print "-i- text : "+ert$( handler_error% )
	end when
	delete_done:
	gosub read_sequentially							! display all records
	!
	!	<<< delete record #2 >>>
	!
	input "OK to delete record #2 (y/N) ";junk$
	junk$ = left$( edit$(junk$,32+2), 1)					! upcase, no white space
	goto sortie if junk$ <> "Y"
	when error in
		get #21, record 2						! read with LOCK
		delete #21
	use
		handler_error% = err
		print "-e- error: "+str$( handler_error% )+" in phase #6"
		print "-i- text : "+ert$( handler_error% )
	end when
	gosub read_sequentially							! display all records
	!
	!	<<< find/update record for "Ken Olsen" >>>
	!
	input "OK to change Ken Olsen's City? (y/N) ";junk$
	junk$ = left$( edit$(junk$,32+2), 1)					! upcase, no white space
	goto sortie if junk$ <> "Y"
	when error in
		reset #21							! rewind to BOF
		while 1=1
			get #21							! read with lock
			if	d21_first_name		= "Ken"		and			&
				d21_last_name		= "Olsen"
			then
				d21_city		= "Maynard"
				d21_postal		= ""
				update #21
				goto update_done
			end if
		next
	use
		handler_error% = err
		print "-e- error: "+str$( handler_error% )+" in phase #7"
		print "-i- text : "+ert$( handler_error% )
	end when
	update_done:
	gosub read_sequentially							! display all records
	!
	goto sortie
	!====================================================================================================
	!	Subroutines
	!====================================================================================================
	!
	!	<<< read the file sequentially >>>
	!
4000	read_sequentially:
	input "OK to display data records sequentially? (y/N) ";junk$
	junk$ = left$( edit$(junk$,32+2), 1)					! upcase, no white space
	goto rs_exit if junk$ <> "Y"						!
	when error in
		print "-i- reading file: "; k_rel_fs$; " sequentially"
		handler_error% = 0
		reset #21							! rewind to BOF
		while 1=1
			get #21, regardless					! read without applying a record lock
			print	"first name: ";	d21_first_name
			print	"last_name : ";	d21_last_name
			print	"telephone : ";	d21_telephone
			print	"address   : ";	d21_address
			print	"city      : ";	d21_city
			print	"postal    : ";	d21_postal
			print	"=============================="
			sleep 1
		next
	use
		handler_error% = err
		print "-e- error: "+str$( handler_error% )+" in phase #3"
		print "-i- text : "+ert$( handler_error% )
	end when
	rs_exit:
	return
	!========================================================================================================================
	!       <<< Final Error Trap >>>
	!
	!       If we've done a good job coding, we should never execute this code >>>
	!========================================================================================================================
31000	trap:
	print
	print "Error in final trap"
	print "Line: ";erl
	print "Err : ";str$(err)
	print "Msg : ";ert$(err)
	resume sortie                                                           !
	!====================================================================================================
	!
	!	<<< that's all folks >>>
	!
32000	sortie:
	print "Adios..."
	end

Back to Home
Neil Rieck
Waterloo, Ontario, Canada.