WRITE
|
WSupported on Windows
|
USupported on Unix
|
VSupported on OpenVMS
|
NSupported in Synergy .NET
|
WRITE(channel, data_area[, record][, POSITION:pos_spec][, GETRFA:new_rfa] & [, RFA:match_rfa]) [[error_list]]
Arguments
channel
The channel on which the file is open. The channel must already have been opened in output, append, or update mode. (n)
data_area
An expression that contains the information to be written. (a)
record
(optional) The ID of the record to write or one of the following options. The record ID is a numeric variable whose value is the ordinal number of the desired record. On Windows and Unix, record must be passed when writing to a file other than an ISAM or relative file. (non-ISAM only)
Evaluate to the first record currently in the file.
Evaluate to the last record currently in the file.
Evaluate to the nonexistent record starting at the end of file. (Windows and Unix only)
POSITION
(optional) Specifies an absolute position in the file. See POSITION for a complete description. (non-ISAM only)
GETRFA
(optional) Returns the record’s RFA after the WRITE has been performed. See GETRFA for a complete description.
RFA
(optional) Writes the record at the specified RFA. See RFA for a complete description. (non-ISAM only)
error_list
(optional) An I/O error list. If any one of the specified errors occurs as part of the WRITE, control is transferred to the associated label.
Discussion
The WRITE statement outputs a record to a file. If the specified record already exists in the file, it is replaced. On file types other than ISAM, if the record doesn’t exist, it is created.
If you specify a WRITE with no record number to a relative file, the runtime writes the current record.
For ISAM files, the record being modified must be the record most recently retrieved (locked) by a FIND, READ, or READS statement. If it is not locked, a “Record not locked” error ($ERR_NOCURR) occurs. If you try to modify the value of a key that was not defined as modifiable when the ISAM file was created, a “Key not same” error ($ERR_KEYNOT) occurs. If the data area is longer than the defined maximum length of a record in the ISAM file, an “Invalid record size” error ($ERR_IRCSIZ) occurs, and no data is transferred to the file.
You can’t modify the primary key with the WRITE statement in an ISAM file. To modify the primary key or any key that is not modifiable, you must delete the existing record and then STORE the modified record with a new primary key. After the WRITE, any automatic record locks are released for the record. The WRITE appends a record terminator to the data area written.
A WRITE to ^EOF extends the file, and the record just written (the last record in the file) becomes the current record.
On OpenVMS, ^LAST is only supported for ISAM and relative files.
When using RFAs from a file with data compression or variable-length records, you may need to use the GETRFA option to retrieve the potentially new RFA. This isn’t necessary if the file has STATIC RFA defined.
See also
Input and output statement qualifiers
Examples
The following subroutine updates a modification tracking record.
subroutine writerec
a_datachn ,d ;Channel for data file (modlog file)
a_seqnum ,d ;Current sequence number
a_orig_seqnum ,d ;Original sequence number
a_modlog ,a ;Modification record
.define TTCHN ,1
proc
if (a_seqnum .eq. a_orig_seqnum) then
begin
write(a_datachn, a_modlog, a_seqnum)[key = badkey]
display(TTCHN, $scr_pos(5,22), "Sequence number ", ^a(a_seqnum),
& " has been updated")
read(a_datachn, a_modlog, a_seqnum) [key = badkey] ;Reread for update
end
else ;Don't let them change the sequence number
writes(TTCHN, "Sequence number may not be modified")
return
badkey,
writes(TTCHN, "Invalid key specified")
return
endsubroutine ;End of subroutine writerec
The following example references a data file that contains item information and uses the item number as the reference code. The reference codes are numerically ordered starting with item number 00001. The example gets an item code number, validates it, reads the appropriate record, updates the information, then writes the updated record back to the file.
subroutine get_item
a_maxitem ,d
a_chn ,d ;Channel opened in i:r mode
a_data ,a ;Data area for item record
.define TTCHN ,1
record
item ,a5
item_num ,d5
proc
repeat
begin
display(TTCHN, "Item #: ")
reads(TTCHN, item) [eof=done]
item_num = item
if (item_num .gt. a_maxitem .or. item_num .le. 0)
begin
display(TTCHN, "Invalid item number", $scr_mov(-1,-80),
& $scr_clr(line))
nextloop
end
read(a_chn, a_data, item_num)
xcall show_item(a_data)
xcall update_item(a_data)
write(a_chn, a_data, item_num)
end
done,
xreturn
endsubroutine
