====== ReadO statement ====== ==== Description ==== Use to read a record that you do not intend to modify. ==== Syntax ==== **ReadO** //variable// From [//table_var// Cursor //cursorvar//], //key// Then %%|%% Else //statements// ==== Parameters ==== The ReadO statement has the following parameters. ^Parameter^Description^ |//variable//|Assigned the value of the data from the specified column of the row specified by //key//.| |//Table_var//|A table variable that has been previously specified in an [[open|Open statement]].| |cursorvar|If accessing a cursor, //cursorvar// contains a cursor variable. Cursor variables are initialized with a Select...By statement and must be preceded with the word Cursor.\\ \\ \\ If the table being accessed has had control features added, cursor access will automatically invoke domain conversion during a ReadO.| |//Key//|The row referenced by //key// will be read from the table identified by //table_var// or the table accessed using the cursor in //cursorvar//.| |Then|The statements in the Then clause will be executed if a row is read successfully.| |Else|The statement(s) following Else are executed if the row in //variable// cannot be read. The [[status|Status() function]] indicates the severity of the error, and the system variable @FILE_ERROR contains details about the nature of the error.\\ || ==== Note ==== ReadO is used to read a row that will not be updated. As a consequence, the read request may be fulfilled from any cache or buffers being maintained by the filing system. ReadO, therefore, can be a faster method of accessing data than by using the [[read|Read statement]]. In a multi-user environment, ReadO does not necessarily read the most current version of a row. Note: The definition of ReadO (and the use of caches or buffers) is specific to the filing system being used. Many filing systems do not cache data and therefore implement [[read|Read]] and ReadO identically. ==== See Also ==== [[matread|MatRead]], [[open|Open]], [[read|Read]], [[write|Write]], [[xlate|Xlate()]] ==== Example ==== /* This code fragment counts the number of bytes in the CUSTOMERS table. The result is stored in data_bytes at the end of the loop. ReadO is used because record locking is unnecessary, since the only purpose of reading each row is to determine its length. */ Open "CUSTOMERS" To customers_file Then data_bytes = 0 Select customers_file Done = 0 Loop ReadNext @id Else Done = 1 Until Done do ReadO @record From customers_file, @id Then data_bytes += len(@record) + len(@id) End Repeat /* data_bytes contains the number of data bytes in the table. */ End