<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://m204wiki.rocketsoftware.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Adrian</id>
	<title>m204wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://m204wiki.rocketsoftware.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Adrian"/>
	<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Special:Contributions/Adrian"/>
	<updated>2026-04-19T13:19:34Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Record_loops&amp;diff=107663</id>
		<title>Record loops</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Record_loops&amp;diff=107663"/>
		<updated>2018-02-28T06:38:45Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* FOR EACH RECORD statement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Overview==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This page identifies the statements used to create and process record loops. The &amp;lt;var&amp;gt;For Each Record&amp;lt;/var&amp;gt; statement initiates a record loop to refer to each record within a set of records, such as one located by a &amp;lt;var&amp;gt;Find&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A &amp;lt;b&amp;gt;record loop&amp;lt;/b&amp;gt; is a portion of a request that executes a series of statements once for each record in a record set before proceeding to other statements in the request.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Record loops can be nested (embedded) any number of levels deep.     &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can also use value loops, index loops, and repeat loops to execute a series of statements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Value loops perform a loop on a set of values and are discussed in detail in [[Value loops]].&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Index and repeat index loops (discussed in [[Flow of control in User Language]]) perform a loop on a set of statements.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Processing records in order===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The IN ORDER option of the FOR EACH RECORD statement processes records in index order, sort order, or sort key order, without requiring a sort of the records.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===The prefetch feature===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; supports a [[#The_prefetch (look-ahead_read) feature|prefetch feature]] (look-ahead read), which can provide performance improvements for applications containing FOR EACH RECORD statements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Processing a single record or limited number of records===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The FOR RECORD NUMBER statement provides a very efficient method to retrieve a specified record and initiate a record loop.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The FOR &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;k&amp;lt;/var&amp;gt; RECORDS statement allows you to indicate a maximum number of times the loop is to be repeated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Skip processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When you are processing a found set of records in a FOR EACH RECORD loop, you can instruct &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; to skip a specified number of records between successive iterations of the loop. This feature also allows you to process records in a forward or backward direction and, for ordered loops, allows you to process records in descending record number order within each value range.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The skip processing feature also gives you the flexibility to vary the number of records skipped, and the direction of the skip, between successive iterations of the loop. For example, between the first and second times through the loop you can skip five records forward. Then, you can again specify the number of records to skip so that between the second and third times through the loop, you skip three records backward, and so on.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Saving and recalling position in a FOR loop===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The REMEMBER and POSITION statements allow you to store the current processing position in a FOR loop, then recall it at a later time and resume FOR processing where you left off. This technique was developed primarily for use with global found sets and lists, but can be used with non-global found sets and lists as well. See [[Global features#Saving and recalling a POSITION in a FOR loop|Saving and recalling a POSITION in a FOR loop]] for a detailed discussion of this topic.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===PAI INTO statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The PAI INTO statement provides a convenient method to determine field names and values encountered within a FOR EACH RECORD loop.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FOR EACH RECORD statement==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can use the FOR EACH RECORD statement to perform: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Retrieval and looping&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Looping only&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;EACH &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;RECORD &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; RECORDS&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; -&lt;br /&gt;
[IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; ON [LIST] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/span&amp;gt;] -&lt;br /&gt;
[IN [ASCENDING &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; DESCENDING] [SORTKEY] ORDER] -&lt;br /&gt;
[BY [EACH] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt;] -&lt;br /&gt;
[FROM &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value1&amp;lt;/span&amp;gt;] [TO &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value2&amp;lt;/span&amp;gt;]&lt;br /&gt;
[BY {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/span&amp;gt;}] -&lt;br /&gt;
[OPTIMIZING FNV]&lt;br /&gt;
[{WHERE &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; WITH} &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;retrieval-conditions&amp;lt;/span&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/var&amp;gt; limits the number of records to retrieve. For example, if &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/var&amp;gt; equals 17, the first 17 records in the file are retrieved.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/var&amp;gt; specifies the label of a preceding FIND statement. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/var&amp;gt; specifies a list from a preceding FIND statement.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/var&amp;gt; identifies the field from which to retrieve values.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;value1&amp;lt;/var&amp;gt; and &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;value2&amp;lt;/var&amp;gt; specify the beginning and ending range of values to retrieve.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/var&amp;gt; or &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/var&amp;gt; specify a comparison value&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;retrieval-conditions&amp;lt;/var&amp;gt; can be:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;EQ &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; NE&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; VALUE IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value_set&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
or&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;EQ &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; NE&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; VALUE (&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;expression&amp;lt;/span&amp;gt;)&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;value_set&amp;lt;/var&amp;gt; label represents an existing value set. Values of the value set in the &amp;lt;code&amp;gt;EQ VALUE IN &amp;lt;i&amp;gt;value_set&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; clause are treated as boolean OR, for example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;i&amp;gt;field&amp;lt;/i&amp;gt; = &amp;lt;i&amp;gt;value1&amp;lt;/i&amp;gt; OR &amp;lt;i&amp;gt;field&amp;lt;/i&amp;gt; = &amp;lt;i&amp;gt;value2&amp;lt;/i&amp;gt; OR....&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;code&amp;gt;NE VALUE IN &amp;lt;i&amp;gt;value_set&amp;lt;/i&amp;gt; clause&amp;lt;/code&amp;gt; is likewise treated as boolean AND, for example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;i&amp;gt;field&amp;lt;/i&amp;gt; &amp;lt;&amp;gt; &amp;lt;i&amp;gt;value1&amp;lt;/i&amp;gt; AND &amp;lt;i&amp;gt;field&amp;lt;/i&amp;gt; &amp;lt;&amp;gt; &amp;lt;i&amp;gt;value2&amp;lt;/i&amp;gt; AND....&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
See also [[Basic SOUL statements and commands#Processing a VALUE IN clause|Processing a VALUE IN clause]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;expression&amp;lt;/var&amp;gt; is enclosed in parentheses and can be of any type listed in [[Using variables and values in computation#Using expressions for value retrieval|Using expressions for value retrieval]].&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Retrieval and looping===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When the FOR EACH RECORD statement is specified without the IN option, it functions as a FIND statement as well as initiating a loop.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This form of the FOR EACH RECORD statement is more efficient than when FOR EACH RECORD is used for looping only, because records are locked until they are processed. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Use this form when the set of records being processed is not referred to by subsequent statements outside the loop.       &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
    FOR EACH RECORD&lt;br /&gt;
        PRINT FULLNAME WITH AGENT AT COLUMN 30&lt;br /&gt;
    END FOR&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Looping only===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When the FOR EACH RECORD statement is specified with the IN/ON option, it functions as a loop statement only and refers back to a previously found set in order to process the records.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Use this form when the set of records being processed is referred to by subsequent statements outside the loop.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
GET.RECS: FIND ALL RECORDS&lt;br /&gt;
          END FIND&lt;br /&gt;
          FOR EACH RECORD IN GET.RECS&lt;br /&gt;
              PRINT FULLNAME WITH AGENT AT COLUMN 30&lt;br /&gt;
          END FOR&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Handling empty found sets===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Before doing any FOR EACH RECORD processing, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; checks to see if the referenced found set is empty. If the found set is empty, no processing takes place.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Using expressions for value retrieval===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can use expressions to provide the values in:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;the FROM ... TO clause of a FOR EACH RECORD IN ORDER BY statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;the EQ VALUE clause of a FOR EACH RECORD WHERE statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===FOR EACH RECORD IN ORDER BY===&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR EACH RECORD IN ORDER BY &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt; FROM (&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;expression1&amp;lt;/span&amp;gt;) TO (&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;expression2&amp;lt;/span&amp;gt;)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;expression1&amp;lt;/var&amp;gt; and &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;expression2&amp;lt;/var&amp;gt; are enclosed in parentheses and can be of the following types: function call, string concatenation, arithmetic operation, User Language construct, or Boolean expression.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;B&lt;br /&gt;
%MM IS STRING LEN 2&lt;br /&gt;
%DD IS STRING LEN 2&lt;br /&gt;
%MM = &#039;09&#039;&lt;br /&gt;
%DD1 = &#039;05&#039;&lt;br /&gt;
%DD2 = &#039;30&#039;&lt;br /&gt;
PRINT &#039;FR1&#039;&lt;br /&gt;
FR1:&lt;br /&gt;
IN CLIENTS FOR EACH RECORD IN ORDER BY ANNIV DATE -&lt;br /&gt;
  FROM (%MM WITH %DD1) TO (%MM WITH %DD2)&lt;br /&gt;
    PAI&lt;br /&gt;
    PRINT&lt;br /&gt;
END FOR&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===FOR EACH RECORD WHERE===&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR EACH RECORD WHERE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt; EQ VALUE (&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;expression&amp;lt;/span&amp;gt;)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;expression&amp;lt;/var&amp;gt; is enclosed in parentheses and is one of the following types: function call, string concatenation, arithmetic operation, User Language construct, or Boolean expression.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;B&lt;br /&gt;
%MM IS STRING LEN 2&lt;br /&gt;
%DD IS STRING LEN 2&lt;br /&gt;
%MM = &#039;09&#039;&lt;br /&gt;
%DD = &#039;17&#039;&lt;br /&gt;
PRINT &#039;FR1&#039;&lt;br /&gt;
FR1:&lt;br /&gt;
IN CLIENTS FOR EACH RECORD WHERE ANNIV DATE EQ VALUE(%MM WITH %DD)&lt;br /&gt;
PAI&lt;br /&gt;
PRINT&lt;br /&gt;
END FOR&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Using $LOBLEN to get the size of a Large Object data===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can tell how large a Large Object field is by issuing the $LOBLEN function using the Large Object field name in a FOR RECORD loop. The $LOBLEN function takes one argument that can be a field name or a field name variable (%%variable).&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%x=$LOBLEN(NOVEL)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
or, to determine the length of a specific occurrence of the field:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%x=$LOBLEN(NOVEL(&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;))&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;%x&amp;lt;/var&amp;gt; is set to the length, in bytes, of the Large Object field.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using the $LOBLEN and $LOBRESERVE functions===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following procedure shows how you can store some data, but have additional space to accommodate an increase in the size of the Large Object data up to the RESERVE number of bytes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
 %S IS STRING LEN 100 ARRAY(3)&lt;br /&gt;
 %S(1) = &#039;OBJECT DATA, MAX = 1000&#039;&lt;br /&gt;
 %S(2) = &#039;OBJECT DATA, MAX = 2000&#039;&lt;br /&gt;
 %S(3) = &#039;OBJECT DATA, MAX = 3000&#039;&lt;br /&gt;
 IMAGE LOB.IMAGE&lt;br /&gt;
  S IS STRING LEN 100&lt;br /&gt;
 END IMAGE&lt;br /&gt;
 PREPARE IMAGE LOB.IMAGE&lt;br /&gt;
 FOR %I FROM 1 TO 3 BY 1&lt;br /&gt;
  %LOB.IMAGE:S = %S(%I)&lt;br /&gt;
  WRITE IMAGE LOB.IMAGE ON BUFFER POSITION=1&lt;br /&gt;
  %RESERVE = %I * 1000&lt;br /&gt;
  STORE RECORD&lt;br /&gt;
   BLOB = BUFFER,1,100 RESERVE %RESERVE BYTES&lt;br /&gt;
  END STORE&lt;br /&gt;
 END FOR&lt;br /&gt;
 FR&lt;br /&gt;
  PRINT &#039;$LOBLEN=&#039; WITH $LOBLEN(BLOB)&lt;br /&gt;
  PRINT &#039;$LOBRESERVE=&#039; WITH $LOBRESERVE(BLOB)&lt;br /&gt;
  PAI LOB_DATA&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This is the output from the previous procedure:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;$LOBLEN=100&lt;br /&gt;
$LOBRESERVE=1000&lt;br /&gt;
BLOB = (length 100) (reserve 1000)&lt;br /&gt;
OBJECT DATA, MAX = 1000&lt;br /&gt;
 &lt;br /&gt;
$LOBLEN=100&lt;br /&gt;
$LOBRESERVE=2000&lt;br /&gt;
BLOB = (length 100) (reserve 2000)&lt;br /&gt;
OBJECT DATA, MAX = 2000&lt;br /&gt;
 &lt;br /&gt;
$LOBLEN=100&lt;br /&gt;
$LOBRESERVE=3000&lt;br /&gt;
BLOB = (length 100) (reserve 3000)&lt;br /&gt;
OBJECT DATA, MAX = 3000&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Other FOR EACH RECORD options===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The FOR EACH RECORD statement without any options specified processes every record in the current file or group.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Other options available for the FOR EACH RECORD statement are described in detail on this page.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Restricting FOR EACH RECORD processing==&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Use this form of the FOR EACH RECORD statement to place one or more restrictions on the retrieval of records during FOR EACH RECORD processing:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR EACH RECORD &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;OPTIMIZING FNV&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; &lt;br /&gt;
 [{WHERE &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; WITH} &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;retrieval-conditions&amp;lt;/span&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;retrieval-conditions&amp;lt;/var&amp;gt; are any conditions that are valid for the FIND statement, such as:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;EQ &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; NE&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; VALUE IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value-set&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Refer to [[Record retrievals|&amp;quot;Record retrievals&amp;quot;]] for more information about retrieval conditions.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Field name variable optimization===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The purpose of the OPTIMIZING FNV option is to prevent field name variables from triggering the retrieval of all fields and/or all occurrences of a field when used inside a FOR EACH RECORD loop. This option is valid only when you are using Parallel Query Option/204. If your site is not running Parallel Query Option/204, OPTIMIZING FNV compiles without generating errors, but is ignored.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
With the FOR EACH RECORD statement, the OPTIMIZING FNV option must be specified immediately before the WHERE or WITH clause, or, when the WHERE/WITH clause is not used, at the end of the FOR statement.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
OPTIMIZING FNV can be abbreviated to OPT FNV.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
With the OPTIMIZING FNV option, only the initial value of the field name variable(s) at the start of the FOR loop is used to select the fields to be retrieved and sent to the client node. For this option to work properly, the field name variable must have the intended value at the time the FOR loop is first executed. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A side effect of this requirement is that if the field name variable is changed, inside the FOR loop, to the name of another field that was not explicitly referenced within the loop, that field is not retrieved. In this case, a default value of null is used for the field name variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
See [[Using variables and values in computation#Field name variables|Field name variables]] for a detailed discussion.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can also use OPTIMIZING FNV with the FOR RECORD NUMBER statement. See [[#Processing a single record|Processing a single record]] for a discussion of this statement.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Using WHERE or WITH clause with other options===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the WHERE or WITH clause is used with any other option on the FOR EACH RECORD statement, the WHERE or WITH clause must be the last option specified.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can combine the IN option with the WHERE or WITH clauses in a FOR EACH RECORD statement to further filter a previously found set.  &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;begin&lt;br /&gt;
getpol: find all records for which&lt;br /&gt;
            policy no is greater than 100320&lt;br /&gt;
        end find&lt;br /&gt;
        for each record in getpol where&lt;br /&gt;
                 (total premium is greater than 393&lt;br /&gt;
                 agent is greater than &#039;CASOLA&#039;)&lt;br /&gt;
            print policy no with agent at column 30&lt;br /&gt;
        end for&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; If the retrieval conditions specified in the WHERE or WITH clause results in a direct search of the data (Table B), it is more efficient to use the FOR EACH RECORD statement without retrieval conditions specified and use the IF statement within the loop to specify the criteria.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Specify retrieval criteria on one logical line===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You must specify the retrieval criteria on one logical line. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A hyphen can be used to note the continuation of the set of conditions.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Use parentheses to continue a line. Bear in mind that &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; treats the unstated Boolean operator as an implied AND.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; The rule for using parentheses with the FOR EACH RECORD WHERE construct is different from the rule for using parentheses with the FIND construct (see [[Record retrievals#Interpretation of Boolean operators in retrievals|Interpretation of Boolean operators in retrievals]]).&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This statement is considered one logical line:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;for each record where&lt;br /&gt;
   (total premium is greater than 393&lt;br /&gt;
    agent is greater than &#039;CASOLA&#039;) or incident is T1&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, an implied AND is generated at the end of the first select criteria. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Processing records in order==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The IN ORDER option of the FOR EACH RECORD statement processes records in index order or sort order, without requiring a sort of the records. When the IN ORDER option is not used, records are processed in entry order on a segment-by-segment basis.          &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can use index order processing with fields that were defined with the ORDERED attribute. Record loops in index order execute more slowly than record loops in sort order.        &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can use sort order processing for records in a file which were defined as a sorted file. The execution of a record loop in sort order might be slower than that of an unordered record loop (if you have many spilled records) but faster than that of an index order loop. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; If the IN ORDER option processes a field that is a sort key but also has the ORDERED attribute, and if SORTKEY is not specified, index order processing is performed.         &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you want to produce a sort order which is not provided for by the syntax of the IN ORDER option, see [[Sorting#Sorting|Sorting]] for information about the SORT statement.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Reference context===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Index order and sort order processing can be performed only on records from a single file. Therefore, do not use the IN ORDER option with groups in FOR EACH RECORD loops. Such use of the IN ORDER option with groups results in a counting error and this error message:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.0243 &#039;IN ORDER&#039; NOT VALID IN GROUP CONTEXT&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you want to process records from a group in sorted order, use the SORT statement. (SORT statement processing typically is slower than index order or sort order processing.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The IN ORDER and VALUE IN options are supported in remote file context. See [[#Referring to the current value|Referring to the current value]] for a discussion of the VALUE IN option.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Specifying processing order===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the fields processed by the FOR EACH RECORD statement have the ORDERED attribute, or if the file is a sorted file, ordered processing can occur without requiring a separate sort of the found records.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the file processed is a sorted file, the SORTKEY option forces records to be processed in order according to the values of the sort key field.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This form of the FOR EACH RECORD statement demonstrates how you specify processing order:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR EACH RECORD &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; ON &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; IN &lt;br /&gt;
                [ASCENDING &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; DESCENDING] &lt;br /&gt;
                [SORTKEY] ORDER [BY &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt;] &lt;br /&gt;
                [FROM &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value1&amp;lt;/span&amp;gt;] [TO &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value2&amp;lt;/span&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ASCENDING and DESCENDING indicate the order in which the record set is sorted. ASCENDING order is the default.      &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;SORTKEY forces records to be processed in sort key order when a sorted file&#039;s sort key also has the ORDERED attribute. If SORTKEY is omitted, and the specified field is both a sort key and an ORDERED field, processing order defaults to Ordered Index order. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;BY &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/var&amp;gt; specifies the ORDERED field to be used to establish processing order. For sorted files, BY is optional.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The FROM and TO clauses specify the range of values to be processed. FROM indicates the beginning value; TO indicates an ending value. You can explicitly define a range by using both FROM and TO, or you can implicitly define a range by specifying only one of these options. Care must be taken in specifying values for FROM and TO; sort key processing behaves differently from Ordered Index processing when you use value ranges.     &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Specifying value ranges for FOR EACH RECORD processing===&lt;br /&gt;
 &lt;br /&gt;
====Records in which the BY field is not present====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If a range is specified (that is either FROM &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;value1&amp;lt;/var&amp;gt; TO &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;value2&amp;lt;/var&amp;gt; or just FROM &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;value1&amp;lt;/var&amp;gt; or just TO &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;value2&amp;lt;/var&amp;gt;), records that do not have the field present are not processed.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If no range limits are specified and a pattern is not specified using the WHERE or WITH option, records for which the field is not present are processed at the end of the ordered set.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Order of FROM and TO values====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
With sort key order processing, the values for FROM and TO can be presented in either order, for both of the ASCENDING or the DESCENDING options. For example, the two code fragments below each produce the same result:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt; ...&lt;br /&gt;
FOR EACH RECORD IN FD1 IN ASCENDING SORTKEY ORDER BY FULLNAME -&lt;br /&gt;
    FROM &#039;ALTON, CHARLES Z&#039; TO &#039;BAIN, THEODORE S&#039;&lt;br /&gt;
    PRINT FULLNAME AND POLICY NO AND STATE AND MARITAL STATUS&lt;br /&gt;
END FOR&lt;br /&gt;
 ...&lt;br /&gt;
FOR EACH RECORD IN FD1 IN ASCENDING SORTKEY ORDER BY FULLNAME -&lt;br /&gt;
    FROM &#039;BAIN, THEODORE S&#039; TO &#039;ALTON, CHARLES Z&#039;&lt;br /&gt;
    PRINT FULLNAME AND POLICY NO AND STATE AND MARITAL STATUS&lt;br /&gt;
END FOR&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
With Ordered Index processing (when SORTKEY is not specified), the order in which you specify the FROM and TO values is sensitive to whether you are doing ASCENDING or DESCENDING order processing. For example, if you are doing DESCENDING order processing, the FROM value must be higher than the TO value, as in the following example, which produces output for the year 1990 in descending INCIDENT DATE order (assuming INCIDENT DATE is defined as an ORDERED field):&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt; ...&lt;br /&gt;
FOR EACH RECORD IN FOUNDSET IN DESCENDING ORDER BY INCIDENT DATE&lt;br /&gt;
    FROM 19901231 TO 19900101&lt;br /&gt;
    PRINT &#039;DATE: &#039; WITH INCIDENT DATE WITH &#039;DRIVER NAME: &#039; -&lt;br /&gt;
          WITH FULLNAME&lt;br /&gt;
END FOR&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If, in the preceding example, you had specified DESCENDING order, but had given the range as &amp;lt;code&amp;gt;FROM 900101 TO 901231&amp;lt;/code&amp;gt;, the request would compile without producing errors, but no records would be printed. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Processing behavior with implicitly specified ranges====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can specify a value range for FOR EACH RECORD processing implicitly by using only one of the FROM and TO options. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; then makes an assumption about the unspecified end of the range before proceeding. The following table summarizes these assumptions and categorizes them based on your choice of ASCENDING or DESCENDING processing, and whether the processing is based on Ordered Index or sort key (for sorted files) order. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Sort key processing behavior for DESCENDING order with implicitly specified value ranges is the opposite of the corresponding behavior for Ordered Index processing.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;caption&amp;gt;FOR EACH RECORD processing behavior with implicitly defined value ranges&amp;lt;/caption&amp;gt;&lt;br /&gt;
&amp;lt;tr class=&amp;quot;head&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;th rowspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top&amp;quot;&amp;gt;Processing direction&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th rowspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align:top&amp;quot;&amp;gt;Range value specified&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th colspan=&amp;quot;2&amp;quot;&amp;gt;Value range processed&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Ordered Index&lt;br /&gt;
 processing&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;SORTKEY&lt;br /&gt;
processing&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td rowspan=&amp;quot;2&amp;quot;&amp;gt;ASCENDING&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;FROM only&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;From specified value&lt;br /&gt;
to highest field value&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;From specified value&lt;br /&gt;
to highest field value&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;TO only&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;From lowest field value to specified value&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;From lowest field value to specified value&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td rowspan=&amp;quot;2&amp;quot;&amp;gt;DESCENDING&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;FROM only&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;From specified value&lt;br /&gt;
to lowest field value&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;From highest field value to specified value&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;TO only&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;From highest field value&lt;br /&gt;
to specified value&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;From specified value&lt;br /&gt;
to lowest field value&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Optimization of FOR statement LIKE option===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Whenever the LIKE option is used with the FOR EACH RECORD or FOR EACH VALUE statement which is performing Ordered index processing against an existing found set or list, an attempt is made to create pattern driven terms. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; optimizes the FROM and TO values with the pattern terms to minimize Ordered Index processing. This optimization creates the most restrictive FROM and TO value based on the specified FROM and TO value (if any) and the current pattern term.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; This optimization does not take place when the FOR statement is performing both retrieval and looping (when it is used without the IN option; see [[#Retrieval and looping|Retrieval and looping]]).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For example (data = &#039;ABCG&#039; &#039;ABDG&#039; &#039;ABEG&#039; &#039;ABFG&#039; &#039;ADFG&#039; &#039;AEFG&#039;): &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;FR IN ORDER BY ORD_FLD FROM &#039;A&#039; TO &#039;ABFG&#039; LIKE &#039;ABE*&#039;&lt;br /&gt;
   PRINT ORD_FLD&lt;br /&gt;
END FOR&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The optimization changes the FROM value to ABE (more restrictive than A) and changes the TO value to ABF (more restrictive than ABFG). This results in searching just two values (ABEG and ABFG) to print ABEG. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the FROM or TO value is omitted, the optimization creates an implied FROM or TO value based on the pattern specified after the LIKE keyword. In the example above, if the FROM value were omitted, the results would be the same. The optimization would create an implied FROM value of ABE while changing the TO value to ABF.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Referring to the current value===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The current value of the ORDERED field can be referred to by using a VALUE IN phrase if the FOR EACH RECORD statement is labeled. In this example, the VALUE IN phrase is used to obtain the current value and assign it to a %variable. (See [[Using variables and values in computation]] for a discussion of %variables.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;FORNAME: FOR EACH RECORD IN ORDER BY FULLNAME&lt;br /&gt;
             %X = VALUE IN FORNAME&lt;br /&gt;
             ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Field group SORT support==&lt;br /&gt;
You can use field groups in sorted sets. SORT statement support for field groups not only allows records with field groups in them to be sorted, it lets you reference field groups in the sorted sets. For example, you can issue a FOR FIELDGROUP statement or FEO FIELDGROUP statement against the sorted set.&lt;br /&gt;
===Restrictions sorting an individual field in a field group===&lt;br /&gt;
Individual fields within field groups can cause syntax errors. In the following example INCIDENT_TYPE is a field in a field group:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
*** M204.0542: EDIT COMPLETE - GO&lt;br /&gt;
*** 1 M204.2845: INVALID FIELDGROUP CONTEXT FOR&lt;br /&gt;
INCIDENT_TYPE&lt;br /&gt;
2 SORT RECORDS IN 1 BY INCIDENT_TYPE&lt;br /&gt;
(FILE = CCATEMP , PROCEDURE = 0, LINE = 3)&lt;br /&gt;
*** M204.1042: COMPILATION ERRORS&lt;br /&gt;
&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
The previous example is invalid because the field group context for the SORT statement is the record context. In the record context, you can reference fields inside a field group if, and only if, the field is both:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In an outer level field group, which is true in the previous example&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Defined as EXACTLY-ONE or AT-MOST-ONE, which is not true in the previous example&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Without these restrictions it is ambiguous as to which occurrence a field group field reference is referring. In the previous case, OTHER_DRIVER is in field group DRIVER, but is defined as REPEATABLE. The REPEATABLE attribute makes OTHER_DRIVER ineligible to be a sort key.&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;&lt;br /&gt;
BEGIN&lt;br /&gt;
FD: IN POLICIES FD POLICY_NUMBER = 100095 OR 100096&lt;br /&gt;
END FIND&lt;br /&gt;
SR: SORT RECORDS IN FD BY MODEL&lt;br /&gt;
FR SR&lt;br /&gt;
PRINT ’MODELS:’ AND EACH MODEL&lt;br /&gt;
PRINT ’MAKES:’ AND EACH MAKE&lt;br /&gt;
END FOR&lt;br /&gt;
END&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Output:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;&lt;br /&gt;
MODELS: ENVOY TACOMA&lt;br /&gt;
MAKES: GMC TOYOTA&lt;br /&gt;
MODELS: NEW BEETLE ECLIPSE SUBURBAN&lt;br /&gt;
MAKES: VOLKSWAGEN MITSUBISHI CHEVROLET&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Usage notes for SORT processing and field groups===&lt;br /&gt;
The EACH clause for fields inside field groups is not allowed. A compile error or run-time error, depending on whether a field name variable is used or not, will be returned.&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BEGIN&lt;br /&gt;
FD: IN POLICIES FD POLICY_NUMBER = 100095 OR 100096&lt;br /&gt;
END FIND&lt;br /&gt;
SR: SORT RECORDS IN FD BY EACH MODEL&lt;br /&gt;
FR SR&lt;br /&gt;
PRINT ’MODELS:’ AND EACH MODEL&lt;br /&gt;
PRINT ’MAKES:’ AND EACH MAKE&lt;br /&gt;
END FOR&lt;br /&gt;
END&lt;br /&gt;
*** 1 M204.2845: INVALID FIELDGROUP CONTEXT FOR MODEL&lt;br /&gt;
SR: SORT RECORDS IN FD BY EACH MODEL&lt;br /&gt;
(FILE = CCATEMP, PROCEDURE = 0, LINE = 4)&lt;br /&gt;
*** M204.1042: COMPILATION ERRORS&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
An unsubscripted reference to a field in a field group in a SORT statement is allowed.&lt;br /&gt;
&lt;br /&gt;
==The prefetch (look-ahead read) feature==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The prefetch feature improves performance of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; for record-number order retrieval of a record set, particularly in a batch environment. Prefetch is for User Language applications only and applies only to Table B. It is not supported for Host Language Interface applications. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The prefetch feature initiates a read of the next Table B page when a previous page is first declared to be current. The look-ahead reads are issued for the FOR EACH RECORD sequential record retrieval mode. Look-ahead read is suppressed if the FR statement contains an IN ORDER clause or if it references a sorted set. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Performance considerations===&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You can use the prefetch feature during large, multiuser &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; runs, but it is most suitable in a batch environment.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If you use the prefetch feature with many active users, and you are near the buffer limits (see below), you might get a decrease in throughput. To use this feature effectively, each user needs reserved resources, to avoid concurrency conflicts for resources (for example, FIND record conflicts, file level locking, buffer constraints, and so on).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A major factor determining the impact of prefetch is the amount of processing per page I/O. If processing performed per page I/O cycle is high, then prefetch provides significant performance improvements. If processing per page I/O cycle is small, then performance gains are minimal (see [[#perfgains|Performance gains using the prefetch feature]]). A variety of performance tests have resulted in performance gains in the range of 10-40%.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The first of each set of diagrams in [[#perfgains|Performance gains using the prefetch feature]] shows the relationship between page I/O and processing time when the prefetch feature is disabled. The second diagram of each set reflects this relationship when the prefetch feature is in operation. Note that as the amount of processing increases, the performance gains using prefetch also increase. If &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (processing) is less than or equal to &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (page I/O, including waits), then the gain from using the prefetch feature is roughly &amp;lt;code&amp;gt;y *&amp;lt;/code&amp;gt; pages. If &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; is greater than &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, then the gain is &amp;lt;code&amp;gt;x *&amp;lt;/code&amp;gt; pages.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;perfgains&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;caption&amp;quot;&amp;gt;Performance gains using the prefetch feature&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:prefetchPerf.png|center|border|472px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The prefetch feature involves a small CPU time cost, which is application dependent; you might want to test to determine if the additional overhead is an acceptable level for a specific application in your environment.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If there is terminal I/O for each Table B page, then user delays in pressing Enter might cause a page that was preread into the buffer pool by the prefetch feature to be removed. In that case, the page would need to be read into the buffer pool again, resulting in an increased system I/O level.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The interaction of the prefetch feature and the obsolete file skewing feature can affect performance positively or negatively, depending on the amount of CPU time consumed processing each Table B page.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Enabling the feature===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The prefetch feature can be enabled only by users with system manager privileges.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Before you enable the prefetch feature, ensure sufficient above the bar or below the bar storage by setting a large enough value for the &amp;lt;var&amp;gt;[[NUMBUFG parameter|NUMBUFG]]&amp;lt;/var&amp;gt; or the &amp;lt;var&amp;gt;[[MAXBUF parameter|MAXBUF]]&amp;lt;/var&amp;gt; parameter, respectively. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To enable the prefetch feature, the system parameter &amp;lt;var&amp;gt;[[SEQOPT parameter|SEQOPT]]&amp;lt;/var&amp;gt; must be set to 1 (the default is 0).  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Processing a limited number of records==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can process only a sample of the data by using the FOR k RECORDS statement.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The form of the &amp;lt;var&amp;gt;FOR k RECORDS&amp;lt;/var&amp;gt; statement is:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;k&amp;lt;/span&amp;gt; RECORDS &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;options&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;k&amp;lt;/var&amp;gt; is an integer value of the sample size.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;options&amp;lt;/var&amp;gt; is any of the options that can be specified on a &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; statement. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===FOR k RECORDS processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;FOR k RECORDS&amp;lt;/var&amp;gt; statement begins a loop that is repeated up to &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;k&amp;lt;/var&amp;gt; times, depending on the statement. If &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;k&amp;lt;/var&amp;gt; equals zero, the loop is skipped. If &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;k&amp;lt;/var&amp;gt; is negative or if there are fewer than &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;k&amp;lt;/var&amp;gt; records, then the loop is repeated for all the records in the found set (&amp;lt;var&amp;gt;IN&amp;lt;/var&amp;gt; label).&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This request prints all information for the first five driver records in a file:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DRIVERS: IN CLIENTS FIND ALL RECORDS FOR WHICH&lt;br /&gt;
             RECTYPE = DRIVER&lt;br /&gt;
         END FIND&lt;br /&gt;
         FOR 5 RECORDS IN DRIVERS&lt;br /&gt;
             PRINT ALL INFORMATION&lt;br /&gt;
             SKIP 1 LINE&lt;br /&gt;
         END FOR&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
===Processing a single record===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
As discussed in [[Record retrievals]], the &amp;lt;var&amp;gt;POINT$&amp;lt;/var&amp;gt; condition can be used to retrieve a range of record numbers. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If single records must be retrieved by record number, a more efficient method of retrieval is with the &amp;lt;var&amp;gt;For Record Number&amp;lt;/var&amp;gt; statement.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===For Record Number processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;For Record Number&amp;lt;/var&amp;gt; statement retrieves the specified record and initiates a record loop. The record loop functions in a manner identical to a loop initiated by a &amp;lt;var&amp;gt;For Each Record&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;For Record Number&amp;lt;/var&amp;gt; statement is supported in remote file and scattered group contexts.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;For Record Number&amp;lt;/var&amp;gt; statement is:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;For Record Number &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;OPTIMIZING FNV&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;value&amp;lt;/var&amp;gt; specifies the number of the record to be processed. The value can be a literal number or string, a %variable, or a VALUE IN phrase. (The VALUE IN phrase is discussed later in this section; %variables are discussed in [[Using variables and values in computation]].) If the specified value is not numeric, or is not a valid record number in the current file, the body of the loop is bypassed and processing continues with the next statement that is at the same nesting level as the &amp;lt;var&amp;gt;For Record Number&amp;lt;/var&amp;gt; statement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt;&lt;br /&gt;
If this form of the &amp;lt;var&amp;gt;For Record Number&amp;lt;/var&amp;gt; statement is used in group context, it must be preceded by an IN clause which refers to a file. [[Files, groups, and reference context]] discusses the IN clause in detail.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The IN label clause specifies the label of a previous &amp;lt;var&amp;gt;For Each Record&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;Store Record&amp;lt;/var&amp;gt; statement. (Refer to [[Data maintenance#STORE RECORD statement|Store Record statement]] for more information.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt;&lt;br /&gt;
This form of the &amp;lt;var&amp;gt;For Record Number&amp;lt;/var&amp;gt; statement automatically assumes the file or group context of the statement to which the label refers. Therefore, it cannot be preceded by an IN clause. &amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The OPTIMIZING FNV option is used in remote context to prevent field name variables from triggering the retrieval of all fields and/or all occurrences of a field. With the FOR RECORD NUMBER statement, OPTIMIZING FNV must be specified at the end of the statement. &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
OPTIMIZING FNV is valid only in remote context; in local context, it is ignored. OPTIMIZING FNV can be abbreviated OPT FNV. See [[#Field name variable optimization|Field name variable optimization]] for a more detailed discussion.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, the IN label form of the &amp;lt;var&amp;gt;For Record Number&amp;lt;/var&amp;gt; statement is used to create one line of output from data obtained from two different found sets in different files:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
FIND1: IN MASTER FIND ALL RECORDS&lt;br /&gt;
       END FIND&lt;br /&gt;
FR1:   FOR EACH RECORD IN FIND1&lt;br /&gt;
N1:        NOTE SSNO&lt;br /&gt;
FIND2:         IN PAYROLL FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                   SSNO = VALUE IN N1&lt;br /&gt;
               END FIND&lt;br /&gt;
           FOR 1 RECORD IN FIND2&lt;br /&gt;
               FOR RECORD NUMBER IN FR1&lt;br /&gt;
                   PRINT SSNO AND NAME AND ...&lt;br /&gt;
               END FOR&lt;br /&gt;
               PRINT PAY AND DEDUCTIONS&lt;br /&gt;
           END FOR&lt;br /&gt;
       END FOR&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Returning the record number of the current record===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;[[$CURREC]]&amp;lt;/var&amp;gt; function can be used to return the record number of the record being processed. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Using an expression with For Record Number===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;For Record Number&amp;lt;/var&amp;gt; statement (abbreviation: &amp;lt;var&amp;gt;FRN&amp;lt;/var&amp;gt;) accepts an expression to supply its value.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FRN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;expression&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A multi-part expression must be enclosed in parentheses; for example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;FRN (%A + %B)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;expression&amp;lt;/var&amp;gt; is one of the following types: function call, string concatenation, arithmetic operation, SOUL construct, or Boolean expression.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Example===&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;IN FILE CLAIMS STORE RECORD&lt;br /&gt;
   ...&lt;br /&gt;
END STORE&lt;br /&gt;
IN FILE CLAIMS FRN $CURREC&lt;br /&gt;
   ...&lt;br /&gt;
END FOR&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skip processing==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can direct &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; to process a user-specified fraction of a record set (for example, every third record) with the FOR EACH RECORD statement. This is called skip processing, and the skipping can be forward (from the beginning of the record set to the end) or backward. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For Ordered Index record sets that have duplicate field values, you can invoke a skip processing option to process the record set by ascending or descending record number (as described in [[#Descending record number processing|Descending record number processing]]), within each Ordered Index value. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Forward or backward skip processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Skip processing is invoked for a &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;FOR EACH VALUE&amp;lt;/var&amp;gt; statement by including a &amp;lt;var&amp;gt;BY&amp;lt;/var&amp;gt; clause with the following syntax:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;BY&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/var&amp;gt; or &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/var&amp;gt; indicates how many records to skip before retrieving the record to process in the next iteration of the &amp;lt;var&amp;gt;FOR&amp;lt;/var&amp;gt; loop. If set to &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/var&amp;gt;, every &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/var&amp;gt;th record is processed (and &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/var&amp;gt;-1 records are skipped in between). The value of &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/var&amp;gt; or &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/var&amp;gt; must be an integer between and including positive or negative 2,147,483,647. A setting of zero is not allowed. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Negative settings invoke backward skipping. However, you cannot skip backward in a given record set until you have first skipped forward in the record set. This is equivalent to saying that you cannot start at the beginning of the record set and skip backward. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can change the direction and number of records to skip each time through the loop by using a %variable in the &amp;lt;var&amp;gt;BY&amp;lt;/var&amp;gt; clause and changing the value of the %variable inside the loop. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; checks the value of the %variable immediately before beginning the next iteration of the loop.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can use backward processing with Ordered Index record sets only if one of the following is true:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;EACH&amp;lt;/var&amp;gt; is specified in the &amp;lt;var&amp;gt;FOR&amp;lt;/var&amp;gt; statement.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The field in question is defined with &amp;lt;var&amp;gt;OCCURS 1&amp;lt;/var&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The field in question is defined with &amp;lt;var&amp;gt;AT-MOST-ONE&amp;lt;/var&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Specifying ascending or descending order with ORDERED fields===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you are processing ORDERED fields, use the following FOR EACH RECORD syntax to get skip processing in ascending or descending order. The placement of the skip processing BY clause in the FOR EACH VALUE statement syntax is similar.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR EACH RECORD &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; ON &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
 IN &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;ASCENDING &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; DESCENDING&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; ORDER BY &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;FROM &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value1&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;TO &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value2&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;BY &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;WHERE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt; IS LIKE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;pattern&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Use the following syntax for unordered and sorted record sets:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR EACH &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;RECORD &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; VALUE&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;foundset&amp;lt;/span&amp;gt;&lt;br /&gt;
         BY &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Use the following syntax for record sets from sorted files:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR EACH RECORD &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; ON &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; IN SORTKEY ORDER&lt;br /&gt;
 BY &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt; BY &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;SORTKEY&amp;lt;/var&amp;gt; invokes skip processing in order according to the values of the sort key field. The sort key field is &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/var&amp;gt; in the first &amp;lt;var&amp;gt;BY&amp;lt;/var&amp;gt; clause.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If you do not specify &amp;lt;var&amp;gt;SORTKEY&amp;lt;/var&amp;gt;, and &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/var&amp;gt; in the first &amp;lt;var&amp;gt;BY&amp;lt;/var&amp;gt; clause is both a sort key and an &amp;lt;var&amp;gt;ORDERED&amp;lt;/var&amp;gt; field, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; uses skip processing for the Ordered Index ordering of the &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/var&amp;gt; values.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following example demonstrates the flexibility of skip processing. Note that the value of the skip increment, &amp;lt;code&amp;gt;%I&amp;lt;/code&amp;gt; in this example, is recomputed inside the FOR loop. This allows both the direction of and the interval of the skip to be different for each iteration of the loop. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;***************************************************************&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;*  THIS ROUTINE FINDS THE NUMBER OF A RECORD WHOSE VALUE&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;*  EQUALS OR PRECEDES THAT OF %LONGNAME.  IT SETS USE.REC&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;*  TO THAT RECORD NUMBER. A BINARY SEARCH IMPLEMENTED WITH&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;*  SKIP PROCESSING IS USED TO DETERMINE THE RECORD NUMBER.&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;***************************************************************&lt;br /&gt;
BEGIN&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;* PROCEDURE TO PERFORM BINARY SEARCH IN SORTED FILES USING SKIP&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;* BY %VAR&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;* %V CONTAINS A VALUE TO BE FOUND&lt;br /&gt;
%FOUND   = 0&lt;br /&gt;
FND:&lt;br /&gt;
 FIND ALL RECORDS&lt;br /&gt;
END FIND&lt;br /&gt;
CT:&lt;br /&gt;
COUNT RECORDS IN FND&lt;br /&gt;
%COUNT =  COUNT IN CT&lt;br /&gt;
%I = %COUNT / 2&lt;br /&gt;
%BGN = 0&lt;br /&gt;
%END = %COUNT + 1&lt;br /&gt;
%C = %I&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;* %C IS THE CENTER POINT REACHED BY THE NEW %I&lt;br /&gt;
FOR EACH RECORD IN FND IN SORTKEY ORDER BY FIELD1 BY %I&lt;br /&gt;
IF FIELD1 EQ %V THEN&lt;br /&gt;
   %FOUND   = 1&lt;br /&gt;
   JUMP TO GOT.NUM&lt;br /&gt;
 ELSEIF FIELD1 GT %V THEN&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;* GOING BACKWARD&lt;br /&gt;
   %END = %C&lt;br /&gt;
   %I = -(%END - %BEG)/2&lt;br /&gt;
   %C = %END + %I&lt;br /&gt;
 ELSE&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;* GOING FORWARD&lt;br /&gt;
   %BEG = %C&lt;br /&gt;
   %I = (%END - %BEG) / 2&lt;br /&gt;
   %C = %BEG + %I&lt;br /&gt;
 END IF&lt;br /&gt;
 IF %I EQ 0 THEN&lt;br /&gt;
  %I = 1&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;* SKIP VALUE MAY NOT BE ZERO EVEN WHEN WE LEAVE THE LOOP&lt;br /&gt;
  JUMP TO GOT.NUM&lt;br /&gt;
 END IF&lt;br /&gt;
END FOR&lt;br /&gt;
GOT.NUM:&lt;br /&gt;
IF %FOUND = 0 THEN&lt;br /&gt;
 PRINT &#039;NOT FOUND: &#039; %V&lt;br /&gt;
ELSE&lt;br /&gt;
 PRINT &#039;FOUND: &#039; %V&lt;br /&gt;
END IF&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Descending record number processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can process Ordered Index record sets in descending record number order per field value. The FOR EACH RECORD statement skip processing option is extended to permit descending record number ordering. Previously, IN ORDER BY processing was always in ascending record number order. &amp;lt;i&amp;gt;This extension is only valuable for processing record sets in which a field has duplicate data values.&amp;lt;/i&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For example, use the following syntax for Ordered Index skip processing with record number ordering. The extension to skip processing syntax is shown in bold. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;FOR EACH RECORD &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;IN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; ON &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
 IN [ASCENDING &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; DESCENDING] ORDER BY &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt; [FROM &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value1&amp;lt;/span&amp;gt;] [TO &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;value2&amp;lt;/span&amp;gt;]&lt;br /&gt;
 [BY [&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;ASCENDING RECORD&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; &amp;lt;b&amp;gt;DESCENDING RECORD&amp;lt;/b&amp;gt;] {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/span&amp;gt;}]&lt;br /&gt;
 [WHERE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt; IS LIKE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;pattern&amp;lt;/span&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;ASCENDING RECORD&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;DESCENDING RECORD&amp;lt;/var&amp;gt; indicates the records are to be processed in ascending or descending record number within &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/var&amp;gt; value. If neither &amp;lt;var&amp;gt;ASCENDING&amp;lt;/var&amp;gt; nor &amp;lt;var&amp;gt;DESCENDING&amp;lt;/var&amp;gt; is specified, the default is &amp;lt;var&amp;gt;ASCENDING RECORD&amp;lt;/var&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If specified with the &amp;lt;var&amp;gt;IN ORDER BY&amp;lt;/var&amp;gt; clause, a &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/var&amp;gt; or &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;literal&amp;lt;/var&amp;gt; value is required when the skip processing &amp;lt;var&amp;gt;BY&amp;lt;/var&amp;gt; is specified. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Examples===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In [[#Example 1|Example 1]], the record set below is processed using the default behavior of the &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; statement. In [[#Example 2|Example 2]], it is processed using a &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; statement with record number ordering. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr class=&amp;quot;head&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Record number &amp;lt;br&amp;gt;(value of field RECNO)&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Value of field ORDCHAR&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;01&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;02&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;03&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;B&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;04&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;B&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;05&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;C&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;06&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;C&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;07&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;08&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;09&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;B&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;B&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;C&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;C&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Example 1====&lt;br /&gt;
Prior to skip processing and record number ordering, the &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; statement ordering by field name was always in ascending record number order, as the output from the following statements show:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;PRINT &#039;ORDCHAR&#039; AND &#039;RECNO&#039;&lt;br /&gt;
FR IN label IN DESCENDING ORDER BY ORDCHAR&lt;br /&gt;
  PRINT ORDCHAR WITH RECNO AT 9&lt;br /&gt;
END FOR&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
These statements print ascending record numbers within the descending ORDCHAR values: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;ORDCHAR RECNO&lt;br /&gt;
C       05&lt;br /&gt;
C       06&lt;br /&gt;
C       11&lt;br /&gt;
C       12&lt;br /&gt;
B       03&lt;br /&gt;
B       04&lt;br /&gt;
B       09&lt;br /&gt;
B       10&lt;br /&gt;
A       01&lt;br /&gt;
A       02&lt;br /&gt;
A       07&lt;br /&gt;
A       08&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Example 2====&lt;br /&gt;
In this example, the &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; statement specifies record number ordering:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;PRINT &#039;ORDCHAR&#039; AND &#039;RECNO&#039;&lt;br /&gt;
FR IN label IN DESCENDING ORDER BY ORDCHAR -&lt;br /&gt;
            BY DESCENDING RECORD %variable&lt;br /&gt;
    PRINT ORDCHAR WITH RECNO AT 9&lt;br /&gt;
END FOR&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
These statements print descending record numbers within the descending &amp;lt;var&amp;gt;ORDCHAR&amp;lt;/var&amp;gt; values:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;ORDCHAR RECNO&lt;br /&gt;
C       12&lt;br /&gt;
C       11&lt;br /&gt;
C       06&lt;br /&gt;
C       05&lt;br /&gt;
B       10&lt;br /&gt;
B       09&lt;br /&gt;
B       04&lt;br /&gt;
B       03&lt;br /&gt;
A       08&lt;br /&gt;
A       07&lt;br /&gt;
A       02&lt;br /&gt;
A       01&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;noteStmt&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Note statement==&lt;br /&gt;
&amp;lt;!--Caution: &amp;lt;div&amp;gt; above--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
As described in [[Introduction to User Language#Fields|Fields]], &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; retrieves sets of records by means of one or more fields contained in each record. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
By using the &amp;lt;var&amp;gt;Note&amp;lt;/var&amp;gt; statement, you can cause &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; to temporarily store the value of any field in the retrieved set, permitting its use in subsequent retrievals within the same request.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; The &amp;lt;var&amp;gt;Note&amp;lt;/var&amp;gt; statement has been deprecated in favor of using [[#Alternative: use assignment statements|assignment statements]] for subsequent retrievals and cross referencing.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This statement directs &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; to remember the value of a retrieved field:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;label: Note &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;fieldname&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Note processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A &amp;lt;var&amp;gt;Note &amp;lt;i&amp;gt;fieldname&amp;lt;/i&amp;gt;&amp;lt;/var&amp;gt; statement can be used only within a &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;FOR RECORD NUMBER&amp;lt;/var&amp;gt; loop. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Each time the loop is executed, another record in the retrieved set is processed and the value of the field in that record is saved. This value can then be used in a subsequent &amp;lt;var&amp;gt;Find&amp;lt;/var&amp;gt; statement by using the &amp;lt;var&amp;gt;Value In&amp;lt;/var&amp;gt; phrase to refer to the noted value.   &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Example===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following request finds all current and potential policyholders in cities covered by the agent &amp;lt;code&amp;gt;GOODRICH&amp;lt;/code&amp;gt;:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;begin&lt;br /&gt;
get.agent:     find all records for which&lt;br /&gt;
                   agent = &#039;GOODRICH&#039;&lt;br /&gt;
               end find&lt;br /&gt;
process:       for each record in get.agent&lt;br /&gt;
city.name:         note city&lt;br /&gt;
city.val:          find all records for which&lt;br /&gt;
                       city = value in city.name&lt;br /&gt;
                   end find&lt;br /&gt;
print.info:        for each record in city.val&lt;br /&gt;
                       print city with agent at column 20 -&lt;br /&gt;
                           with policy no at column 40&lt;br /&gt;
                   end for&lt;br /&gt;
               end for&lt;br /&gt;
tot.goodrich:  count records in get.agent&lt;br /&gt;
               print count in tot.goodrich&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt; label begins a loop. Cross-referencing (see the next section) is repeated until all records with &amp;lt;code&amp;gt;agent = &#039;GOODRICH&#039;&amp;lt;/code&amp;gt; have been processed. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;city&amp;lt;/code&amp;gt; label notes the city of each record for agent &amp;lt;code&amp;gt;GOODRICH&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;city.val&amp;lt;/code&amp;gt; label retrieves all records in the file, regardless of agent, that have a value equal to the noted city. The &amp;lt;code&amp;gt;print.info&amp;lt;/code&amp;gt; statement prints the city, agent, and policy number, and then &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; loops back to the &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt; label and notes the city on the next &amp;lt;code&amp;gt;agent = &#039;GOODRICH&#039;&amp;lt;/code&amp;gt; record, and so on. When all &amp;lt;code&amp;gt;agent = &#039;GOODRICH&#039;&amp;lt;/code&amp;gt; records have been exhausted, execution continues with the &amp;lt;code&amp;gt;tot.goodrich&amp;lt;/code&amp;gt; label.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Alternative: Use assignment statements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The functions of the &amp;lt;var&amp;gt;Note&amp;lt;/var&amp;gt; statement can be performed more efficiently with the assignment statement because the assignment statement uses less user table space during compilation. See also:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Using variables and values in computation#Assigning values to %variables|Assigning values to %variables]]&amp;lt;/li&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;li&amp;gt;[[Large request considerations#Description of tables|Description of tables]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the preceding example, an assignment statement could be used by replacing &amp;lt;code&amp;gt;note city&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;%city = city&amp;lt;/code&amp;gt;, as in the following example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;begin&lt;br /&gt;
%city is string len 255&lt;br /&gt;
get.agent:     find all records for which&lt;br /&gt;
                   agent = &#039;GOODRICH&#039;&lt;br /&gt;
               end find&lt;br /&gt;
process:       for each record in get.agent&lt;br /&gt;
                   %city = city&lt;br /&gt;
city.val:          find all records for which&lt;br /&gt;
                       city = %city&lt;br /&gt;
                   end find&lt;br /&gt;
print.info:        for each record in city.val&lt;br /&gt;
                       print city with agent at column 20 -&lt;br /&gt;
                           with policy no at column 40&lt;br /&gt;
                   end for&lt;br /&gt;
               end for&lt;br /&gt;
tot.goodrich:  count records in get.agent&lt;br /&gt;
               print count in tot.goodrich&lt;br /&gt;
end&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Noting character strings===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following form of the &amp;lt;var&amp;gt;Note&amp;lt;/var&amp;gt; statement can be used to set a value for later reference by the &amp;lt;var&amp;gt;Value In&amp;lt;/var&amp;gt; phrase: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;label: NOTE &#039;string&#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
NAME:      NOTE &#039;ABBOTT, FRANKLIN G&#039;&lt;br /&gt;
FIND.RECS: FIND ALL RECORDS FOR WHICH&lt;br /&gt;
               FULLNAME = VALUE IN NAME&lt;br /&gt;
           END FIND&lt;br /&gt;
CT:        COUNT RECORDS IN FIND.RECS&lt;br /&gt;
           PRINT COUNT IN CT -&lt;br /&gt;
               WITH &#039; RECORDS FOR &#039; -&lt;br /&gt;
               WITH VALUE IN NAME&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
results in the output:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;output&amp;quot;&amp;gt;2 RECORDS FOR ABBOTT, FRANKLIN G&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Refer to [[#Nested loops|Nested loops]] for an additional example using the &amp;lt;var&amp;gt;Value In&amp;lt;/var&amp;gt; phrase.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cross-referencing==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Cross-referencing involves using a field from one record to find another record or set of records.The following examples illustrate the use of cross-referencing.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Efficient cross-referencing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This example illustrates a technique for creating efficient cross-referencing requests. Consider the CLIENTS and VEHICLES files that contain records for people and records for cars, respectively. Records might be related by having a common field (for example, POLICY NO in one file and OWNER POLICY in the other). To find the total premium paid by each policyholder owning a SAAB, you could write this request: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%OWNER_POLICY IS STRING LEN 6&lt;br /&gt;
SAABS:       IN VEHICLES FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                 MAKE = SAAB&lt;br /&gt;
             END FIND&lt;br /&gt;
             FOR EACH RECORD IN SAABS&lt;br /&gt;
                 %OWNER_POLICY = OWNER POLICY&lt;br /&gt;
POLICY.VAL:      IN CLIENTS FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                     POLICY NO = %OWNER_POLICY&lt;br /&gt;
                     RECTYPE = POLICYHOLDER&lt;br /&gt;
                 END FIND&lt;br /&gt;
                 FOR EACH RECORD IN POLICY.VAL&lt;br /&gt;
                     PRINT POLICYHOLDER -&lt;br /&gt;
                         WITH TOTAL PREMIUM TO COLUMN 25&lt;br /&gt;
                 END FOR&lt;br /&gt;
             END FOR SAABS&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Moving constant retrieval outside FOR loop===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the first statement retrieves 500 records with MAKE = SAAB, the FIND statement in POLICY.VAL is executed 500 times. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The cost of a FIND is directly related to the number of retrieval conditions specified. In Example 1, the retrieval condition RECTYPE = POLICYHOLDER is the same for each repetition of POLICY.VAL. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Greater efficiency is gained by moving constant retrieval conditions outside the FOR loop. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
SAABS:       IN VEHICLES FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                 MAKE = SAAB&lt;br /&gt;
             END FIND&lt;br /&gt;
POL.HOLDERS: IN CLIENTS FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                 RECTYPE = POLICYHOLDER&lt;br /&gt;
             END FIND&lt;br /&gt;
SAAB.LOOP:   FOR EACH RECORD IN SAABS&lt;br /&gt;
POLICY:          NOTE OWNER POLICY&lt;br /&gt;
POLICY.VAL:      FIND ALL RECORDS IN POL.HOLDERS FOR WHICH&lt;br /&gt;
                     POLICY NO = VALUE IN POLICY&lt;br /&gt;
                 END FIND&lt;br /&gt;
                 FOR EACH RECORD IN POLICY.VAL&lt;br /&gt;
                     PRINT POLICYHOLDER -&lt;br /&gt;
                         WITH TOTAL PREMIUM TO COLUMN 25&lt;br /&gt;
                 END FOR&lt;br /&gt;
             END FOR&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Record locking considerations===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The preceding technique might not be appropriate for an application in which many users retrieve data from and update the same file concurrently. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The POLICYHOLDER records in the second request are locked out from updates for the duration of the request. In the first request, the POLICYHOLDER records would be accessible for updating between repetitions of the outer loop. Refer to [[Record level locking and concurrency control#Record locking and release statements|Record locking and release statements]] for more discussion.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Nested loops===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following example illustrates cross-referencing with nested loops. This request finds all drivers of vehicles used for carpool purposes who also have a vehicle that is not used for carpools.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This example illustrates referring to noted values in output statements.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
             SET HEADER 1 &#039;PRINCIPLE DRIVER&#039; -&lt;br /&gt;
                 WITH &#039;POLICY NO.&#039; AT COLUMN 20&lt;br /&gt;
             SET HEADER 2&lt;br /&gt;
             NEW PAGE&lt;br /&gt;
FD.CARPOOLS: IN VEHICLES FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                 USAGE = CARPOOL&lt;br /&gt;
             END FIND&lt;br /&gt;
             FOR EACH RECORD IN FD.CARPOOLS&lt;br /&gt;
NOTE.DRIVER:     NOTE PRINCIPLE DRIVER&lt;br /&gt;
FD.NO.CP:        FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                     PRINCIPLE DRIVER = VALUE IN NOTE.DRIVER&lt;br /&gt;
                     USAGE = NOT CARPOOL&lt;br /&gt;
                 END FIND&lt;br /&gt;
                 FOR EACH RECORD IN FD.NO.CP&lt;br /&gt;
                     PRINT VALUE IN NOTE.DRIVER AT COLUMN 5 -&lt;br /&gt;
                        WITH OWNER POLICY AT COLUMN 22&lt;br /&gt;
                 END FOR&lt;br /&gt;
             END FOR&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===The VALUE IN phrase===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The VALUE IN phrase can be used in place of an explicit field name in a PRINT statement. Each time the loop containing the PRINT statement is executed, the current value of the noted field is printed. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This output is generated by the PRINT statement in the previous request:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;PRINCIPLE DRIVER    POLICY NO.&lt;br /&gt;
 &lt;br /&gt;
    100735            100304&lt;br /&gt;
    102081            100865&lt;br /&gt;
    101693            100761&lt;br /&gt;
      .                 .&lt;br /&gt;
      .                 .&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The VALUE IN phrase can be used in SET HEADER and SET TRAILER statements to print what was noted. VALUE IN also can be used to replace any value in a retrieval statement (FIND).                &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Counting records in a found set==&lt;br /&gt;
 &lt;br /&gt;
===Issues===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Records retrieved by a FOR EACH RECORD statement cannot be counted using the COUNT RECORDS statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In addition, counting records retrieved by a FIND statement and counted within a record loop can produce unexpected results. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Example===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Consider the problem of trying to count the total number of records retrieved by the FIND.RECS statement below:       &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%zip is string len 5&lt;br /&gt;
get.agent: find all records for which&lt;br /&gt;
               agent = &#039;CASOLA&#039;&lt;br /&gt;
           end find&lt;br /&gt;
           for each record in get.agent&lt;br /&gt;
               %zip = zip&lt;br /&gt;
find.recs:     find all records for which&lt;br /&gt;
                   zip = %zip&lt;br /&gt;
               end find&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Suppose 25 records were found each time through the loop, or 100 records after four iterations. Then the sequence:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;              .&lt;br /&gt;
              .&lt;br /&gt;
              .&lt;br /&gt;
ct.recs:      count records in find.recs&lt;br /&gt;
              print count in ct.recs&lt;br /&gt;
          end for&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
would print, not 100, but&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;25&lt;br /&gt;
25&lt;br /&gt;
25&lt;br /&gt;
25&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
and the sequence&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;               .&lt;br /&gt;
               .&lt;br /&gt;
               .&lt;br /&gt;
ct.recs:       count records in find.recs&lt;br /&gt;
           end for&lt;br /&gt;
print.ct:  print count in ct.recs&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
would print only the last of the four counts, or&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;25&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Solution===&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The correct total could be obtained by the following statements (which use the assignment statement discussed in [[Using variables and values in computation#Assigning values to %variables|Assigning values to %variables]]):&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;                .&lt;br /&gt;
                .&lt;br /&gt;
                .&lt;br /&gt;
 &lt;br /&gt;
ct.recs:       count records in find.recs&lt;br /&gt;
 &lt;br /&gt;
               %total = %total + count in ct.recs&lt;br /&gt;
 &lt;br /&gt;
           end for&lt;br /&gt;
 &lt;br /&gt;
print.ct:  print %total&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
However, this technique would be accurate only if the record found by the FIND.RECS statement was not found in any earlier iteration. If the records were found earlier, then a list should be used to arrive at the correct total. [[Lists#Lists|Lists]] describes the statements used to create lists.       &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PRINT ALL INFORMATION (or PAI) INTO statement==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The PRINT ALL INFORMATION (PAI) INTO statement lets you move a record&#039;s field names and values into a form of storage that can be easily manipulated. The benefits of the PAI INTO statement include an effective copy-record capability, and also a convenient way to determine field names and values encountered within a FOR EACH RECORD loop.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Syntax&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The form of the PAI INTO statement is:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;PRINT ALL INFORMATION option INTO&lt;br /&gt;
                      array_1, array_2, [array_3]&lt;br /&gt;
                      [FROM start] [COUNT ct]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Where&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;option can be one of the following and specifies how Large Object fields are handled:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
LOB_DATA &amp;amp;mdash; If the LOB is 255 bytes or less and the field value array element is large enough, the LOB data is copied to the field value array element. Otherwise, $STATUS is set to 2, $STATUSD is set to 3, and the entire record is output in PAI format to the output device.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The default option for the PAI INTO statement is LOB_DATA.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
LOB_SHORT_DATA &amp;amp;mdash; Copies the first 255 bytes of the LOB data to the field value array element.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
LOB_NO_DATA &amp;amp;mdash; No LOB data is copied to the field value array. The field name and LOB descriptor are copied to array_1 and array_3, respectively.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
LOB_NONE &amp;amp;mdash; No LOB information--field name, LOB data, nor LOB descriptor--is copied to the output arrays.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;array_1 through array_3 are string %variable or image item arrays. This form of the PAI statement fills:&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
array_1 with field names&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
array_2 with field values&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
array_3 with the Large Object descriptor, of at least 27 bytes starting at X&#039;800000&#039;, from which you can extract the field length, reserve, and so on.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When writing requests using the PAI INTO statement, remember to add a subscript to the name of each array variable. The subscripts determine which element of the array receives the first value generated by the PAI INTO statement. The subscripts for the three arrays should be the same, and, unless you have a specific reason for wanting to reserve elements at the beginning of the arrays, the value of each subscript should be 1, as shown in [[#PRINT ALL INFORMATION (or PAI) INTO statement|PRINT ALL INFORMATION (or PAI) INTO statement]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The lengths of the field name and field value arrays must equal, respectively, the length of the longest known field name plus one and the length of the longest known field value plus one. The extra byte is required for the length byte which precedes each field name and field value. The length of the Large Object descriptor must be at least 27 bytes, otherwise you will get a $STATUSD=4 return code.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;start is a scalar %variable. If supplied, start is a relative field pointer indicating where to start extracting field values. The default is 1.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ct is a scalar %variable that indicates the number of fields that have been extracted from the record after the PAI INTO statement executes. If you specify ct as a %variable, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; uses the %variable as a counter to keep track of the number of fields extracted. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Usage===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The PAI INTO statement writes only to the arrays, not to the terminal.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Error messages===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Error messages are issued if the INTO arguments are not string arrays, or if ct is a literal. Since PAI INTO can fail for a variety of storage-related reasons, error conditions are stored in $STATUS and $STATUSD. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The possible $STATUS values are:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;right&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;PAI INTO completed successfully.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;right&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;PAI INTO failed, see $STATUSD for details.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
$STATUSD values are:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;right&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;PAI INTO completed successfully.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;right&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;PAI INTO failed because either the field name array, the field value array, or the Large Object descriptor array was not large enough to contain all of the record&#039;s fields.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;right&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;PAI INTO failed because a field name was too large for an array element.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;right&amp;quot;&amp;gt;3&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;PAI INTO failed because a field value was too large for an array element.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;right&amp;quot;&amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;PAI INTO failed because a Large Object descriptor was too large for an array element.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If $STATUSD is nonzero, then the value of the ct %variable contains the index value (as in the arrays shown in the following example) of the last field name and value successfully extracted. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Record locking with PAI processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When you are processing unlocked records (such as records on lists or in sets produced via FIND WITHOUT LOCKS) through a PAI loop in local context, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; puts a share lock on each record as it is being processed. This lock prevents other updating users from changing records as they are being processed, but might cause record locking conflicts.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To help catch such conflicts, add an ON RECORD LOCKING CONFLICT unit to User Language procedures using PAI against unlocked records.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When you are using the Parallel Query Option/204 and you are working with a remote file, no locks are issued against the records in the remote file since &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; works from a local copy of the remote records.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Example===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following schematic example shows one way to set up a PAI INTO statement to perform a &amp;quot;copy record&amp;quot; function.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DECLARE %FIELDNAM IS STRING LEN 20 ARRAY(100)&lt;br /&gt;
DECLARE %FIELDVAL IS STRING LEN 80 ARRAY(100) NO FS&lt;br /&gt;
DECLARE %FGO IS FIXED&lt;br /&gt;
DECLARE %RET IS FIXED&lt;br /&gt;
DECLARE %STAT IS FIXED&lt;br /&gt;
DECLARE %INDX IS FIXED&lt;br /&gt;
 &lt;br /&gt;
FINDLOOP:  IN FILE1 FIND ALL RECORDS...&lt;br /&gt;
           FOR EACH RECORD IN FINDLOOP&lt;br /&gt;
STORELOOP: IN FILE2 STORE RECORD&lt;br /&gt;
              END STORE&lt;br /&gt;
              %FGO = 1&lt;br /&gt;
              PAI INTO %FIELDNAM(1), %FIELDVAL(1) FROM %FGO -&lt;br /&gt;
                 COUNT %RET&lt;br /&gt;
              %STAT = $STATUS&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;*      (optional error processing goes here)&lt;br /&gt;
              FOR RECORD NUMBER IN STORELOOP&lt;br /&gt;
                 FOR %INDX FROM 1 to %RET&lt;br /&gt;
                    IF %FIELDVAL(%INDX) NE &amp;amp;apos;&amp;amp;apos; THEN&lt;br /&gt;
                       ADD %%FIELDNAM(%INDX) = %FIELDVAL(%INDX)&lt;br /&gt;
                    ELSE&lt;br /&gt;
                       ADD %%FIELDNAM(%INDX) = &amp;amp;apos;&amp;amp;apos;&lt;br /&gt;
                    END IF&lt;br /&gt;
                 END FOR&lt;br /&gt;
              END FOR&lt;br /&gt;
           END FOR&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Null field values===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Notice that the ADD statement logic in the previous example includes an ELSE clause that forces processing of null field values. This logic is necessary because assigning a null value from a %variable stores nothing in the output file. If you do not need to copy null field values, then omit this special processing.           &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- end of toc limit div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:SOUL]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Methods&amp;diff=105055</id>
		<title>Methods</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Methods&amp;diff=105055"/>
		<updated>2018-02-01T14:21:50Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* Named parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As discussed in [[Classes and Objects]], a &amp;lt;var&amp;gt;Class&amp;lt;/var&amp;gt; block can contain declaration blocks and/or &#039;&#039;&#039;method&#039;&#039;&#039; definitions. This page describes the characteristics of these class methods and &lt;br /&gt;
their definitions. For information about defining special-purpose methods that are less broadly applicable and therefore not part of the class, see [[Local and Common entities]].  &lt;br /&gt;
&lt;br /&gt;
==Method definition syntax==&lt;br /&gt;
All declaration blocks must appear before any method definitions. A method definition consists of the method header, which is basically a reiteration of the method declaration, the method body (code), and an End method statement:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodHeader&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;[[#Internal parameter names|internalNamesBlock]]&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodBody&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;End&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodType&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodName&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;methodHeader&#039;&#039; must nearly match the method declaration (which is described in detail in [[Classes and Objects#Method declarations and method types|Method declarations and method types]]), except:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Named parameters do not have to appear in the same order. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The optional &amp;lt;var&amp;gt;Public&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;Private&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; indication may be present on one and not the other. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameter names must be present on the method declarations (as opposed to the &amp;lt;var&amp;gt;Declare Subroutine&amp;lt;/var&amp;gt; statement) and must match the parameter names in the method header. This redundancy may seem extreme, it has several benefits:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It ensures that a complete method description is available in both the declaration block and the method definition. The former is convenient for users of the class and someone trying to understand the class as a whole. The latter is convenient for someone looking at the method in isolation. Meaningful parameter names on the method declarations will make the method functionality much clearer than the parameter datatype alone. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Complete redundancy makes it possible to cut-and-paste or copy a method declaration to the method definition, or vice versa. The method body consists of the code that implements the method or methods. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;props&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;Functions&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Subroutines&amp;lt;/var&amp;gt; have one method, but &amp;lt;var&amp;gt;Properties&amp;lt;/var&amp;gt; can have two methods: one for retrieving the property (a &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt; method), and one for setting the property (a &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; method). The &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; methods are enclosed in &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; blocks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;Property&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;(parameters)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;Is&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;type&amp;lt;/span&amp;gt;&lt;br /&gt;
  [[#Internal parameter names|&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;internalNamesBlock&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;]]&lt;br /&gt;
  &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;Get&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;getmethodBody&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;End Get&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodName&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;Set&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;setmethodBody&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;End Set&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodName&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;End&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;Property&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodName&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; methods can appear in any order inside the &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; definition block, though must both appear within a single property definition block. &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; methods have a &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt; method only. &amp;lt;var&amp;gt;WriteOnly&amp;lt;/var&amp;gt; methods have a &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; method only.&lt;br /&gt;
&lt;br /&gt;
==Comparing methods to complex subroutines==&lt;br /&gt;
Methods behave very much like &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; [[Subroutines|complex subroutines]], and they have some important differences:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Methods can have optional parameters, that is, parameters not specified in the method invocation. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Method Input parameters (unless they are arrays) are passed to the method by value &amp;amp;mdash; by copying the corresponding argument values provided when the method is invoked, instead of working with a pointer to the argument values. This copying allows the parameters to be updated within the method without consequence to the arguments outside the method.  Method Output parameters are passed by reference &amp;amp;#x2014; pointers to the argument values are passed instead of argument value copies, and updates to the parameters within the method affect the actual arguments outside the method. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;methobj2&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Instance-specific (non-&amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt;) methods always have an implicit input parameter: the object on which they operate, also known as the &#039;&#039;&#039;method object&#039;&#039;&#039;. This implicit object can be referred to by the parameter name &amp;lt;var&amp;gt;%this&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; It is not valid to declare a local variable named &amp;lt;code&amp;gt;%this&amp;lt;/code&amp;gt; in non-&amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; methods because it is implicitly declared by &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;. &amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; method in a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; has another implicit input parameter: the value to which the property is being set. This parameter has the same name as the property. For example, if a property is called &amp;lt;code&amp;gt;Height&amp;lt;/code&amp;gt;, the input value in a &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; method for an instance-specific (non-shared) method may be referenced as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%this:height&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Within the &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; method, the input value is copied (not referenced directly), so it may be updated. &amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Methods, being part of a class, can access the &amp;lt;var&amp;gt;Private&amp;lt;/var&amp;gt; methods and variables in a class. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;All statement labels within a method definition must be unique. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Local variables in methods are always auto-initialized upon entry. They take either their explicit Initial values or implicit initial values by datatype (0 for Fixed and Float, a null string for &amp;lt;var&amp;gt;String&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Longstring&amp;lt;/var&amp;gt;, a null for Objects). &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Local variables are always stacked for recursive entry to methods. That is, if a method is called directly by itself or indirectly by other methods, the subsequent executions get their own copies of all local variables. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Object variables and &amp;lt;var&amp;gt;Longstrings&amp;lt;/var&amp;gt; are automatically cleaned up on exit from methods. Object variables are set to null, and if a variable is the last reference to an object, the object is discarded (see, [[Object variables]]). &amp;lt;var&amp;gt;Longstrings&amp;lt;/var&amp;gt; are set to null, and any CCATEMP pages associated with the &amp;lt;var&amp;gt;Longstrings&amp;lt;/var&amp;gt; are freed. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Methods that return a value must have the return value indicated on the &amp;lt;var&amp;gt;Return&amp;lt;/var&amp;gt; statement. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Examples of method definitions==&lt;br /&gt;
&lt;br /&gt;
====Function====&lt;br /&gt;
The following is an example of a Function that adds an amount to a private variable and returns the new value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class account&lt;br /&gt;
  private&lt;br /&gt;
    variable balance is fixed dp 2&lt;br /&gt;
  end private&lt;br /&gt;
  public&lt;br /&gt;
    function adjustBalance(%amount is fixed dp 2) -&lt;br /&gt;
         is fixed dp 2 callable&lt;br /&gt;
  end public&lt;br /&gt;
 &lt;br /&gt;
  function adjustBalance(%amount is fixed dp 2) is fixed dp 2 callable&lt;br /&gt;
    %this:balance = %this:balance + %amount&lt;br /&gt;
    return %this:balance&lt;br /&gt;
  end function&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
%myAccount is object account&lt;br /&gt;
 ...&lt;br /&gt;
%balance = %myAccount:adjustBalance(50.00)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
If the application does not need the new balance resulting from the &amp;lt;code&amp;gt;AdjustBalance&amp;lt;/code&amp;gt;, the last line could be written:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%myAccount:adjustBalance(50.00) &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As when invoking &amp;lt;var&amp;gt;Variable&amp;lt;/var&amp;gt; members of a class, the colon (&amp;lt;tt&amp;gt;:&amp;lt;/tt&amp;gt;) that separates the object variable &amp;lt;code&amp;gt;%myaccount&amp;lt;/code&amp;gt; and the method &amp;lt;code&amp;gt;adjustBalance&amp;lt;/code&amp;gt;, above, may alternatively be specified with a single blank before and/or after it.&lt;br /&gt;
&lt;br /&gt;
====Property====&lt;br /&gt;
The following example illustrates a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; that returns or sets a temperature in Fahrenheit, and that uses a public variable to retrieve or set the Celsius temperature. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class thermometer&lt;br /&gt;
&lt;br /&gt;
public&lt;br /&gt;
  variable celsius is float&lt;br /&gt;
  property fahrenheit is float&lt;br /&gt;
end public&lt;br /&gt;
property fahrenheit is float&lt;br /&gt;
  get&lt;br /&gt;
    return (1.8 * %this:celsius) + 32&lt;br /&gt;
  end get&lt;br /&gt;
  set&lt;br /&gt;
    %this:celsius = (%fahrenheit - 32) / 1.8&lt;br /&gt;
  end set&lt;br /&gt;
  end property fahrenheit&lt;br /&gt;
end class&lt;br /&gt;
 &lt;br /&gt;
%temp is object thermometer&lt;br /&gt;
 ...&lt;br /&gt;
%temp:fahrenheit = %input&lt;br /&gt;
 ...&lt;br /&gt;
print &#039;Temperature fahrenheit: &#039; %temp:fahrenheit&lt;br /&gt;
print &#039;Temperature celsius: &#039; %temp:celsius&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inside a non-shared method, references to the implicit input object, &amp;lt;code&amp;gt;%this&amp;lt;/code&amp;gt;, can omit the &amp;amp;#x201C;this:&amp;amp;#x201D; and refer to public and private class variables as if they were local variables. For example, the above &amp;lt;code&amp;gt;Fahrenheit&amp;lt;/code&amp;gt; property could have been written as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;property fahrenheit is float&lt;br /&gt;
get&lt;br /&gt;
return (1.8 * %celsius) + 32&lt;br /&gt;
end get&lt;br /&gt;
 ...&lt;br /&gt;
end property fahrenheit&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Nevertheless, the &amp;lt;code&amp;gt;this:&amp;lt;/code&amp;gt; can be specified to make clear that a reference is to a class variable or to distinguish a class variable from a local variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;property fahrenheit is float&lt;br /&gt;
 ...&lt;br /&gt;
  set&lt;br /&gt;
    %celsius is fixed dp 2&lt;br /&gt;
    %this:celsius = (%fahrenheit - 32) / 1.8&lt;br /&gt;
    %celsius = %this:celsius&lt;br /&gt;
    print &#039;Temperature changed to &#039; %celsius&lt;br /&gt;
  end set&lt;br /&gt;
end property fahrenheit  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because a local variable is accessed instead of a class variable by the same name, the &amp;lt;code&amp;gt;%this&amp;lt;/code&amp;gt; is required to reference the class variable inside a class method. This precedence of local variables ahead of class variables means that public or private variables can be added to a class without fear of &amp;amp;#x201C;breaking&amp;amp;#x201D; methods that might have local variables with the same name. This might be important in very large classes with many methods. There are other cases where the &amp;lt;code&amp;gt;%this&amp;lt;/code&amp;gt; is required to access the method object.&lt;br /&gt;
&lt;br /&gt;
====Subroutine====&lt;br /&gt;
The following is an example of a &amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt; that sets a private class variable and then displays all private variables in the class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class comic&lt;br /&gt;
  private&lt;br /&gt;
    variable name is string len 32&lt;br /&gt;
    variable pratfalls is fixed&lt;br /&gt;
    variable trademark is longstring&lt;br /&gt;
  end private&lt;br /&gt;
  public&lt;br /&gt;
    subroutine display(%newName is string len 32)&lt;br /&gt;
  end public&lt;br /&gt;
  subroutine display(%newName is string len 32)&lt;br /&gt;
    %name = %newName&lt;br /&gt;
    print &#039;Name = &#039; %name&lt;br /&gt;
    print &#039;Pratfalls = &#039; %pratfalls&lt;br /&gt;
    print &#039;Trademark = &#039; %trademark&lt;br /&gt;
  end subroutine display&lt;br /&gt;
end class&lt;br /&gt;
%stooge is object comic&lt;br /&gt;
 ...&lt;br /&gt;
%stooge:display(&#039;Curly&#039;)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;b id=&amp;quot;optionalParams&amp;quot;&amp;gt;&amp;lt;/b&amp;gt;Optional and default parameters==&lt;br /&gt;
Methods support optional parameters, that is, parameters that do not need to be passed on every invocation of the method. For example, suppose a function returns the number of items in a bin. And suppose that function can be passed a number of items to add to the bin. Usually when the function is invoked, no items are added, but once in a while, they are. So the function can be declared as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class bin&lt;br /&gt;
 ...&lt;br /&gt;
public&lt;br /&gt;
 ...&lt;br /&gt;
function numberOfItems(%add is fixed optional)&lt;br /&gt;
 ...&lt;br /&gt;
end public&lt;br /&gt;
 ...&lt;br /&gt;
end class &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Given this declaration, the function could be invoked as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%yellow is object bin&lt;br /&gt;
 ...&lt;br /&gt;
%yellow = new&lt;br /&gt;
 ...&lt;br /&gt;
print %yellow:numberOfItems &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can also be invoked as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;print %yellow:numberOfItems() &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And, finally, in cases where a value is to be passed to the method, it could be invoked as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%items = %yellow:numberOfItems(%number) &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When a parameter is optional and it is not passed by the invoker, that parameter has a standard value, based on its datatype, inside the method. This standard value is the standard initial value for a variable of the parameter&#039;s datatype. These initial values for each datatype are the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
&amp;lt;dt&amp;gt;String &amp;lt;dd&amp;gt;A null (zero-length) string.&lt;br /&gt;
&amp;lt;dt&amp;gt;Longstring &amp;lt;dd&amp;gt;A null (zero-length) string.&lt;br /&gt;
&amp;lt;dt&amp;gt;Float &amp;lt;dd&amp;gt;0.&lt;br /&gt;
&amp;lt;dt&amp;gt;Fixed &amp;lt;dd&amp;gt;0.&lt;br /&gt;
&amp;lt;dt&amp;gt;Object &amp;lt;dd&amp;gt;Null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Because specifying the &amp;lt;var&amp;gt;Optional&amp;lt;/var&amp;gt; keyword for an &amp;lt;var&amp;gt;Object&amp;lt;/var&amp;gt; parameter means that the absence of the parameter presents a null object parameter variable to the method, &amp;lt;var&amp;gt;Optional&amp;lt;/var&amp;gt; implies the &amp;lt;var&amp;gt;AllowNull&amp;lt;/var&amp;gt; keyword and, in fact, it cannot be specified along with &amp;lt;var&amp;gt;AllowNull&amp;lt;/var&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dt&amp;gt;Structure &amp;lt;dd&amp;gt;Each item in the structure is given its default initial value, which is the same as indicated in this list for the other datatypes, unless an Initial clause was used in a structure item declaration in the structure definition. So, if a method is defined as follows: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;function square(%number is float optional)&lt;br /&gt;
 ...&lt;br /&gt;
return %number * %number&lt;br /&gt;
 ...&lt;br /&gt;
end function &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following will print &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;print %object:square &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the &amp;amp;#x201C;simple&amp;amp;#x201D; datatypes &amp;lt;var&amp;gt;Fixed&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;Float&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;String&amp;lt;/var&amp;gt;, it is possible to specify an alternative value to be passed to a method for an unspecified argument. This is done by specifying the &amp;lt;var&amp;gt;Default&amp;lt;/var&amp;gt; keyword instead of &amp;lt;var&amp;gt;Optional&amp;lt;/var&amp;gt;. As of Sirius Mods 7.1, default values can also be specified for &amp;lt;var&amp;gt;Enumeration&amp;lt;/var&amp;gt; parameters, including &amp;lt;var&amp;gt;Booleans&amp;lt;/var&amp;gt;. The &amp;lt;var&amp;gt;Default&amp;lt;/var&amp;gt; keyword must be followed by a string, numeric, or enumeration constant in parentheses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;function square(%number is float default(-1))&lt;br /&gt;
 ...&lt;br /&gt;
return %number * %number&lt;br /&gt;
 ...&lt;br /&gt;
end function &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the following statement prints &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; since the square of -1 is 1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;print %object:square &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following method declaration uses an alternative default string value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine addCustomer(%lname is string len 32 -&lt;br /&gt;
default(&#039;***Unknown***&#039;) ) &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following method indicates a default value of &amp;lt;code&amp;gt;Share&amp;lt;/code&amp;gt; for a &amp;lt;var&amp;gt;LockStrength&amp;lt;/var&amp;gt; enumeration parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;function getRecord(%key is string len 10, -&lt;br /&gt;
%ls is enumeration lockstrength default(share)) -&lt;br /&gt;
    is object record in file foo &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional or default parameters are allowed on any kind of method: functions, subroutines, properties, or constructors. Constructors, especially, can often benefit greatly from optional parameters as there are often extra qualifiers for newly instantiated objects that might be present, but often are not. For example, one might have a constructor for a product object that allows, but does not require, the specification of a product code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;constructor new(%productCode is string len 8 optional) &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, the &amp;lt;code&amp;gt;New&amp;lt;/code&amp;gt; function could then be invoked with or without the optional&lt;br /&gt;
product code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%cake = new&lt;br /&gt;
 ...&lt;br /&gt;
%pie = new(&#039;31415929&#039;) &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;b id=&amp;quot;isPresent&amp;quot;&amp;gt;&amp;lt;/b&amp;gt;Is [Not] Present test for optional or default parameter===&lt;br /&gt;
&lt;br /&gt;
Generally, it is sufficient for a method to simply use the replacement value for an optional or default parameter without caring whether that value was specified explicitly or generated implicitly. For example, if a method is declared as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine increment(%amount is fixed default(1)) &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It probably does not matter whether it is invoked as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%object:increment(1) &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%object:increment &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, there may be cases where a method wants to distinguish between the two cases. For example, consider the following class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class incident&lt;br /&gt;
  public&lt;br /&gt;
    subroutine setComment( -&lt;br /&gt;
      %comment is string len 64 optional)&lt;br /&gt;
      ...&lt;br /&gt;
  end public&lt;br /&gt;
  private&lt;br /&gt;
    variable haveComment is float&lt;br /&gt;
    variable comment is string len 64&lt;br /&gt;
    ...&lt;br /&gt;
  end private&lt;br /&gt;
  ...&lt;br /&gt;
end class &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A null string might be a valid comment, but it also might be useful to be able to use the &amp;lt;code&amp;gt;SetComment&amp;lt;/code&amp;gt; method defined above to indicate that there is no comment. So, it might be necessary to distinguish the following two invocations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%object:setComment&lt;br /&gt;
 ...&lt;br /&gt;
%object:setComment(&#039;&#039;) &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make this possible, SOUL provides the &amp;lt;var&amp;gt;Is Present&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Is Not Present&amp;lt;/var&amp;gt; tests for optional and default method parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine setComment(%comment is string len 64 optional)&lt;br /&gt;
  if %comment is present then&lt;br /&gt;
    %this:haveComment = 1&lt;br /&gt;
    %this:comment = %comment&lt;br /&gt;
  else&lt;br /&gt;
    %this:haveComment = 0&lt;br /&gt;
    %this:comment = &#039;&#039;&lt;br /&gt;
  end if&lt;br /&gt;
end subroutine setComment &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;var&amp;gt;Is Present&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Is Not Present&amp;lt;/var&amp;gt; tests can be especially useful in code where the default value is not a constant. The most common example of this is a date parameter that is usually the current date, but not always. For example, consider a constructor that sets the start date for a transaction to the current date, unless an optional date is passed&lt;br /&gt;
to the constructor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;constructor new(%startDate is string len 8 optional)&lt;br /&gt;
if %startDate is not present then&lt;br /&gt;
  %startDate = $sir_date(&#039;YYYYMMDD&#039;)&lt;br /&gt;
end if &lt;br /&gt;
 ... &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
While the same thing could probably be accomplished, in this case, by checking for a null value, it is a bit neater to check for the presence of the parameter.&lt;br /&gt;
&lt;br /&gt;
==Named parameters==&lt;br /&gt;
Methods support &amp;lt;b&amp;gt;named parameters&amp;lt;/b&amp;gt;, that is, parameters that are passed by name rather than position. For example, one might have a method called &amp;lt;code&amp;gt;Roundabout&amp;lt;/code&amp;gt; that has a parameter that specifies a value for an exit. It might be invoked as follows:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%bypass:roundabout(&#039;KIDLINGTON&#039;)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
If the first parameter for this method were allowed to be invoked by name, this method might also be invoked as:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%bypass:roundabout(exit=&#039;KIDLINGTON&#039;)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
As this example illustrates, a named parameter is indicated by the name of the parameter followed by an equal sign, which is then followed by any expression that is to be assigned to the parameter.&lt;br /&gt;
&lt;br /&gt;
Named parameters are supported for both system and user-written methods.&lt;br /&gt;
&lt;br /&gt;
Arguments that are passed by name are called &amp;lt;b&amp;gt;named&amp;lt;/b&amp;gt; arguments, while those that are not are called &amp;lt;b&amp;gt;positional&amp;lt;/b&amp;gt; arguments, because their meaning is determined by their position in an argument list. While a method can be invoked with both positional and named arguments, all the positional arguments must precede the named arguments. That is, the following is valid because all the positional arguments precede the named ones:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%mini:addPetrol(24, &#039;Stratford&#039;, price=89.5, brand=&#039;BP&#039;)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
But the following is invalid because the named parameter litres precedes the positional parameter &amp;lt;code&amp;gt;Stratford&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%mini:addPetrol(litres=24, &#039;Stratford&#039;, price=89.5)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
A name on an argument can be allowed or required. If allowed, the argument can be specified either positionally or by name. If required, the argument can only be specified by name. Whether the name on an argument is allowed or required has nothing to do with whether the argument is required. That is, just as positional parameters can be required, Optional, or Default, so too can named parameters. That said, named parameters will tend to be optional, since required parameters usually have a fixed position in a parameter list.&lt;br /&gt;
&lt;br /&gt;
As noted before, system methods can have named parameters. To determine which parameters on a system method are positional, name allowed, or name required, see the documentation for that method. An example of a system method with a name required parameter is the &amp;lt;var&amp;gt;ParseLines&amp;lt;/var&amp;gt; method, which has a name required (but optional) &amp;lt;var&amp;gt;StripTrailingNull&amp;lt;/var&amp;gt; parameter:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt; %list:parseLines(%string, stripTrailingNull=false)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
For user-written methods, the distinction between positional, name allowed, and name required parameters is made on the method declaration and definition header. By default, the parameters in user-written methods are positional. For example, in the following method declaration, all parameters are positional:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine display(%customerId is string len 10, -&lt;br /&gt;
                   %startyear is float, -&lt;br /&gt;
                   %showFamily is enumeration boolean optional, -&lt;br /&gt;
                   %showEmployer is enumeration boolean optional, -&lt;br /&gt;
                   %showMedical is enumeration boolean optional)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
So the method might be invoked as follows:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%cust:display(%crn, %year, true, , true)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
To indicate that a name can be used for a parameter, the &amp;lt;var&amp;gt;NameAllowed&amp;lt;/var&amp;gt; keyword should be specified on the parameter declaration:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine display(%customerId is string len 10, -&lt;br /&gt;
                   %startyear is float, -&lt;br /&gt;
                   %showFamily is enumeration boolean optional, -&lt;br /&gt;
                   %showEmployer is enumeration boolean optional, -&lt;br /&gt;
                   %showMedical is enumeration boolean optional nameAllowed)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
So that the method could then be invoked either as before, or as follows:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%cust:display(%crn, %year, true, , showMedical=true)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Even though the parameter name is declared with a leading percent character (&amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt;), the name of the parameter when invoking the method should exclude the percent character. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;var&amp;gt;NameRequired&amp;lt;/var&amp;gt; keyword is specified on a parameter definition, the parameter must always be passed as a named argument rather than a positional one:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine display(%customerId is string len 10, -&lt;br /&gt;
                   %startyear is float, -&lt;br /&gt;
                   %showFamily is enumeration boolean optional, -&lt;br /&gt;
                   %showEmployer is enumeration boolean optional, -&lt;br /&gt;
                   %showMedical is enumeration boolean optional nameRequired)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
If a parameter other than the last is specified with &amp;lt;var&amp;gt;NameAllowed&amp;lt;/var&amp;gt;, all parameters after that are also treated as if &amp;lt;var&amp;gt;NameAllowed&amp;lt;/var&amp;gt; were specified on their declarations. That is, the following two declarations are equivalent:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine display(%customerId is string len 10, -&lt;br /&gt;
                   %startyear is float, -&lt;br /&gt;
                   %showFamily is enumeration boolean optional nameAllowed, -&lt;br /&gt;
                   %showEmployer is enumeration boolean optional nameAllowed, -&lt;br /&gt;
                   %showMedical is enumeration boolean optional nameAllowed)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine display(%customerId is string len 10, -&lt;br /&gt;
                   %startyear is float, -&lt;br /&gt;
                   %showFamily is enumeration boolean optional nameAllowed, -&lt;br /&gt;
                   %showEmployer is enumeration boolean optional, -&lt;br /&gt;
                   %showMedical is enumeration boolean optional)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Similarly, a &amp;lt;var&amp;gt;NameRequired&amp;lt;/var&amp;gt; keyword implies &amp;lt;var&amp;gt;NameRequired&amp;lt;/var&amp;gt; for all subsequent parameters. A NameRequired parameter can follow a NameAllowed parameter though, of course, all parameters after the NameRequired parameter are also assumed to be &amp;lt;var&amp;gt;NameRequired&amp;lt;/var&amp;gt;, whether or not that keyword is specified. A NameAllowed parameter cannot follow a NameRequired parameter. Named arguments can be specified in any order, so given the above declaration, the following two invocations are identical:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%cust:display(%crn, %year, showFamily=true, showMedical=false)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%cust:display(%crn, %year, showMedical=false, showFamily=true)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
There are many reasons to use named parameters. One is to make method invocations easier to understand. If a method has many parameters, the invocations can look like:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%cust:display(%crn, %year, true, false)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
And, if a programmer looking at this did not have the parameters for this method memorized, she would have to go to the method declaration to have an idea of what was being done here. But naming the arguments makes the code much clearer:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%cust:display(%crn, %year, showFamily=true, showMedical=false)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
As this example illustrates, named parameters can be particularly useful for boolean switches that alter the behavior of a method, especially when there are many of these switches.&lt;br /&gt;
&lt;br /&gt;
Another advantage of named parameters is that they are order independent. This means that place-holders do not have to be specified for optional parameters that are not specified on their invocation. This is especially important for methods with many optional parameters. For example, in the absence of named parameters, a method with seven optional parameters might be invoked as follows:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%mini:drive(,,,,,,,65)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Such a call can be made much easier to read, and much less error prone, by using a named parameter:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%mini:drive(speed=65)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Named parameters can also be useful to delay decisions about parameter order. That is, if a method has, say, two optional parameters, and it is not immediately obvious which one is most likely to be used more often (and thus be the first positional parameter), the parameters can be initially declared as NameRequired:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine add(%oil is float optional nameRequired, -&lt;br /&gt;
               %petrol is float optional nameRequired)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
All invocations of the method would then have to use names:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%mg:add(petrol=18)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
If after some experience, it is determined that one parameter is much more commonly used than another, that parameter can be changed to a &amp;lt;var&amp;gt;NameAllowed&amp;lt;/var&amp;gt; parameter:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine add(%petrol is float optional &amp;lt;var&amp;gt;NameAllowed&amp;lt;/var&amp;gt;, -&lt;br /&gt;
               %oil is float optional nameRequired)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
When that change is made, invocations of the method can use the &amp;lt;var&amp;gt;NameAllowed&amp;lt;/var&amp;gt; parameter positionally:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%mg:add(18)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Note that this delaying tactic can even be useful with non-optional parameters, if there is a possibility that some of the non-optional parameters might be made optional some day &amp;amp;mdash; perhaps after appropriate defaults are determined.&lt;br /&gt;
&lt;br /&gt;
Finally, named parameters can be used to &amp;amp;#x201C;rescue&amp;amp;#x201D; a (retrospectively) bad decision about parameter order. For example, if after some use, it is determined that for a method with many parameters, the fifth parameter is more often specified than any of the earlier parameters, it can be turned into a &amp;lt;var&amp;gt;NameAllowed&amp;lt;/var&amp;gt; parameter, making it possible to specify that parameter without having to specify the earlier parameters. All this said, named parameters are not a panacea. There are some drawbacks to using named parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;They make method invocations more verbose, sometimes with little or no benefit. This is especially true for methods with one or two parameters where the meaning of the parameter(s) are obvious from the name of the method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Time and care must be taken to chose good parameter names. Once a parameter name is chosen for a named parameter, it can be quite difficult to change it, as this would require changing all code that specifies that parameter name in a method invocation.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, as with most programming constructs, the use of named parameters is an art rather than a science. As named parameters should be used where appropriate, they should be avoided where inappropriate. But other than the vague and not inviolate principle that named parameters are more likely to be useful in methods with more parameters, the appropriateness of named parameters is a subjective matter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; A final point should be made about named parameters: their syntax is somewhat of an inconsistency in &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;User Language&amp;lt;/var&amp;gt;. In most contexts where user-written expressions are allowed, an equal sign is treated as a comparison operator. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, in the following statement the variables &amp;lt;code&amp;gt;%value&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;%crn&amp;lt;/code&amp;gt; are compared, and, if equal, the global &amp;lt;code&amp;gt;CRN&amp;lt;/code&amp;gt; is set to 1, otherwise it is set to 0: &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;$setg(&#039;CRN&#039;, %value=%crn)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
If &amp;lt;code&amp;gt;%value&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%crn&amp;lt;/code&amp;gt; were not defined, this statement would generate a compilation error.&lt;br /&gt;
&lt;br /&gt;
Given this syntactic structure, one might expect that a named argument in a method invocation would be interpreted as a comparison of a field name with a value. For example, one might expect the argument to the &amp;lt;var&amp;gt;New&amp;lt;/var&amp;gt; method to be the result of a comparison between field &amp;lt;code&amp;gt;Host&amp;lt;/code&amp;gt; and the variable &amp;lt;code&amp;gt;%target&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%socket = new(host=%target)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
The reality is that the use of the equal sign is almost always limited to conditions in an &amp;lt;var&amp;gt;If&amp;lt;/var&amp;gt; statement, so one probably wouldn&#039;t expect to find a comparison in the above context. Object-oriented SOUL takes one step further by interpreting any single token followed by an equal sign in a method parameter as a named argument, whether or not what is to the left of the equal sign is a valid parameter name. For example, the following will produce a compilation error, even if &amp;lt;code&amp;gt;%input&amp;lt;/code&amp;gt; is a defined variable, and even though it is not a valid parameter name:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%object:doIfTrue(%input = 1)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
In the odd cases where one really wants to pass the result of an equality comparison to a method, the alternative character comparison operator can be used:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%object:doIfTrue(%input eq 1)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
or, the comparison can be wrapped in an extra parenthesis:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%object:doIfTrue((%input eq 1))&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Internal parameter names==&lt;br /&gt;
A method declaration contains a description of method parameters. A parameter description includes the parameter name, type, and attributes (&amp;lt;var&amp;gt;Optional&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;AllowNull&amp;lt;/var&amp;gt;, and so on). The names should be descriptive, as this makes it easier for users of a method to understand what the method does by looking at its declaration. For example, the following method declaration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine fill(%petrol is float, %oil is float)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is much more helpful than this declaration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine fill(%x is float, %y is float)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the availability of named parameters, the use of meaningful parameter names becomes even more important, because the parameter names will actually appear in the method invocations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%multipla:fill(oil=0.5)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is possible that the ideal names for method declarations are not the ideal names for the parameters inside the actual methods themselves. For example, one might have a standard that all parameters should start with &amp;lt;code&amp;gt;parm.&amp;lt;/code&amp;gt; in method code, so that it is easy to tell which variables are parameters. If this standard is extended to the names on the declaration, the result is ugly and redundant parameter names in declarations and method invocations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%multipla:fill(parm.oil=0.5)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;var&amp;gt;InternalNames&amp;lt;/var&amp;gt; block is provided to allow mapping of parameter names on declarations to another name to be used inside the method, making it possible to use the optimal names on method declarations and inside methods, even if the two names are not the same.&lt;br /&gt;
&lt;br /&gt;
The syntax of the &amp;lt;var&amp;gt;InternalNames&amp;lt;/var&amp;gt; block is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;InternalNames&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;newName&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;Is&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;parameterName&amp;lt;/span&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;End InternalNames&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;newName&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name to be assigned to that parameter for internal use.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;parameterName&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the parameter as it appears in the method declaration.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;var&amp;gt;InternalNames&amp;lt;/var&amp;gt; statement must be the first statement after a method definition header, which means that for properties it must appear before the &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; blocks.&lt;br /&gt;
&lt;br /&gt;
For properties, the &amp;lt;var&amp;gt;InternalNames&amp;lt;/var&amp;gt; block changes the names of parameters for both the &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; methods. &amp;lt;var&amp;gt;InternalNames&amp;lt;/var&amp;gt; can be used to rename implicit parameters, such as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;%this, which is used to reference the method object. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The input value parameter for properties, which has the same name as the property (preceded by a percent). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the following example, the input variables &amp;lt;code&amp;gt;%petrol&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;%oil&amp;lt;/code&amp;gt; are mapped to the names &amp;lt;code&amp;gt;%parm.petrol&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;%parm.oil&amp;lt;/code&amp;gt;, respectively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine add(%petrol is float nameRequired optional, -&lt;br /&gt;
  %oil is float nameRequired optional)&lt;br /&gt;
internalNames&lt;br /&gt;
  %parm.petrol is %petrol&lt;br /&gt;
  %parm.oil is %oil&lt;br /&gt;
end internalNames&lt;br /&gt;
...&lt;br /&gt;
%petrol = %petrol + %parm.petrol&lt;br /&gt;
%oil = %oil + %parm.oil&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example illustrates how if &amp;lt;code&amp;gt;petrol&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;oil&amp;lt;/code&amp;gt; were private class variables, the &amp;lt;var&amp;gt;InternalNames&amp;lt;/var&amp;gt; block makes it possible to have parameters in a method declaration with the same name, but to avoid naming conflict or confusion between the private class variables and the parameter names.&lt;br /&gt;
&lt;br /&gt;
==Stringing method invocations together==&lt;br /&gt;
Often, a method will return an object, that is, an instance of a class. In such cases, it is possible to invoke another method against the result object by stringing together method invocations.&lt;br /&gt;
&lt;br /&gt;
In the following example, the method object for the &amp;lt;code&amp;gt;Slap&amp;lt;/code&amp;gt; subroutine is the object returned by the &amp;lt;code&amp;gt;Call&amp;lt;/code&amp;gt; function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class comic&lt;br /&gt;
  public&lt;br /&gt;
    function call(%name is string len 32) is object comic&lt;br /&gt;
    subroutine slap&lt;br /&gt;
    ...&lt;br /&gt;
  end public&lt;br /&gt;
  ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
%moe is object comic&lt;br /&gt;
 ...&lt;br /&gt;
%moe:call(&#039;Curly):slap &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The same is true for stringing a method invocation to an object variable in a class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class comic&lt;br /&gt;
  public&lt;br /&gt;
    variable brother is object comic&lt;br /&gt;
    subroutine slap&lt;br /&gt;
    ...&lt;br /&gt;
  end public&lt;br /&gt;
  ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
%moe is object comic&lt;br /&gt;
 ...&lt;br /&gt;
%moe:brother:slap &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This stringing of method/variable names can be extended indefinitely and is one of the big advantages of object-oriented syntax over standard procedure syntax. Procedural syntax accomplishes the same economy using nesting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;call $slap($brother(%moe)) &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With procedural syntax, the evaluation is from the inside out and should be read that way. Evaluation of strung-together class members is left to right, and so it can be read in that more natural order. If there is more than one input object to a method, object oriented syntax must also resort to nesting, but this is relatively rare and still requires one fewer nested object than procedural syntax.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Classes and Objects]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[Local and Common entities]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[Enhancement methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[Print, Audit, and Trace methods for user objects]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[Object oriented programming in SOUL]]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Overviews]]&lt;br /&gt;
[[Category:SOUL object-oriented programming topics]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=RKTools&amp;diff=104801</id>
		<title>RKTools</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=RKTools&amp;diff=104801"/>
		<updated>2018-01-02T01:52:58Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* PL command */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; &amp;amp;mdash; &#039;&#039;Rocket Tools for Model 204&#039;&#039; &amp;amp;mdash; is a family of products implemented as &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; [[Application Subsystem development|application subsystems]], designed to function together in a &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; Online. Prior to version 7.5 of RKTools (October, 2015), the product was known as UL/SPF.&lt;br /&gt;
&lt;br /&gt;
Each [[#components|product in the family]] can be installed and run independently, or each can be installed and run as a component of the integrated &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; framework. All &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; products share a common look and feel, providing a highly productive full screen 3270 interface to a variety of common &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; functions. In addition, many of the component subsystems also support web interfaces.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;b id=&amp;quot;components&amp;quot;&amp;gt;&amp;lt;/b&amp;gt;RKTools components==&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; comprises the following products:&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
&amp;lt;dt&amp;gt;[[SirDBA]] &amp;lt;dd&amp;gt;A system that analyzes &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; databases to determine their logical structure, populating an internal catalog. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirDBA&amp;lt;/var&amp;gt; is distributed as a component of the Sir2000 Database Analysis Tools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dt&amp;gt;[[SirFile]] &lt;br /&gt;
&amp;lt;dd&amp;gt;A comprehensive facility both for monitoring the physical storage utilization of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; database files and for warning users of the need for file reorganizations. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirFile&amp;lt;/var&amp;gt; maintains historical information that allows it to predict when file sizing problems will occur, allowing a DBA to take preventative action before an application outage results.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dt&amp;gt;[[SirLib]] &lt;br /&gt;
&amp;lt;dd&amp;gt;A powerful and flexible system that provides change management and&lt;br /&gt;
configuration control for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; applications. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirLib&amp;lt;/var&amp;gt; is fully integrated within the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; programming environment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dt&amp;gt;[[SirMon]] &lt;br /&gt;
&amp;lt;dd&amp;gt;A comprehensive facility for monitoring the performance and availability of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; online systems. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirMon&amp;lt;/var&amp;gt; combines the real time monitoring of&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; performance with intelligent full screen displays that facilitate System Manager and Administrator duties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dt&amp;gt;[[SirPro]] &lt;br /&gt;
&amp;lt;dd&amp;gt;A collection of powerful and easy to use tools for programmers, database administrators, and application managers. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; provides programmers with powerful facilities for managing large libraries of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; procedures, and it provides system managers with intuitive ISPF-like front ends to many &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; system management commands. &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
As of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; version 7.5, SirPro also incorporates the user-extensible [[SoulEdit]] editor, which can also be invoked from a command line call to the (optional) &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; application subsystem &amp;lt;code&amp;gt;SE&amp;lt;/code&amp;gt;. Because the procedure list feature of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; is so central, it too has an optional standalone subsystem called &amp;lt;code&amp;gt;PL&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dt&amp;gt;[[SirScan]] &lt;br /&gt;
&amp;lt;dd&amp;gt;A high performance utility that allows users in a &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; Online to browse the contents of its journal in real time. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; permits ordinary users to view journal entries generated by their own online session, and it allows users in [[ADMIN SCLASS]]es to browse journal entries for any set of users. The data is displayed in a full-screen browser with powerful searching commands and filtering options.&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;As of version 7.7, RKTools products are accessed by a web interface (&amp;lt;b&amp;gt;[[RKWeb]]&amp;lt;/b&amp;gt;) as well as by the traditional 3270 interface. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;code&amp;gt;FACT&amp;lt;/code&amp;gt; subsystem, a utility for browsing &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;&amp;lt;b&amp;gt;[[SirFact]]&amp;lt;/b&amp;gt;&amp;lt;/var&amp;gt; dumps, is indirectly linked into the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; menuing structure as [[SirFact FACT subsystem#Using SirPro|a SirPro option]]. &amp;lt;code&amp;gt;FACT&amp;lt;/code&amp;gt; is also available from the RKWeb interface (&amp;lt;code&amp;gt;Build &amp;gt; Fact Dump Analysis&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As of version 7.7, RKTools provides access to &amp;lt;b&amp;gt;[[Dictionary/204 overview|Dictionary/204]]&amp;lt;/b&amp;gt;, notably including the [[System requirements for Application Subsystems#Overview of the Subsystem Management facility|Subsystem Management facility]] (SUBSYSMGMT) and the [[FILEMGMT overview|File Management facility]] (FILEMGMT). These facilities are available from the RKTools TN3270 main menu and from the RKWeb interface (&amp;lt;code&amp;gt;Manage &amp;gt; Subsystem Management&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;Manage &amp;gt; Dictionary&amp;lt;/code&amp;gt; sub-menu options).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As of version 7.7, RKTools provides access to the Model&amp;amp;nbsp;204 &amp;lt;b&amp;gt;[[SQL catalog#Using the SQL catalog|SQL Server]]&amp;lt;/b&amp;gt; DDL-generation tools CCACATREPT and CCATSF. These facilities are available from the RKTools TN3270 main menu and from the RKWeb interface (&amp;lt;code&amp;gt;Manage &amp;gt; Dictionary &amp;gt; SQL Catalog Reports&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Manage &amp;gt; Dictionary &amp;gt; Table Specifications&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As of version 7.7, RKWeb provides access (&amp;lt;code&amp;gt;Build &amp;gt; Tune Reports&amp;lt;/code&amp;gt;) to the the reporting portion of &amp;lt;b&amp;gt;[[SirTune]]&amp;lt;/b&amp;gt;, the SOUL program &amp;lt;code&amp;gt;SIRTUNEREPORT&amp;lt;/code&amp;gt;.  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Many sample web and client-server applications developed for the [[Janus TCP/IP Base#The Janus family|Janus product family]] are distributed and installed along with the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; products, although they are &amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt; linked into the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; TN3270 menuing structure. &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
These applications include: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;JanCat&amp;lt;/code&amp;gt;, an application that builds normalized views of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; data for use&lt;br /&gt;
by &amp;lt;b&amp;gt;&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;[[Media:JsdsrNew.pdf|Janus Specialty Data Store]]&amp;lt;/var&amp;gt;&amp;lt;/b&amp;gt; applications. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;JanSSL&amp;lt;/code&amp;gt;, a &amp;lt;b&amp;gt;[[Janus Network Security]]&amp;lt;/b&amp;gt; system for creating and managing SSL certificate requests. This application is available from the RKWeb interface (&amp;lt;code&amp;gt;Manage &amp;gt; SSL Certificates&amp;lt;/code&amp;gt;). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RKTools packaging and installation requirements==&lt;br /&gt;
All of the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; products are &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; application subsystems written in &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;.&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; is distributed as a set of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; files in a backup format produced by the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;[[DUMP command|DUMP]]&amp;lt;/var&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
All &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;-based products are&lt;br /&gt;
distributed in a single &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; procedure file. The file is &amp;lt;code&amp;gt;M204PROC&amp;lt;/code&amp;gt; as of RKTools 7.7; for earlier versions the file is &amp;lt;code&amp;gt;SIRIUS&amp;lt;/code&amp;gt;. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; makes extensive use of specialized [[Object oriented programming in SOUL|SOUL OO]] classes and $functions. These classes and $functions enable the creation of powerful &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; application systems that can support complex environments with minimal server size requirements.&lt;br /&gt;
&lt;br /&gt;
Installing &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; requires:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Downloading the &amp;lt;code&amp;gt;M204PROC&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SIRIUS&amp;lt;/code&amp;gt; file, and restoring it to the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; environment where the tools will run. &amp;lt;/li&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Setting up some subsidiary &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; files.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Verifying that the environment has the appropriate parameter settings. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Running a program that performs all installation functions for new users and all upgrade functions for reinstalling users. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For details, see [[RKTools installation]].&lt;br /&gt;
&lt;br /&gt;
Upgrades to &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; can almost always be handled by restoring a fresh copy of the &amp;lt;code&amp;gt;M204PROC&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SIRIUS&amp;lt;/code&amp;gt; file. &lt;br /&gt;
&lt;br /&gt;
==Integrating &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; with other subsystems==&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; and any of its constituent products can be easily integrated with other &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; subsystems. Whenever an &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; component product is exiting, it first checks to see if the global variable &amp;lt;var&amp;gt;SIRIUS.COMM&amp;lt;/var&amp;gt; exists and has a non-null value. If so, the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; product performs a subsystem transfer using the value in &amp;lt;var&amp;gt;SIRIUS.COMM&amp;lt;/var&amp;gt; as the name of the target subsystem.&lt;br /&gt;
 &lt;br /&gt;
For example, the following code fragment lets you transfer into subsystem &amp;lt;code&amp;gt;SIRMON&amp;lt;/code&amp;gt;. When &amp;lt;code&amp;gt;SIRMON&amp;lt;/code&amp;gt; exits, control is transferred to the application subsystem &amp;lt;code&amp;gt;MENUSYS&amp;lt;/code&amp;gt;, provided that &amp;lt;code&amp;gt;NEXT&amp;lt;/code&amp;gt; is the current subsystem&#039;s communication global variable:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%rc = $Setg(&#039;SIRIUS.COMM&#039;,&#039;MENUSYS&#039;)&lt;br /&gt;
%rc = $Setg(&#039;NEXT&#039;,&#039;XFER&#039;)&lt;br /&gt;
%rc = $Setg(&#039;XFER&#039;,&#039;SIRMON&#039;)&lt;br /&gt;
STOP&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;mainmenu&amp;quot;&amp;gt;&lt;br /&gt;
In addition to the individual &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; subsystems that implement the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; products,&lt;br /&gt;
Rocket Software distributes an umbrella &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTools&amp;lt;/var&amp;gt; subsystem, accessed by entering &amp;lt;code&amp;gt;RKTOOLS&amp;lt;/code&amp;gt; from the Model&amp;amp;nbsp;204 command line. The &amp;lt;b&amp;gt;RKTOOLS&amp;lt;/b&amp;gt; subsystem provides a menu that contains entries for all &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTOOLS&amp;lt;/var&amp;gt; components installed at a site: &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p class=&amp;quot;caption&amp;quot; style=&amp;quot;width:450px&amp;quot;&amp;gt;RKTools main menu (V7.7)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:RKToolsMainMenu77.png|450px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fast-pathing===&lt;br /&gt;
The &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;RKTOOLS&amp;lt;/var&amp;gt; subsystems support fast-path navigation. For example, a &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirMon&amp;lt;/var&amp;gt; user can transfer into the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; main menu option 1 destination (the [[SirPro procedure-list selection]] screen) by using the component subsystem name or short-code along with a menu number: &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;sirpro 1&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Or:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;pro 1&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
And a user in &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; can enter &amp;lt;code&amp;gt;sirmon 3.1&amp;lt;/code&amp;gt; on the command line and be transferred directly to the option 1 (&amp;lt;b&amp;gt;Resource Usage&amp;lt;/b&amp;gt;) destination of the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirMon&amp;lt;/var&amp;gt; main menu option 3 (&amp;lt;b&amp;gt;User Monitor&amp;lt;/b&amp;gt;) screen.&lt;br /&gt;
&lt;br /&gt;
====PL command====&lt;br /&gt;
&amp;lt;var&amp;gt;PL&amp;lt;/var&amp;gt; is both a special subsystem and a command that lets you directly enter the [[SirPro procedure-list operations#Overview|Procedure List screen]] in &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;. The command is like a &amp;lt;code&amp;gt;pro 1&amp;lt;/code&amp;gt; fast-path command combined with procedure-search specifications.&lt;br /&gt;
&lt;br /&gt;
The command format is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;PL [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;procedurePattern&amp;lt;/span&amp;gt;] [FILE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;filename&amp;lt;/span&amp;gt; | GROUP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;groupname&amp;lt;/span&amp;gt;][HAS &amp;lt;span = class=&amp;quot;term&amp;quot;&amp;gt;searchValue&amp;lt;/span&amp;gt; | CONTAINS &amp;lt;span = class=&amp;quot;term&amp;quot;&amp;gt;searchValue&amp;lt;/span&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
where &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;procedurePattern&amp;lt;/var&amp;gt; supports the wildcard usage described in [[SirPro procedure-list selection#procname|Procedure name]]. &lt;br /&gt;
&lt;br /&gt;
If you do not specify a &amp;lt;var&amp;gt;FILE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;GROUP&amp;lt;/var&amp;gt; clause, one of the following is used:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The current open context. This context is obtained using &amp;lt;code&amp;gt;VIEW APDFCNTX&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;$view(&#039;APDFCNTX&#039;)&amp;lt;/code&amp;gt; (see the &amp;lt;var&amp;gt;[[DEFCNTX and APDFCNTX parameters|APDFCNTX]]&amp;lt;/var&amp;gt; parameter). &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The last-visited SirPro procedure list. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; To search for procedure names that contain the words &amp;quot;FILE&amp;quot; or &amp;quot;GROUP&amp;quot;, use a &amp;lt;var&amp;gt;PL&amp;lt;/var&amp;gt; command like the following: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;PL File FILE &amp;lt;i&amp;gt;filename&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; indicates procedures whose name contains the word &amp;quot;File&amp;quot;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; is required because the context is not automatically added if searching for the words &amp;quot;FILE&amp;quot; or &amp;quot;GROUP&amp;quot;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Release notes==&lt;br /&gt;
Each RKTools release has the version number of the Model&amp;amp;nbsp;204 release whose features it can exploit.  &lt;br /&gt;
&lt;br /&gt;
For information about member product changes and new features contained in a release, see the [[M204wiki main page#rktools_notes|RKTools release notes]] appropriate for your version of Model&amp;amp;nbsp;204: &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for RKTools V7.5]] for Model&amp;amp;nbsp;204 V7.5 &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for RKTools V7.7]] for Model&amp;amp;nbsp;204 V7.6 and V7.7 &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: RKTools]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=$D2C&amp;diff=84557</id>
		<title>$D2C</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=$D2C&amp;diff=84557"/>
		<updated>2016-06-09T01:00:07Z</updated>

		<summary type="html">&lt;p&gt;Adrian: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:$D2C}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;pageSubtitle&amp;quot;&amp;gt;Binary byte representation of integer&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;warn&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note: &amp;lt;/b&amp;gt;Most Sirius $functions have been deprecated in favor of Object Oriented methods. The OO equivalent for the $D2C function is &amp;lt;var&amp;gt;[[IntegerToBinary (Float function)|IntegerToBinary]]&amp;lt;/var&amp;gt;.  For a full list of string and numeric conversion functions see [[List of String methods]] and [[List of Float methods]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;var&amp;gt;$D2C&amp;lt;/var&amp;gt; function returns a byte string which is the binary equivalent of an integer. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;var&amp;gt;$D2C&amp;lt;/var&amp;gt; accepts one required and one optional argument and returns a byte string value. &lt;br /&gt;
&lt;br /&gt;
The first argument is the integer to be converted. If it is omitted, or if after conversion to an integer it is outside the range -2,147,483,647..2,147,483,647, the null string is the result. &lt;br /&gt;
&lt;br /&gt;
The second argument is the number of output bytes in the string. If it is omitted, the first argument must be non-negative, and as many bytes as necessary (1, 2, 3, or 4) are used as the result. If, after conversion to an integer, argument two is not in the range 0..255, the null string is the result. &lt;br /&gt;
&lt;br /&gt;
The returned result is a byte string representing, in binary, the integer part of argument one. If argument two is omitted, the result has as many bytes needed to represent (the non-negative) argument one. Otherwise, the result is sign-extended to as many bytes as specified in argument two, or truncated. A null string is returned for invalid arguments.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%result&amp;lt;/span&amp;gt; = $D2C(int_val, width)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;%result&amp;lt;/var&amp;gt; is set to the width-char binary byte representation of &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;int_val&amp;lt;/var&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Usage notes==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;$D2C&amp;lt;/var&amp;gt; is similar to the standard &amp;lt;var&amp;gt;[[$BINARY]]&amp;lt;/var&amp;gt; function, with some differences, such as being able to specify the output length in bytes rather than bits, and being able to specify results of lengths other than 2 or 4 bytes in length. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The inverse of &amp;lt;var&amp;gt;$D2C&amp;lt;/var&amp;gt; is &amp;lt;var&amp;gt;[[$C2D]]&amp;lt;/var&amp;gt;. See also the &amp;lt;var&amp;gt;[[$D2X]]&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;[[$X2D]]&amp;lt;/var&amp;gt; functions and the &amp;lt;var&amp;gt;[[$C2X]]&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;[[$X2C]]&amp;lt;/var&amp;gt; functions.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
The following program will print the value &amp;lt;code&amp;gt;AB&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;B&lt;br /&gt;
PRINT $D2C(256 * $X2D(&#039;C1&#039;) + $X2D(&#039;C2&#039;))&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are some other results, with the result shown as the hexadecimal representation of the returned byte string, or as &amp;amp;apos; &amp;amp;apos; to indicate the null string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;$D2C(9) -&amp;gt; X&#039;09&#039;&lt;br /&gt;
$D2C(129) -&amp;gt; X&#039;81&#039;&lt;br /&gt;
$D2C(129, 1) -&amp;gt; X&#039;81&#039;&lt;br /&gt;
$D2C(129, 2) -&amp;gt; X&#039;0081&#039;&lt;br /&gt;
$D2C(257, 1) -&amp;gt; X&#039;01&#039;&lt;br /&gt;
$D2C(-127, 1) -&amp;gt; X&#039;81&#039;&lt;br /&gt;
$D2C(-127, 2) -&amp;gt; X&#039;FF81&#039;&lt;br /&gt;
$D2C(-127) -&amp;gt; &amp;amp;apos;&amp;amp;apos;&lt;br /&gt;
$D2C(-1, 4) -&amp;gt; X&#039;FFFFFFFF&#039;&lt;br /&gt;
$D2C(12, 0) -&amp;gt; &amp;amp;apos;&amp;amp;apos;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Products authorizing {{PAGENAMEE}}== &lt;br /&gt;
&amp;lt;ul class=&amp;quot;smallAndTightList&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[List of $functions|Sirius functions]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Fast/Unload User Language Interface]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Media:JoclrNew.pdf|Janus Open Client]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Media:JosrvrNew.pdf|Janus Open Server]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Janus Sockets]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Janus Web Server]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Japanese functions&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Media:SirfieldNew.pdf|Sir2000 Field Migration Facility]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;caption&amp;quot;&amp;gt;Products authorizing $D2C&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:$Functions|$D2C]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78546</id>
		<title>DigestAlgorithm enumeration</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78546"/>
		<updated>2015-07-25T14:16:29Z</updated>

		<summary type="html">&lt;p&gt;Adrian: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &amp;lt;var&amp;gt;DigestAlgorithm&amp;lt;/var&amp;gt; enumeration is used by the [[Stringlist_class|StringList]] methods [[AppendSignedCertificate_(Stringlist_function)|AppendSignedCertificate]] and [[AppendSignedClientCertificate_(Stringlist_function)|AppendSignedClientCertificate]] to specify which Signature Algorithm to use when signing certificates for SSL processing.&lt;br /&gt;
&lt;br /&gt;
Valid enumeration values are:-&lt;br /&gt;
&amp;lt;li&amp;gt;MD5&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;SHA1&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;SHA256&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that &amp;lt;var&amp;gt;SHA1&amp;lt;/var&amp;gt; is being depreciated by most modern browsers.&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78545</id>
		<title>DigestAlgorithm enumeration</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78545"/>
		<updated>2015-07-25T14:11:47Z</updated>

		<summary type="html">&lt;p&gt;Adrian: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &amp;lt;var&amp;gt;DigestAlgorithm&amp;lt;/var&amp;gt; enumeration is used by the [[Stringlist_class|StringList]] methods [[AppendSignedCertificate_(Stringlist_function)|AppendSignedCertificate]] and [[AppendSignedClientCertificate_(Stringlist_function)|AppendSignedClientCertificate]] to specify which Signature Algorithm should be used when signing certificates for SSL processing.&lt;br /&gt;
&lt;br /&gt;
Valid enumeration values are:-&lt;br /&gt;
&amp;lt;li&amp;gt;MD5&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;SHA1&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;SHA256&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that &amp;lt;var&amp;gt;SHA1&amp;lt;/var&amp;gt; is being depreciated by most modern browsers.&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78544</id>
		<title>DigestAlgorithm enumeration</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78544"/>
		<updated>2015-07-25T14:10:30Z</updated>

		<summary type="html">&lt;p&gt;Adrian: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &amp;lt;var&amp;gt;DigestAlgorithm&amp;lt;/var&amp;gt; enumeration is used by the [[Stringlist_class|StringList]] method [[AppendSignedCertificate_(Stringlist_function)|AppendSignedCertificate]] to specify which Signature Algorithm should be used when signing certificates for SSL processing.&lt;br /&gt;
&lt;br /&gt;
Valid enumeration values are:-&lt;br /&gt;
&amp;lt;li&amp;gt;MD5&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;SHA1&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;SHA256&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that &amp;lt;var&amp;gt;SHA1&amp;lt;/var&amp;gt; is being depreciated by most modern browsers.&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78543</id>
		<title>DigestAlgorithm enumeration</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78543"/>
		<updated>2015-07-25T14:04:13Z</updated>

		<summary type="html">&lt;p&gt;Adrian: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &amp;lt;var&amp;gt;DigestAlgorithm&amp;lt;/var&amp;gt; enumeration is used by the &amp;lt;var&amp;gt;StringList&amp;lt;/var&amp;gt; function &amp;lt;var&amp;gt;AppendSignedCertificate&amp;lt;/var&amp;gt; to specify which Signature Algorithm should be used when signing certificates for SSL processing.&lt;br /&gt;
&lt;br /&gt;
Valid enumeration values are:-&lt;br /&gt;
&amp;lt;li&amp;gt;MD5&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;SHA1&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;SHA256&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that &amp;lt;var&amp;gt;SHA1&amp;lt;/var&amp;gt; is being depreciated by most modern browsers.&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78542</id>
		<title>DigestAlgorithm enumeration</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=DigestAlgorithm_enumeration&amp;diff=78542"/>
		<updated>2015-07-25T14:03:42Z</updated>

		<summary type="html">&lt;p&gt;Adrian: Created page with &amp;quot;The &amp;lt;var&amp;gt;DigestAlgorithm&amp;lt;/var&amp;gt; enumeration is used by the &amp;lt;var&amp;gt;StringList&amp;lt;/var&amp;gt; function &amp;lt;var&amp;gt;AppendSignedCertificate&amp;lt;/var&amp;gt; and is used to specify which Signature Algorithm sh...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &amp;lt;var&amp;gt;DigestAlgorithm&amp;lt;/var&amp;gt; enumeration is used by the &amp;lt;var&amp;gt;StringList&amp;lt;/var&amp;gt; function &amp;lt;var&amp;gt;AppendSignedCertificate&amp;lt;/var&amp;gt; and is used to specify which Signature Algorithm should be used when signing certificates for SSL processing.&lt;br /&gt;
&lt;br /&gt;
Valid enumeration values are:-&lt;br /&gt;
&amp;lt;li&amp;gt;MD5&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;SHA1&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;SHA256&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that &amp;lt;var&amp;gt;SHA1&amp;lt;/var&amp;gt; is being depreciated by most modern browsers.&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Template:List_of_classes_and_methods&amp;diff=78541</id>
		<title>Template:List of classes and methods</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Template:List_of_classes_and_methods&amp;diff=78541"/>
		<updated>2015-07-25T13:54:38Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* Enumerations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==System classes==&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;CharacterMap class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[CharacterMap class|Synopsis]] | [[List of CharacterMap methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;CharacterToUnicodeMap class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[CharacterToUnicodeMap class|Synopsis]] | [[List of CharacterToUnicodeMap methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;[[Collections|Collection]] classes &amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Arraylist class:&amp;lt;li&amp;gt;FloatNamedArraylist class:&amp;lt;li&amp;gt;NamedArraylist class:&amp;lt;li&amp;gt;UnicodeNamedArraylist class:&amp;lt;/ul&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&amp;lt;li&amp;gt;[[Arraylist class|Synopsis]] | [[List of Arraylist methods|Methods]]&amp;lt;li&amp;gt;[[FloatNamedArraylist class|Synopsis]] | [[List of FloatNamedArraylist methods|Methods]]&amp;lt;li&amp;gt;[[NamedArraylist class|Synopsis]] | [[List of NamedArraylist methods|Methods]]&amp;lt;li&amp;gt;[[UnicodeNamedArraylist class|Synopsis]] | [[List of UnicodeNamedArraylist methods|Methods]]&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Daemon class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Daemon class|Synopsis]] | [[List of Daemon methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Dataset class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Dataset class|Synopsis]] | [[List of Dataset methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Email class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Email class|Synopsis]] | [[List of Email methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;FastUnloadTask class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[FastUnloadTask class|Synopsis]] | [[List of FastUnloadTask methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;[[File classes]] &amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Recordset class:&amp;lt;li&amp;gt;Record class:&amp;lt;li&amp;gt;SortedRecordset class:&amp;lt;li&amp;gt;RecordsetCursor class:&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&amp;lt;li&amp;gt;[[Recordset class|Synopsis]] | [[List of Recordset methods|Methods]]&amp;lt;li&amp;gt;[[Record class|Synopsis]] | [[List of Record methods|Methods]]&amp;lt;li&amp;gt;[[SortedRecordset class|Synopsis]] | [[List of SortedRecordset methods|Methods]]&amp;lt;li&amp;gt;[[RecordsetCursor class|Synopsis]] | [[List of RecordsetCursor methods|Methods]]&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;[[HTTP Helper|HTTP Helper]] classes: &amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&amp;lt;li&amp;gt;HttpRequest class:&amp;lt;li&amp;gt;HttpResponse class:&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[List of HTTP Helper methods|HTTP Helper methods]]&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&amp;lt;li&amp;gt;[[HttpRequest class|Synopsis]] | [[List of HttpRequest methods|Methods]]&amp;lt;li&amp;gt;[[HttpResponse class|Synopsis]] | [[List of HttpResponse methods|Methods]]&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;[[Intrinsic classes|Intrinsic]] classes: &amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Float class:&amp;lt;li&amp;gt;String class:&amp;lt;li&amp;gt;Unicode class:&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&amp;lt;li&amp;gt;[[List of  Float methods|Methods]]&amp;lt;li&amp;gt;[[List of String methods|Methods]]&amp;lt;li&amp;gt;[[List of Unicode methods|Methods]]&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Journal class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Journal class|Synopsis]] | [[List of Journal methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Json class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Json class|Synopsis]] | [[List of Json methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;LDAP class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[LDAP class|Synopsis]] | [[List of LDAP methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Object class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Object class|Synopsis]] | [[List of Object methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;PersistentObjectInfo class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[PersistentObjectInfo class|Synopsis]] | [[List of PersistentObjectInfo methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;ProcedureInfo class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[ProcedureInfo class|Synopsis]] | [[List of ProcedureInfo methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;RandomNumberGenerator class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[RandomNumberGenerator class|Synopsis]] | [[List of RandomNumberGenerator methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Screen and ScreenField classes:&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Screen classes|Synopsis]] | [[List of Screen API methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;SelectionCriterion class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[SelectionCriterion class|Synopsis]] | [[List of SelectionCriterion methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Socket class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Socket class|Synopsis]] | [[List of Socket methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;SortOrder class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[SortOrder class|Synopsis]] | [[List of SortOrder methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Stringlist class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Stringlist class|Synopsis]] | [[List of Stringlist methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;StringTokenizer class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[StringTokenizer class|Synopsis]] | [[List of StringTokenizer methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&amp;lt;li&amp;gt;System class:&amp;lt;li&amp;gt;Subsystem class:&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&amp;lt;li&amp;gt;[[System and Subsystem classes|Synopsis]] | [[List of System methods|Methods]]&amp;lt;li&amp;gt;[[System and Subsystem classes|Synopsis]] | [[List of Subsystem methods|Methods]]&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;UdpSocket class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[UdpSocket class|Synopsis]] | [[List of UdpSocket methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;UserStatistics class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[UserStatistics class|Synopsis]] | [[List of UserStatistics methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;Web class:&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[Web class|Synopsis]] | [[List of Web methods|Methods]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;[[XmlDoc API]] classes &amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&amp;lt;li&amp;gt;XmlDoc class:&amp;lt;li&amp;gt;XmlNode class:&amp;lt;li&amp;gt;XmlNodelist class:&amp;lt;/ul&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[List of XmlDoc API methods|XmlDoc API methods]]&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&amp;lt;li&amp;gt;[[XmlDoc API#The XmlDoc class|Synopsis]] | [[List of XmlDoc methods|XmlDoc methods]]&amp;lt;li&amp;gt;[[XmlDoc API#The XmlNode and XmlNodelist classes, and XPath|Synopsis]] | [[List of XmlNode methods|XmlNode methods]]&amp;lt;li&amp;gt;[[XmlDoc API#The XmlNode and XmlNodelist classes, and XPath|Synopsis]] | [[List of XmlNodelist methods|XmlNodelist methods]]&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;[[XmlParser API]] classes &amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&amp;lt;li&amp;gt;XmlParser class:&amp;lt;li&amp;gt;XmlSelector class:&amp;lt;li&amp;gt;XmlAttributeList class:&amp;lt;/ul&amp;gt;XmlParser API types &amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&amp;lt;li&amp;gt;[[XmlStartHandler type]]&amp;lt;li&amp;gt;[[XmlEndHandler type]]&amp;lt;li&amp;gt;[[XmlPIHandler type]]&amp;lt;/ul&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;[[List of XmlParser API methods|XmlParser API methods]]&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&amp;lt;li&amp;gt;[[XmlParser class|Synopsis]] | [[List of XmlParser methods|XmlParser methods]]&amp;lt;li&amp;gt;[[XmlSelector class|Synopsis]] | [[List of XmlSelector methods|XmlSelector methods]]&amp;lt;li&amp;gt;[[XmlAttributeListClass|Synopsis]] | [[List of XmlAttributeList methods|XmlAttributeList methods]]&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enumerations==&lt;br /&gt;
&amp;lt;table&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;[[Enumerations]]&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;noBorder&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[ActionKey enumeration|ActionKey]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[AddToRecordErrorReason enumeration|AddToRecordErrorReason]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[Boolean enumeration|Boolean]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[CursorState enumeration|CursorState]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[DaemonState enumeration|DaemonState]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[DatasetState enumeration|DatasetState]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[DigestAlgorithm enumeration|DigestAlgorithm]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[FastUnloadTaskState enumeration|FastUnloadTaskState]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[FieldColor enumeration|FieldColor]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[Highlight enumeration|Highlight]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[JsonType enumeration|JsonType]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[LineEnd enumeration|LineEnd]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;[[LockStrength enumeration|LockStrength]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-left:0&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[RecordFormat enumeration|RecordFormat]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[RecordLockType enumeration|RecordLockType]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[RegexSplitOutputOptions enumeration|RegexSplitOutputOptions]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[TranslationExceptionReason enumeration|TranslationExceptionReason]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[XmlAdjacentTextSetting enumeration|XmlAdjacentTextSetting]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[XmlInvalidChar enumeration|XmlInvalidChar]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[XmlNamespaceSetting enumeration|XmlNamespaceSetting]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[XmlNodeType enumeration|XmlNodeType]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[XmlParseErrorReason enumeration|XmlParseErrorReason]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[[XPathErrorReason enumeration|XPathErrorReason]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exceptions==&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;except&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;strong&amp;gt;[[Exceptions|Exception]]&amp;lt;/strong&amp;gt; classes&amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;AddToRecordError: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;BadJournal: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;CharacterTranslationException: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;DaemonLost: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;IncorrectDaemonState: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidBase64Data: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidBitNumber: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidDateString: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidDeflateData: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidGZipData: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidHexData: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidJsonType: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidRegex: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidSortSpecification: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;InvalidValue: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ItemNotFound: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ItemNotPresent: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;JsonCircularReference: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;JsonParseError: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;MaxDaemExceeded: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;MismatchedQuote: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;NoFreeDaemons: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;NotJanusConnection: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;OutOfBounds: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;RecordLockingConflict: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ScreenReadError: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;UnknownStatistic: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;WebScreenException: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;XmlParseError: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;XPathError: &amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;td nowrap style=&amp;quot;border-left:0&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[AddToRecordError class|Synopsis]] | [[AddToRecordError class#The AddToRecordError methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[BadJournal class|Synopsis]] | [[BadJournal class#The BadJournal methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[CharacterTranslationException class|Synopsis]] | [[CharacterTranslationException class#The CharacterTranslationException methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[DaemonLost class|Synopsis]] | [[DaemonLost class#The DaemonLost methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[IncorrectDaemonState class|Synopsis]] | [[IncorrectDaemonState class#The IncorrectDaemonState methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidBase64Data class|Synopsis]] | [[InvalidBase64Data class#The InvalidBase64Data methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidBitNumber class|Synopsis]] | [[InvalidBitNumber class#The InvalidBitNumber methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidDateString class|Synopsis]] | [[InvalidDateString class#The InvalidDateString methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidDeflateData class|Synopsis]] | [[InvalidDeflateData class#The InvalidDeflateData methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidGZipData class|Synopsis]] | [[InvalidGZipData class#The InvalidGZipData methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidHexData class|Synopsis]] | [[InvalidHexData class#The InvalidHexData methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidJsonType class|Synopsis]] | [[InvalidJsonType class#The InvalidJsonType methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidRegex class|Synopsis]] | [[InvalidRegex class#The InvalidRegex methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidSortSpecification class|Synopsis]] | [[InvalidSortSpecification class#The InvalidSortSpecification methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[InvalidValue class|Synopsis]] | [[InvalidValue class#The InvalidValue methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[ItemNotFound class|Synopsis]] | [[ItemNotFound class#The ItemNotFound methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[ItemNotPresent class|Synopsis]] | [[ItemNotPresent class#The ItemNotPresent methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[JsonCircularReference class|Synopsis]] | [[JsonCircularReference class#The JsonCircularReference methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[JsonParseError class|Synopsis]] | [[ JsonParseError class#The JsonParseError methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[MaxDaemExceeded class|Synopsis]] | [[MaxDaemExceeded class#The MaxDaemExceeded methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[MismatchedQuote class|Synopsis]] | [[MismatchedQuote class#The MismatchedQuote methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[NoFreeDaemons class|Synopsis]] | [[NoFreeDaemons class#The NoFreeDaemons methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[NotJanusConnection class|Synopsis]] | [[NotJanusConnection class#The NotJanusConnection methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[OutOfBounds class|Synopsis]] | [[OutOfBounds class#The OutOfBounds methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[RecordLockingConflict class|Synopsis]] | [[RecordLockingConflict class#The RecordLockingConflict methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[ScreenReadError class|Synopsis]] | [[ScreenReadError class#The ScreenReadError methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[UnknownStatistic class|Synopsis]] | [[UnknownStatistic class#The UnknownStatistic methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[WebScreenException class|Synopsis]] | [[WebScreenException class#The WebScreenException methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[XmlParseError class|Synopsis]] | [[XmlParseError class#The XmlParseError methods|Methods]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[XPathError class|Synopsis]] | [[XPathError class#The XPathError methods|Methods]]&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==System types==&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-right:0&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;except&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;System types&amp;lt;ul class=&amp;quot;nobul&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;CertificateChecker&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ProcedureInfoList&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;WebScreenCallback&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
&amp;lt;td nowrap style=&amp;quot;border-left:0&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;ul class=&amp;quot;nobulnoindent&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[CertificateChecker type|Synopsis]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[ProcedureInfoList type|Synopsis]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[WebScreenCallback type|Synopsis]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=AppendSignedCertificate_(Stringlist_function)&amp;diff=78540</id>
		<title>AppendSignedCertificate (Stringlist function)</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=AppendSignedCertificate_(Stringlist_function)&amp;diff=78540"/>
		<updated>2015-07-25T13:52:16Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* Syntax terms */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Stringlist:AppendSignedCertificate subtitle}}&lt;br /&gt;
&lt;br /&gt;
This [[Notation conventions for methods#Callable functions|callable]] method signs an X.509 certificate request and adds the lines of the signed certificate to the end of a &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
{{Template:Stringlist:AppendSignedCertificate syntax}}&lt;br /&gt;
&lt;br /&gt;
===Syntax terms===&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%rc&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;An, optional, numeric variable that is set to zero if the function is a success. The possible return codes are described below in [[#Return codes|&amp;quot;Return codes&amp;quot;]]. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;sl&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;PrivateKey&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This [[Notation conventions for methods#Named parameters|name allowed]] argument is a &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; that contains the private key to be used for signing.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;Request&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name allowed argument is a &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; that contains the base-64 encoded X.509 certificate request.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;Signer&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name allowed, argument is a &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; that contains the base-64 encoded CA (certifying authority) X.509 certificate. If not specified, the &amp;lt;var&amp;gt;Request&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; is used: that is, the certificate will be self-signed. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;StartDate&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name allowed, argument is a string that contains the Start date for the signed certificate (in YYMMDDHHMISS format). The default is today&#039;s date.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;EndDate&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name allowed, argument is a string that contains the End date for the signed certificate (in YYMMDDHHMISS format). The default is 24 hours from &amp;lt;var&amp;gt;StartDate&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;SerialNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name allowed, argument is a numeric value that is the Serial number for the signed certificate. The default is a number guaranteed to increase by 1 for every call and guaranteed to increase from run to run, unless there is an extreme amount&lt;br /&gt;
of signing occurrences. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;SignatureAlgorithm&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name allowed, argument is an enumerated &amp;lt;var&amp;gt;DigestAlgorithm&amp;lt;/var&amp;gt; value.  Valid options are:- &amp;lt;var&amp;gt;MD5&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;SHA1&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;SHA256&amp;lt;/var&amp;gt;.&amp;lt;br/&amp;gt;&amp;lt;b&amp;gt;NOTE:&amp;lt;/b&amp;gt; Although supported and currently the default, most modern browsers are deprecating &amp;lt;var&amp;gt;SHA1&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Return codes===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;0&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;All is well.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Out of CCATEMP.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; identifier missing.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; identifier.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Insufficient storage.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Private key &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; identifier missing.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid private key &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; identifier.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid private key &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; data (not correctly base-64 encoded).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;13&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Certificate request &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; identifier missing.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;14&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid certificate request &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; identifier.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;15&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid certificate request.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;                &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;16&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid CA certificate &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; identifier.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;      &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;17&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid CA certificate.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;                      &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;18&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid start date.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;                          &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;19&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid end date.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;                            &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;20&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Invalid serial number.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;                       &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;21&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;Private key does not match signer public key.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[AppendCertificateInfo (Stringlist function)|AppendCertificateInfo]]&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[AppendCertificateRequest (Stringlist function)|AppendCertificateRequest]]&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[AppendCertificateRequestInfo (Stringlist function)|AppendCertificateRequestInfo]]&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[AppendClientCertificateRequest (Stringlist function)|AppendClientCertificateRequest]]&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[AppendEncryptedSecurityData (Stringlist subroutine)|AppendEncryptedSecurityData]]&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[AppendGeneratedPrivateKey (Stringlist subroutine)|AppendGeneratedPrivateKey]]&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[AppendPrivateKeyInfo (Stringlist function)|AppendPrivateKeyInfo]]&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[AppendSignedClientCertificate (Stringlist function)|AppendSignedClientCertificate]]&amp;lt;/var&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[CheckCertificate (Stringlist function)|CheckCertificate]]&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;[[CheckCertificateRequest (Stringlist function)|CheckCertificateRequest]]&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for Sirius Mods V8.0#XmlDoc version of SSL entities|DER-to-XmlDoc methods (String class)]]&amp;lt;/li&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Stringlist:AppendSignedCertificate footer}}&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=SoulEdit&amp;diff=78352</id>
		<title>SoulEdit</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=SoulEdit&amp;diff=78352"/>
		<updated>2015-07-21T05:57:08Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* Auditing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;SoulEdit&#039;&#039;&#039; is a code editor, written in SOUL, specifically designed for SOUL application development. SoulEdit features extended editing capability &amp;amp;mdash; like split/join, bookmarks, display filtering and syntax-specific colors &amp;amp;mdash; as well as facilities that make running, debugging, and testing SOUL code more seamless and intuitive.&lt;br /&gt;
&lt;br /&gt;
SoulEdit runs as an [[Application Subsystem development|application subsystem]], so it needs a subsystem definition along with at least a 640K server size (750K is safer as that provides room for future enhancements and the addition of user-written macros). The [[UL/SPF installation guide]] contains more information about setting up the environment for SoulEdit. &lt;br /&gt;
&lt;br /&gt;
SoulEdit is built into &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;, one of the [[ULSPF|UL/SPF]] family of products from Rocket Software, and it can also be run as a standalone editor by setting up a separate application subsystem. At Rocket it runs as an application subsystem called &amp;lt;code&amp;gt;SE&amp;lt;/code&amp;gt;, so it is executable from the command line. Details for setting up your own SoulEdit subsystem are also in the UL/SPF installation guide.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; is a menu-driven application subsystem that provides tools for programmers, database administrators and application managers inside the Model&amp;amp;nbsp;204 environment. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;&#039;s primary feature set is centered on the manipulation of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; procedures contained in Model 204 files.  To access SoulEdit from &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;, use the &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; prefix command from the list of procedures. If SoulEdit is defined as a standalone subsystem (for example, &amp;lt;code&amp;gt;SE&amp;lt;/code&amp;gt;), simply type the subsystem name with a procedure: &amp;lt;code&amp;gt;SE MYPROCEDURE&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;MYPROCEDURE&amp;lt;/code&amp;gt; is a procedure in the current file.&lt;br /&gt;
&lt;br /&gt;
One of the most useful features of SoulEdit is the ability to run a program via the GO command and immediately view the output in a scrollable [[Stringlist class | StringList]]. If errors occurred while running, a series of &amp;lt;var&amp;gt;AUDIT&amp;lt;/var&amp;gt; commands is available to display the audit trail output of the procedure you&#039;ve just run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;caption&amp;quot; style=&amp;quot;margin-right:15em&amp;quot;&amp;gt;SoulEdit main editing screen&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:SoulEdit_Overview.png|border|750px]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The top line shows the name of the SOUL procedure, the file where the procedure lives, and a warning if the file is in read-only mode. At the right are shown the line numbers with the current top-of-the-screen line number. Note the color-coding of lines in the sample; colors are user-settable via the &amp;lt;var&amp;gt;COLORS&amp;lt;/var&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
==Command line options==        &lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr class=&amp;quot;head&amp;quot;&amp;gt;&amp;lt;th&amp;gt;Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Result&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;T[&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] | TOP [&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] | M+PF7 &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Go to the top of the editor content; optional &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; (linenum) as top of page. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;B | BOTTOM | M+PF8 &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Go to the bottom of the editor content. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;C &amp;lt;i&amp;gt;lineNumber&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Center the line specified by &amp;lt;i&amp;gt;lineNumber&amp;lt;/i&amp;gt;. &amp;lt;i&amp;gt;lineNumber&amp;lt;/i&amp;gt; is absolute, not relative. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;+ | -&amp;lt;i&amp;gt;numericValue&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Position content relative to the numeric value. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;[-]F | Find &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Find previous/next value from cursor position (PF5 repeats last find). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;[-]/&amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Find previous/next value from cursor position (PF5 repeats last find). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;R | REPLACE/&amp;lt;i&amp;gt;replaceThis&amp;lt;/i&amp;gt;/&amp;lt;i&amp;gt;withThis&amp;lt;/i&amp;gt;[[/&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] ALL] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Replace, where &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; specifies replacements per line. The character immediately following the &amp;lt;var&amp;gt;R&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;REPLACE&amp;lt;/var&amp;gt; is used as a delimiter between tokens (cannot be alphanumeric). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;A | ALL &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Hide all lines that do not match &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt;. A command without a &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; performs a &amp;lt;var&amp;gt;SHOW ALL&amp;lt;/var&amp;gt; instead. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;HIDE &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Hide all lines that match &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt;. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW | HIDE COMMENTS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show or hide all comment lines. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;UNHIDE &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Unhide all lines that match &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt;. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLEAR HIDDEN | RESET HIDDEN &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all hidden lines (unhide). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW ALL | SHOW HIDDEN &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all hidden lines (unhide). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;GO &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Run the program, and capture the output into a scrollable screen. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;[IN &amp;lt;i&amp;gt;fileName&amp;lt;/i&amp;gt; ]GET &amp;lt;i&amp;gt;procName&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Obtain the named procedure and insert into editor. You can use line command targeting. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SAVE[ &amp;lt;i&amp;gt;procName&amp;lt;/i&amp;gt;] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Save current editor content (optional save into a different named procedure, including temporary procedures). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;END &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Perform &amp;lt;var&amp;gt;SAVE&amp;lt;/var&amp;gt; and exit the editor. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;QUIT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Exit the editor without saving or giving a modification warning. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;ALIGN &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Requires BB line command range (has issues when crossing &amp;quot;block&amp;quot; statements). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SORT [A | D | ASC | DESC | ASCENDING | DESCENDING]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Requires BB line command range. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLEAR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all line commands. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;RESET PROC | RELOAD | RELOAD PROC &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Discards any changes by reloading the current procedure from file. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;REFRESH PAGE &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ignore any changes to this page since last enter. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;NUM | NUMS | NUMBERS [ON | OFF] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show line numbers in prefix field (toggle). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;= &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Repeat last command (same as PF9). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;i&amp;gt;command stack&amp;lt;/i&amp;gt; (PF6) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Cycles through the command stack. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SET COMMAND STACK &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Defaults to 10; user may increase/decrease. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Split/join lines (PF2) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Cursor sensitive: if no data from cursor, a join is performed; else split is performed. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;FLIP HIDDEN &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Flip the hidden state of lines: hidden-&amp;gt;shown &amp;amp;&amp;amp; shown-&amp;gt;hidden. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;FF | BB+FORMAT - FORMAT [&amp;lt;i&amp;gt;width&amp;lt;/i&amp;gt;] [INDENT &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Format range (indents and alignment). &amp;lt;i&amp;gt;Not fully completed, but mostly functional.&amp;lt;/i&amp;gt; &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;UNDO FORMAT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Reinstate the last &amp;lt;var&amp;gt;FORMAT&amp;lt;/var&amp;gt; to its state before the format (does not check if code has changed). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SET FORMAT &amp;lt;i&amp;gt;type&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Force the formatting type used by &amp;lt;var&amp;gt;FORMAT/FF&amp;lt;/var&amp;gt;. Valid types: M204, XSL. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th nowrap&amp;gt;RUN   (saves and runs code in a daemon)&lt;br /&gt;
RUN TERM (saves and runs code on current thread)&lt;br /&gt;
RUN [TERM] [&amp;lt;i&amp;gt;procName&amp;lt;/i&amp;gt; [FILE &amp;lt;i&amp;gt;filename&amp;lt;/i&amp;gt; [PASS &amp;lt;i&amp;gt;password&amp;lt;/i&amp;gt;]]] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Output from the execution is scrollable (lost daemons are trapped and reported). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW [ [RUN | OUTPUT] | RUN OUTPUT] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show the output from the last executed code or command line VAR/SHOW [SEQ] CHANGES. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW CHANGES &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Compares current content against procedure on file, and display in a scrollable form. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW SEQ CHANGES &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Do compare against SEQ version in same procedure file. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SCALE (toggles on/off) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt; |...+....1....+....2....+....3...&amp;lt;/code&amp;gt; etc. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;PFKEYS (toggles on/off) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show valid PF keys on the last line of the page. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;NEW PROC[EDURE] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear current code (essentially a quit), and start with a blank procedure. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Formatting for XSL &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Change formatting where procedure name ends with &amp;lt;code&amp;gt;.xsl&amp;lt;/code&amp;gt;. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;HELP (PF1) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Display Help text. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;VAR | VARS | VARIABLES &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show variable usage(counts) within scope. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SETUP | PROFILE &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Set user editor preferences. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;COLORS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Set user editor-color preferences. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;.&amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Bookmarks. For example: &amp;lt;code&amp;gt;.foo&amp;lt;/code&amp;gt; as a line command bookmarks the line. &amp;lt;code&amp;gt;.foo&amp;lt;/code&amp;gt; as a command focuses the bookmark. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLEAR BOOKMARKS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all bookmarks. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;XCOMPARE | XC [EXACT | DEBLANK | COMPRESS] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;XCompares current content against procedure on file; displays in a scrollable form. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;XCOMPARE SEQ| XCS [EXACT | DEBLANK | COMPRESS] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Do XCompare against SEQ version in same procedure file (only works for SirLib users). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;LAYOUT | MAP &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;List all class/subroutines/functions. PF4 focuses entry from listing. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;INCLUDES command &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show hierarchy of all includes referenced within the current procedure. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;PROTECT/UNPROTECT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Force the displayed content to be protected/unprotected.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;BB | BLOCK WHERE &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Add BB markers to the current &amp;quot;where&amp;quot; scope. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;AUDIT [&amp;lt;i&amp;gt;minutes&amp;lt;/i&amp;gt; | &amp;lt;i&amp;gt;timestamp&amp;lt;/i&amp;gt; | LAST[RUN]] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Shows the journal lines for the user. It defaults to the last minute, unless an optional time is supplied. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SET FILE &amp;lt;i&amp;gt;fileName&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Sets the file name for saving procedures; also clears the procedure name. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SNAP | SNAPSHOT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Takes a copy of the code in the current editing session and saves it as snapshot.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;XCB [&amp;lt;i&amp;gt;previous-snapshot-offset&amp;lt;/i&amp;gt;] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Compare the current code against the last snapshot taken. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;                                                                                                                                              &lt;br /&gt;
&lt;br /&gt;
Used in conjunction with the pf12 key on the run output when compilation/runtime errors occur, the following commands can be used to navigate &lt;br /&gt;
through the errors in the currently loaded procedure:    &lt;br /&gt;
                                                                                       &lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;NE | NEXT ERROR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Navigate to the next error. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;PE | PREVIOUS ERROR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Navigate to the previous error. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CE | CURRENT ERROR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Navigate to the current error. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLE | CLEAR ERRORS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear the error bookmarks. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;                                                                                                                                                                                                                                                  &lt;br /&gt;
==Line prefix commands==&lt;br /&gt;
&lt;br /&gt;
===Block prefixes, with repeating ignored=== &lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CC&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block copy (requires targeting prefix). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;MM&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block move (requires targeting prefix).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;DD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block delete.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;HH&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block hide.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;**&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block comment (set/clear; first line is used to determine state switch. If first character is &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, comments are removed).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;BB&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block boundaries. Used with editor commands: SORT, ALIGN, FORMAT. Optional for R, REPLACE.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                           &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;FF&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Format the specified block. Sets indenting to the number of spaces specified in the user profile.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Block prefixes, with repeating honored===&lt;br /&gt;
For example, &amp;lt;code&amp;gt;&amp;quot;&amp;quot;3&amp;lt;/code&amp;gt; replicates the block three times.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;RR &amp;quot;&amp;quot;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block replicate&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;&amp;lt; ((&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block shift left (with protections to prevent loss of leading text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;gt;&amp;gt; ))&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block shift right (with protections to prevent loss of trailing text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Targeting prefixes===&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;A&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target after line&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;F&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target following line &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;B&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target before line&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt; P&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target previous line&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Singular prefixes, with repeating ignored===&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;C&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Copy (requires targeting prefix).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;M&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Move (requires targeting prefix).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;E&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Expand line to 255 bytes (toggles on/off).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;/&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Center this line.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;-&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Folding of blocks; hide lines from marked line to closing/opening block. &amp;lt;p&amp;gt;Example: &amp;lt;code&amp;gt;if -&amp;gt; end if... &amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;X&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Expand/collapse INCLUDE inline. Only usable on &amp;lt;var&amp;gt;INCLUDE&amp;lt;/var&amp;gt; lines. The expanded INCLUDE lines are protected.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Singular prefixes, with repeating honored===&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;H&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Hide&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                                           &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;S +&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;D&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Delete&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;R &amp;quot;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Replicate&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;*&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Comment (set/clear; if first character is &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, comments are removed)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt; (&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Shift line left (with protections to prevent loss of leading text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;gt; )&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Shift line right (with protections to prevent loss of trailing text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;     &lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PF keys==&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Help&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Split the current line at the cursor, or join the current line with the next line if cursor is at end-of-line.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Quit the editor without saving.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Cycle through the command stack. The command stack size defaults to 10 but can be reset via SET.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Scroll up / use with M to scroll to top.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Scroll down / use with M to scroll to bottom.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Repeat previous command.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shift+PF10 performs an ALL for the text under the cursor.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Creates/appends the value under the cursor to a traceText upon the following line.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Saves current procedure and opens the INCLUDEd text under the cursor. If the cursor is not on an INCLUDE line, no action is taken.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User-written extensions (SCMDs)==&lt;br /&gt;
&lt;br /&gt;
SoulEdit has a facility that lets you add command-line extensions to the editor.&lt;br /&gt;
&lt;br /&gt;
As an example, INFO is a user-written command-line extension provided by Rocket Software. It provides XML-formatted information about any Model 204 system method (output from a &amp;lt;var&amp;gt;[[LoadSystemMethodInfo (XmlDoc subroutine)|LoadSystemMethodInfo]]&amp;lt;/var&amp;gt; method call). If during an ordinary editing session you type &amp;lt;code&amp;gt;info currenttimestring&amp;lt;/code&amp;gt; into the command line of SoulEdit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;caption&amp;quot; style=&amp;quot;margin-right:23em&amp;quot;&amp;gt;User-defined command entered on command line&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:SOUL_UserCommands1.png|border|500px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You see the output of the &amp;lt;var&amp;gt;LoadSystemMethodInfo&amp;lt;/var&amp;gt; call displayed in a scrollable screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:SOUL_UserCommands2.png|border|750px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pressing the PF3 key returns to the in-progress editing session.&lt;br /&gt;
&lt;br /&gt;
The editor extensions are created via &#039;&#039;&#039;SCMD&#039;&#039;&#039; procedures stored in a user-designated file. You can see how INFO works by looking at procedure &amp;lt;code&amp;gt;SCMD\INFO&amp;lt;/code&amp;gt; in the UL/SPF &amp;lt;code&amp;gt;SIRIUS&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
To create your own commands, specify the procedure file where they will reside using the &amp;lt;var&amp;gt;PROFILE&amp;lt;/var&amp;gt; command and &#039;&#039;Custom Macros File&#039;&#039;. SoulEdit scans this file for procedures prefixed with &amp;lt;code&amp;gt;SCMD\&amp;lt;/code&amp;gt; and loads them into memory at the beginning of the editing session. Copy &amp;lt;code&amp;gt;SCMD\INFO&amp;lt;/code&amp;gt; into your Macros file with a new name, and customize the &#039;&#039;run&#039;&#039; method to your liking.&lt;br /&gt;
&lt;br /&gt;
==Timed backups==&lt;br /&gt;
SoulEdit can take timed backups of the procedures you are editing. This feature can be enabled on a user-by-user basis with the &amp;lt;var&amp;gt;PROFILE&amp;lt;/var&amp;gt; command. Backups are taken by default to the same file in which a procedure is being edited. Optionally a separate backup file can be specified, also using &amp;lt;var&amp;gt;PROFILE&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Auditing==&lt;br /&gt;
SoulEdit has an Auditing feature to list entries from the current journal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;var&amp;gt;AUDIT&amp;lt;/var&amp;gt; options are:-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;AUDIT&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;list the previous 1 minute of the current journal.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;AUDIT &amp;lt;n&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;where &amp;lt;n&amp;gt; is numeric from 1 to 999 indicating how many minutes of the journal to show.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;AUDIT HH:MI[:SS.XX]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;list the journal entries from the specified time.  The : and . are optional&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;AUDIT LAST[ RUN]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;After running a procedure with the &amp;lt;var&amp;gt;GO&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;RUN&amp;lt;/var&amp;gt; command from inside SoulEdit this command will show all the journal entries pertaining to the job run.  It excludes anything not associated with the GO/RUN.  In addition to the journal entries for the thread RUN it also includes all spawned child threads by the RUN thread.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The colors used by SoulEdit for displaying journal entries are taken from the users SIRSCAN profile.  If the user does not have a SIRISCAN profile then default colors for SIRSCAN are used.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[SirPro]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[SirLib]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Sirius Software products]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=SoulEdit&amp;diff=78349</id>
		<title>SoulEdit</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=SoulEdit&amp;diff=78349"/>
		<updated>2015-07-21T05:54:57Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* Auditing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;SoulEdit&#039;&#039;&#039; is a code editor, written in SOUL, specifically designed for SOUL application development. SoulEdit features extended editing capability &amp;amp;mdash; like split/join, bookmarks, display filtering and syntax-specific colors &amp;amp;mdash; as well as facilities that make running, debugging, and testing SOUL code more seamless and intuitive.&lt;br /&gt;
&lt;br /&gt;
SoulEdit runs as an [[Application Subsystem development|application subsystem]], so it needs a subsystem definition along with at least a 640K server size (750K is safer as that provides room for future enhancements and the addition of user-written macros). The [[UL/SPF installation guide]] contains more information about setting up the environment for SoulEdit. &lt;br /&gt;
&lt;br /&gt;
SoulEdit is built into &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;, one of the [[ULSPF|UL/SPF]] family of products from Rocket Software, and it can also be run as a standalone editor by setting up a separate application subsystem. At Rocket it runs as an application subsystem called &amp;lt;code&amp;gt;SE&amp;lt;/code&amp;gt;, so it is executable from the command line. Details for setting up your own SoulEdit subsystem are also in the UL/SPF installation guide.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; is a menu-driven application subsystem that provides tools for programmers, database administrators and application managers inside the Model&amp;amp;nbsp;204 environment. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;&#039;s primary feature set is centered on the manipulation of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; procedures contained in Model 204 files.  To access SoulEdit from &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;, use the &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; prefix command from the list of procedures. If SoulEdit is defined as a standalone subsystem (for example, &amp;lt;code&amp;gt;SE&amp;lt;/code&amp;gt;), simply type the subsystem name with a procedure: &amp;lt;code&amp;gt;SE MYPROCEDURE&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;MYPROCEDURE&amp;lt;/code&amp;gt; is a procedure in the current file.&lt;br /&gt;
&lt;br /&gt;
One of the most useful features of SoulEdit is the ability to run a program via the GO command and immediately view the output in a scrollable [[Stringlist class | StringList]]. If errors occurred while running, a series of &amp;lt;var&amp;gt;AUDIT&amp;lt;/var&amp;gt; commands is available to display the audit trail output of the procedure you&#039;ve just run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;caption&amp;quot; style=&amp;quot;margin-right:15em&amp;quot;&amp;gt;SoulEdit main editing screen&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:SoulEdit_Overview.png|border|750px]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The top line shows the name of the SOUL procedure, the file where the procedure lives, and a warning if the file is in read-only mode. At the right are shown the line numbers with the current top-of-the-screen line number. Note the color-coding of lines in the sample; colors are user-settable via the &amp;lt;var&amp;gt;COLORS&amp;lt;/var&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
==Command line options==        &lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr class=&amp;quot;head&amp;quot;&amp;gt;&amp;lt;th&amp;gt;Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Result&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;T[&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] | TOP [&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] | M+PF7 &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Go to the top of the editor content; optional &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; (linenum) as top of page. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;B | BOTTOM | M+PF8 &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Go to the bottom of the editor content. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;C &amp;lt;i&amp;gt;lineNumber&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Center the line specified by &amp;lt;i&amp;gt;lineNumber&amp;lt;/i&amp;gt;. &amp;lt;i&amp;gt;lineNumber&amp;lt;/i&amp;gt; is absolute, not relative. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;+ | -&amp;lt;i&amp;gt;numericValue&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Position content relative to the numeric value. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;[-]F | Find &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Find previous/next value from cursor position (PF5 repeats last find). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;[-]/&amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Find previous/next value from cursor position (PF5 repeats last find). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;R | REPLACE/&amp;lt;i&amp;gt;replaceThis&amp;lt;/i&amp;gt;/&amp;lt;i&amp;gt;withThis&amp;lt;/i&amp;gt;[[/&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] ALL] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Replace, where &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; specifies replacements per line. The character immediately following the &amp;lt;var&amp;gt;R&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;REPLACE&amp;lt;/var&amp;gt; is used as a delimiter between tokens (cannot be alphanumeric). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;A | ALL &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Hide all lines that do not match &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt;. A command without a &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; performs a &amp;lt;var&amp;gt;SHOW ALL&amp;lt;/var&amp;gt; instead. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;HIDE &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Hide all lines that match &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt;. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW | HIDE COMMENTS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show or hide all comment lines. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;UNHIDE &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Unhide all lines that match &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt;. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLEAR HIDDEN | RESET HIDDEN &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all hidden lines (unhide). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW ALL | SHOW HIDDEN &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all hidden lines (unhide). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;GO &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Run the program, and capture the output into a scrollable screen. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;[IN &amp;lt;i&amp;gt;fileName&amp;lt;/i&amp;gt; ]GET &amp;lt;i&amp;gt;procName&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Obtain the named procedure and insert into editor. You can use line command targeting. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SAVE[ &amp;lt;i&amp;gt;procName&amp;lt;/i&amp;gt;] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Save current editor content (optional save into a different named procedure, including temporary procedures). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;END &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Perform &amp;lt;var&amp;gt;SAVE&amp;lt;/var&amp;gt; and exit the editor. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;QUIT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Exit the editor without saving or giving a modification warning. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;ALIGN &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Requires BB line command range (has issues when crossing &amp;quot;block&amp;quot; statements). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SORT [A | D | ASC | DESC | ASCENDING | DESCENDING]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Requires BB line command range. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLEAR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all line commands. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;RESET PROC | RELOAD | RELOAD PROC &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Discards any changes by reloading the current procedure from file. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;REFRESH PAGE &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ignore any changes to this page since last enter. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;NUM | NUMS | NUMBERS [ON | OFF] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show line numbers in prefix field (toggle). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;= &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Repeat last command (same as PF9). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;i&amp;gt;command stack&amp;lt;/i&amp;gt; (PF6) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Cycles through the command stack. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SET COMMAND STACK &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Defaults to 10; user may increase/decrease. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Split/join lines (PF2) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Cursor sensitive: if no data from cursor, a join is performed; else split is performed. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;FLIP HIDDEN &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Flip the hidden state of lines: hidden-&amp;gt;shown &amp;amp;&amp;amp; shown-&amp;gt;hidden. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;FF | BB+FORMAT - FORMAT [&amp;lt;i&amp;gt;width&amp;lt;/i&amp;gt;] [INDENT &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Format range (indents and alignment). &amp;lt;i&amp;gt;Not fully completed, but mostly functional.&amp;lt;/i&amp;gt; &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;UNDO FORMAT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Reinstate the last &amp;lt;var&amp;gt;FORMAT&amp;lt;/var&amp;gt; to its state before the format (does not check if code has changed). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SET FORMAT &amp;lt;i&amp;gt;type&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Force the formatting type used by &amp;lt;var&amp;gt;FORMAT/FF&amp;lt;/var&amp;gt;. Valid types: M204, XSL. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th nowrap&amp;gt;RUN   (saves and runs code in a daemon)&lt;br /&gt;
RUN TERM (saves and runs code on current thread)&lt;br /&gt;
RUN [TERM] [&amp;lt;i&amp;gt;procName&amp;lt;/i&amp;gt; [FILE &amp;lt;i&amp;gt;filename&amp;lt;/i&amp;gt; [PASS &amp;lt;i&amp;gt;password&amp;lt;/i&amp;gt;]]] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Output from the execution is scrollable (lost daemons are trapped and reported). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW [ [RUN | OUTPUT] | RUN OUTPUT] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show the output from the last executed code or command line VAR/SHOW [SEQ] CHANGES. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW CHANGES &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Compares current content against procedure on file, and display in a scrollable form. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW SEQ CHANGES &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Do compare against SEQ version in same procedure file. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SCALE (toggles on/off) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt; |...+....1....+....2....+....3...&amp;lt;/code&amp;gt; etc. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;PFKEYS (toggles on/off) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show valid PF keys on the last line of the page. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;NEW PROC[EDURE] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear current code (essentially a quit), and start with a blank procedure. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Formatting for XSL &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Change formatting where procedure name ends with &amp;lt;code&amp;gt;.xsl&amp;lt;/code&amp;gt;. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;HELP (PF1) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Display Help text. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;VAR | VARS | VARIABLES &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show variable usage(counts) within scope. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SETUP | PROFILE &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Set user editor preferences. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;COLORS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Set user editor-color preferences. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;.&amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Bookmarks. For example: &amp;lt;code&amp;gt;.foo&amp;lt;/code&amp;gt; as a line command bookmarks the line. &amp;lt;code&amp;gt;.foo&amp;lt;/code&amp;gt; as a command focuses the bookmark. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLEAR BOOKMARKS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all bookmarks. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;XCOMPARE | XC [EXACT | DEBLANK | COMPRESS] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;XCompares current content against procedure on file; displays in a scrollable form. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;XCOMPARE SEQ| XCS [EXACT | DEBLANK | COMPRESS] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Do XCompare against SEQ version in same procedure file (only works for SirLib users). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;LAYOUT | MAP &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;List all class/subroutines/functions. PF4 focuses entry from listing. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;INCLUDES command &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show hierarchy of all includes referenced within the current procedure. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;PROTECT/UNPROTECT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Force the displayed content to be protected/unprotected.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;BB | BLOCK WHERE &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Add BB markers to the current &amp;quot;where&amp;quot; scope. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;AUDIT [&amp;lt;i&amp;gt;minutes&amp;lt;/i&amp;gt; | &amp;lt;i&amp;gt;timestamp&amp;lt;/i&amp;gt; | LAST[RUN]] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Shows the journal lines for the user. It defaults to the last minute, unless an optional time is supplied. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SET FILE &amp;lt;i&amp;gt;fileName&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Sets the file name for saving procedures; also clears the procedure name. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SNAP | SNAPSHOT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Takes a copy of the code in the current editing session and saves it as snapshot.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;XCB [&amp;lt;i&amp;gt;previous-snapshot-offset&amp;lt;/i&amp;gt;] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Compare the current code against the last snapshot taken. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;                                                                                                                                              &lt;br /&gt;
&lt;br /&gt;
Used in conjunction with the pf12 key on the run output when compilation/runtime errors occur, the following commands can be used to navigate &lt;br /&gt;
through the errors in the currently loaded procedure:    &lt;br /&gt;
                                                                                       &lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;NE | NEXT ERROR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Navigate to the next error. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;PE | PREVIOUS ERROR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Navigate to the previous error. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CE | CURRENT ERROR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Navigate to the current error. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLE | CLEAR ERRORS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear the error bookmarks. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;                                                                                                                                                                                                                                                  &lt;br /&gt;
==Line prefix commands==&lt;br /&gt;
&lt;br /&gt;
===Block prefixes, with repeating ignored=== &lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CC&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block copy (requires targeting prefix). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;MM&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block move (requires targeting prefix).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;DD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block delete.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;HH&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block hide.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;**&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block comment (set/clear; first line is used to determine state switch. If first character is &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, comments are removed).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;BB&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block boundaries. Used with editor commands: SORT, ALIGN, FORMAT. Optional for R, REPLACE.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                           &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;FF&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Format the specified block. Sets indenting to the number of spaces specified in the user profile.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Block prefixes, with repeating honored===&lt;br /&gt;
For example, &amp;lt;code&amp;gt;&amp;quot;&amp;quot;3&amp;lt;/code&amp;gt; replicates the block three times.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;RR &amp;quot;&amp;quot;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block replicate&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;&amp;lt; ((&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block shift left (with protections to prevent loss of leading text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;gt;&amp;gt; ))&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block shift right (with protections to prevent loss of trailing text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Targeting prefixes===&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;A&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target after line&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;F&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target following line &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;B&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target before line&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt; P&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target previous line&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Singular prefixes, with repeating ignored===&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;C&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Copy (requires targeting prefix).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;M&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Move (requires targeting prefix).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;E&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Expand line to 255 bytes (toggles on/off).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;/&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Center this line.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;-&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Folding of blocks; hide lines from marked line to closing/opening block. &amp;lt;p&amp;gt;Example: &amp;lt;code&amp;gt;if -&amp;gt; end if... &amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;X&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Expand/collapse INCLUDE inline. Only usable on &amp;lt;var&amp;gt;INCLUDE&amp;lt;/var&amp;gt; lines. The expanded INCLUDE lines are protected.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Singular prefixes, with repeating honored===&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;H&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Hide&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                                           &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;S +&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;D&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Delete&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;R &amp;quot;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Replicate&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;*&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Comment (set/clear; if first character is &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, comments are removed)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt; (&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Shift line left (with protections to prevent loss of leading text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;gt; )&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Shift line right (with protections to prevent loss of trailing text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;     &lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PF keys==&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Help&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Split the current line at the cursor, or join the current line with the next line if cursor is at end-of-line.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Quit the editor without saving.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Cycle through the command stack. The command stack size defaults to 10 but can be reset via SET.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Scroll up / use with M to scroll to top.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Scroll down / use with M to scroll to bottom.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Repeat previous command.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shift+PF10 performs an ALL for the text under the cursor.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Creates/appends the value under the cursor to a traceText upon the following line.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Saves current procedure and opens the INCLUDEd text under the cursor. If the cursor is not on an INCLUDE line, no action is taken.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User-written extensions (SCMDs)==&lt;br /&gt;
&lt;br /&gt;
SoulEdit has a facility that lets you add command-line extensions to the editor.&lt;br /&gt;
&lt;br /&gt;
As an example, INFO is a user-written command-line extension provided by Rocket Software. It provides XML-formatted information about any Model 204 system method (output from a &amp;lt;var&amp;gt;[[LoadSystemMethodInfo (XmlDoc subroutine)|LoadSystemMethodInfo]]&amp;lt;/var&amp;gt; method call). If during an ordinary editing session you type &amp;lt;code&amp;gt;info currenttimestring&amp;lt;/code&amp;gt; into the command line of SoulEdit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;caption&amp;quot; style=&amp;quot;margin-right:23em&amp;quot;&amp;gt;User-defined command entered on command line&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:SOUL_UserCommands1.png|border|500px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You see the output of the &amp;lt;var&amp;gt;LoadSystemMethodInfo&amp;lt;/var&amp;gt; call displayed in a scrollable screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:SOUL_UserCommands2.png|border|750px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pressing the PF3 key returns to the in-progress editing session.&lt;br /&gt;
&lt;br /&gt;
The editor extensions are created via &#039;&#039;&#039;SCMD&#039;&#039;&#039; procedures stored in a user-designated file. You can see how INFO works by looking at procedure &amp;lt;code&amp;gt;SCMD\INFO&amp;lt;/code&amp;gt; in the UL/SPF &amp;lt;code&amp;gt;SIRIUS&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
To create your own commands, specify the procedure file where they will reside using the &amp;lt;var&amp;gt;PROFILE&amp;lt;/var&amp;gt; command and &#039;&#039;Custom Macros File&#039;&#039;. SoulEdit scans this file for procedures prefixed with &amp;lt;code&amp;gt;SCMD\&amp;lt;/code&amp;gt; and loads them into memory at the beginning of the editing session. Copy &amp;lt;code&amp;gt;SCMD\INFO&amp;lt;/code&amp;gt; into your Macros file with a new name, and customize the &#039;&#039;run&#039;&#039; method to your liking.&lt;br /&gt;
&lt;br /&gt;
==Timed backups==&lt;br /&gt;
SoulEdit can take timed backups of the procedures you are editing. This feature can be enabled on a user-by-user basis with the &amp;lt;var&amp;gt;PROFILE&amp;lt;/var&amp;gt; command. Backups are taken by default to the same file in which a procedure is being edited. Optionally a separate backup file can be specified, also using &amp;lt;var&amp;gt;PROFILE&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Auditing==&lt;br /&gt;
SoulEdit has an Auditing feature to list entries from the current journal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;var&amp;gt;AUDIT&amp;lt;/var&amp;gt; options are:-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;AUDIT&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;list the previous 1 minute of the current journal.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;AUDIT &amp;lt;n&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;where &amp;lt;n&amp;gt; is numeric from 1 to 999 indicating how many minutes of the journal to show.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;AUDIT HH:MI[:SS.XX]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;list the journal entries from the specified time.  The : and . are optional&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;AUDIT LAST[ RUN]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;After running a procedure with the &amp;lt;var&amp;gt;GO&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;RUN&amp;lt;/var&amp;gt; command from inside SoulEdit this command will show all the journal entries pertaining to the job run.  It excludes anything not associated with the GO/RUN.  In addition to the journal entries for the thread RUN it also includes all spawned child threads by the RUN thread.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[SirPro]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[SirLib]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Sirius Software products]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=SoulEdit&amp;diff=78338</id>
		<title>SoulEdit</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=SoulEdit&amp;diff=78338"/>
		<updated>2015-07-21T05:23:47Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* Auditing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;SoulEdit&#039;&#039;&#039; is a code editor, written in SOUL, specifically designed for SOUL application development. SoulEdit features extended editing capability &amp;amp;mdash; like split/join, bookmarks, display filtering and syntax-specific colors &amp;amp;mdash; as well as facilities that make running, debugging, and testing SOUL code more seamless and intuitive.&lt;br /&gt;
&lt;br /&gt;
SoulEdit runs as an [[Application Subsystem development|application subsystem]], so it needs a subsystem definition along with at least a 640K server size (750K is safer as that provides room for future enhancements and the addition of user-written macros). The [[UL/SPF installation guide]] contains more information about setting up the environment for SoulEdit. &lt;br /&gt;
&lt;br /&gt;
SoulEdit is built into &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;, one of the [[ULSPF|UL/SPF]] family of products from Rocket Software, and it can also be run as a standalone editor by setting up a separate application subsystem. At Rocket it runs as an application subsystem called &amp;lt;code&amp;gt;SE&amp;lt;/code&amp;gt;, so it is executable from the command line. Details for setting up your own SoulEdit subsystem are also in the UL/SPF installation guide.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; is a menu-driven application subsystem that provides tools for programmers, database administrators and application managers inside the Model&amp;amp;nbsp;204 environment. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;&#039;s primary feature set is centered on the manipulation of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; procedures contained in Model 204 files.  To access SoulEdit from &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt;, use the &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; prefix command from the list of procedures. If SoulEdit is defined as a standalone subsystem (for example, &amp;lt;code&amp;gt;SE&amp;lt;/code&amp;gt;), simply type the subsystem name with a procedure: &amp;lt;code&amp;gt;SE MYPROCEDURE&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;MYPROCEDURE&amp;lt;/code&amp;gt; is a procedure in the current file.&lt;br /&gt;
&lt;br /&gt;
One of the most useful features of SoulEdit is the ability to run a program via the GO command and immediately view the output in a scrollable [[Stringlist class | StringList]]. If errors occurred while running, a series of &amp;lt;var&amp;gt;AUDIT&amp;lt;/var&amp;gt; commands is available to display the audit trail output of the procedure you&#039;ve just run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;caption&amp;quot; style=&amp;quot;margin-right:15em&amp;quot;&amp;gt;SoulEdit main editing screen&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:SoulEdit_Overview.png|border|750px]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The top line shows the name of the SOUL procedure, the file where the procedure lives, and a warning if the file is in read-only mode. At the right are shown the line numbers with the current top-of-the-screen line number. Note the color-coding of lines in the sample; colors are user-settable via the &amp;lt;var&amp;gt;COLORS&amp;lt;/var&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
==Command line options==        &lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr class=&amp;quot;head&amp;quot;&amp;gt;&amp;lt;th&amp;gt;Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Result&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;T[&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] | TOP [&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] | M+PF7 &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Go to the top of the editor content; optional &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; (linenum) as top of page. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;B | BOTTOM | M+PF8 &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Go to the bottom of the editor content. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;C &amp;lt;i&amp;gt;lineNumber&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Center the line specified by &amp;lt;i&amp;gt;lineNumber&amp;lt;/i&amp;gt;. &amp;lt;i&amp;gt;lineNumber&amp;lt;/i&amp;gt; is absolute, not relative. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;+ | -&amp;lt;i&amp;gt;numericValue&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Position content relative to the numeric value. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;[-]F | Find &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Find previous/next value from cursor position (PF5 repeats last find). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;[-]/&amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Find previous/next value from cursor position (PF5 repeats last find). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;R | REPLACE/&amp;lt;i&amp;gt;replaceThis&amp;lt;/i&amp;gt;/&amp;lt;i&amp;gt;withThis&amp;lt;/i&amp;gt;[[/&amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] ALL] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Replace, where &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; specifies replacements per line. The character immediately following the &amp;lt;var&amp;gt;R&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;REPLACE&amp;lt;/var&amp;gt; is used as a delimiter between tokens (cannot be alphanumeric). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;A | ALL &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Hide all lines that do not match &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt;. A command without a &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; performs a &amp;lt;var&amp;gt;SHOW ALL&amp;lt;/var&amp;gt; instead. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;HIDE &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Hide all lines that match &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt;. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW | HIDE COMMENTS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show or hide all comment lines. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;UNHIDE &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Unhide all lines that match &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt;. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLEAR HIDDEN | RESET HIDDEN &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all hidden lines (unhide). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW ALL | SHOW HIDDEN &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all hidden lines (unhide). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;GO &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Run the program, and capture the output into a scrollable screen. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;[IN &amp;lt;i&amp;gt;fileName&amp;lt;/i&amp;gt; ]GET &amp;lt;i&amp;gt;procName&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Obtain the named procedure and insert into editor. You can use line command targeting. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SAVE[ &amp;lt;i&amp;gt;procName&amp;lt;/i&amp;gt;] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Save current editor content (optional save into a different named procedure, including temporary procedures). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;END &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Perform &amp;lt;var&amp;gt;SAVE&amp;lt;/var&amp;gt; and exit the editor. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;QUIT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Exit the editor without saving or giving a modification warning. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;ALIGN &amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Requires BB line command range (has issues when crossing &amp;quot;block&amp;quot; statements). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SORT [A | D | ASC | DESC | ASCENDING | DESCENDING]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Requires BB line command range. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLEAR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all line commands. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;RESET PROC | RELOAD | RELOAD PROC &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Discards any changes by reloading the current procedure from file. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;REFRESH PAGE &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ignore any changes to this page since last enter. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;NUM | NUMS | NUMBERS [ON | OFF] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show line numbers in prefix field (toggle). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;= &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Repeat last command (same as PF9). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;i&amp;gt;command stack&amp;lt;/i&amp;gt; (PF6) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Cycles through the command stack. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SET COMMAND STACK &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Defaults to 10; user may increase/decrease. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Split/join lines (PF2) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Cursor sensitive: if no data from cursor, a join is performed; else split is performed. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;FLIP HIDDEN &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Flip the hidden state of lines: hidden-&amp;gt;shown &amp;amp;&amp;amp; shown-&amp;gt;hidden. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;FF | BB+FORMAT - FORMAT [&amp;lt;i&amp;gt;width&amp;lt;/i&amp;gt;] [INDENT &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt;] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Format range (indents and alignment). &amp;lt;i&amp;gt;Not fully completed, but mostly functional.&amp;lt;/i&amp;gt; &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;UNDO FORMAT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Reinstate the last &amp;lt;var&amp;gt;FORMAT&amp;lt;/var&amp;gt; to its state before the format (does not check if code has changed). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SET FORMAT &amp;lt;i&amp;gt;type&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Force the formatting type used by &amp;lt;var&amp;gt;FORMAT/FF&amp;lt;/var&amp;gt;. Valid types: M204, XSL. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th nowrap&amp;gt;RUN   (saves and runs code in a daemon)&lt;br /&gt;
RUN TERM (saves and runs code on current thread)&lt;br /&gt;
RUN [TERM] [&amp;lt;i&amp;gt;procName&amp;lt;/i&amp;gt; [FILE &amp;lt;i&amp;gt;filename&amp;lt;/i&amp;gt; [PASS &amp;lt;i&amp;gt;password&amp;lt;/i&amp;gt;]]] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Output from the execution is scrollable (lost daemons are trapped and reported). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW [ [RUN | OUTPUT] | RUN OUTPUT] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show the output from the last executed code or command line VAR/SHOW [SEQ] CHANGES. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW CHANGES &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Compares current content against procedure on file, and display in a scrollable form. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SHOW SEQ CHANGES &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Do compare against SEQ version in same procedure file. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SCALE (toggles on/off) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt; |...+....1....+....2....+....3...&amp;lt;/code&amp;gt; etc. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;PFKEYS (toggles on/off) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show valid PF keys on the last line of the page. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;NEW PROC[EDURE] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear current code (essentially a quit), and start with a blank procedure. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Formatting for XSL &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Change formatting where procedure name ends with &amp;lt;code&amp;gt;.xsl&amp;lt;/code&amp;gt;. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;HELP (PF1) &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Display Help text. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;VAR | VARS | VARIABLES &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show variable usage(counts) within scope. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SETUP | PROFILE &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Set user editor preferences. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;COLORS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Set user editor-color preferences. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;.&amp;lt;i&amp;gt;value&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Bookmarks. For example: &amp;lt;code&amp;gt;.foo&amp;lt;/code&amp;gt; as a line command bookmarks the line. &amp;lt;code&amp;gt;.foo&amp;lt;/code&amp;gt; as a command focuses the bookmark. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLEAR BOOKMARKS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear all bookmarks. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;XCOMPARE | XC [EXACT | DEBLANK | COMPRESS] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;XCompares current content against procedure on file; displays in a scrollable form. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;XCOMPARE SEQ| XCS [EXACT | DEBLANK | COMPRESS] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Do XCompare against SEQ version in same procedure file (only works for SirLib users). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;LAYOUT | MAP &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;List all class/subroutines/functions. PF4 focuses entry from listing. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;INCLUDES command &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show hierarchy of all includes referenced within the current procedure. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;PROTECT/UNPROTECT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Force the displayed content to be protected/unprotected.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;BB | BLOCK WHERE &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Add BB markers to the current &amp;quot;where&amp;quot; scope. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;AUDIT [&amp;lt;i&amp;gt;minutes&amp;lt;/i&amp;gt; | &amp;lt;i&amp;gt;timestamp&amp;lt;/i&amp;gt; | LAST[RUN]] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Shows the journal lines for the user. It defaults to the last minute, unless an optional time is supplied. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SET FILE &amp;lt;i&amp;gt;fileName&amp;lt;/i&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Sets the file name for saving procedures; also clears the procedure name. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;SNAP | SNAPSHOT &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Takes a copy of the code in the current editing session and saves it as snapshot.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;XCB [&amp;lt;i&amp;gt;previous-snapshot-offset&amp;lt;/i&amp;gt;] &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Compare the current code against the last snapshot taken. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;                                                                                                                                              &lt;br /&gt;
&lt;br /&gt;
Used in conjunction with the pf12 key on the run output when compilation/runtime errors occur, the following commands can be used to navigate &lt;br /&gt;
through the errors in the currently loaded procedure:    &lt;br /&gt;
                                                                                       &lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;NE | NEXT ERROR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Navigate to the next error. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;PE | PREVIOUS ERROR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Navigate to the previous error. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CE | CURRENT ERROR &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Navigate to the current error. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CLE | CLEAR ERRORS &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clear the error bookmarks. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;                                                                                                                                                                                                                                                  &lt;br /&gt;
==Line prefix commands==&lt;br /&gt;
&lt;br /&gt;
===Block prefixes, with repeating ignored=== &lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CC&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block copy (requires targeting prefix). &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;MM&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block move (requires targeting prefix).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;DD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block delete.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;HH&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block hide.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;**&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block comment (set/clear; first line is used to determine state switch. If first character is &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, comments are removed).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;BB&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block boundaries. Used with editor commands: SORT, ALIGN, FORMAT. Optional for R, REPLACE.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                           &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;FF&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Format the specified block. Sets indenting to the number of spaces specified in the user profile.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Block prefixes, with repeating honored===&lt;br /&gt;
For example, &amp;lt;code&amp;gt;&amp;quot;&amp;quot;3&amp;lt;/code&amp;gt; replicates the block three times.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;RR &amp;quot;&amp;quot;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block replicate&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;&amp;lt; ((&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block shift left (with protections to prevent loss of leading text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;gt;&amp;gt; ))&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Block shift right (with protections to prevent loss of trailing text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Targeting prefixes===&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;A&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target after line&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;F&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target following line &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;B&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target before line&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt; P&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Target previous line&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Singular prefixes, with repeating ignored===&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;C&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Copy (requires targeting prefix).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;M&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Move (requires targeting prefix).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;E&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Expand line to 255 bytes (toggles on/off).&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;/&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Center this line.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;-&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Folding of blocks; hide lines from marked line to closing/opening block. &amp;lt;p&amp;gt;Example: &amp;lt;code&amp;gt;if -&amp;gt; end if... &amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;X&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Expand/collapse INCLUDE inline. Only usable on &amp;lt;var&amp;gt;INCLUDE&amp;lt;/var&amp;gt; lines. The expanded INCLUDE lines are protected.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Singular prefixes, with repeating honored===&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;H&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Hide&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                                           &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;S +&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Show&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;D&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Delete&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;R &amp;quot;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Replicate&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;*&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Comment (set/clear; if first character is &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, comments are removed)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt; (&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Shift line left (with protections to prevent loss of leading text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;gt; )&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Shift line right (with protections to prevent loss of trailing text)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;     &lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PF keys==&lt;br /&gt;
&amp;lt;table class=&amp;quot;thJustBold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Help&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Split the current line at the cursor, or join the current line with the next line if cursor is at end-of-line.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Quit the editor without saving.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Cycle through the command stack. The command stack size defaults to 10 but can be reset via SET.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Scroll up / use with M to scroll to top.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Scroll down / use with M to scroll to bottom.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Repeat previous command.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shift+PF10 performs an ALL for the text under the cursor.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Creates/appends the value under the cursor to a traceText upon the following line.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PF12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Saves current procedure and opens the INCLUDEd text under the cursor. If the cursor is not on an INCLUDE line, no action is taken.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User-written extensions (SCMDs)==&lt;br /&gt;
&lt;br /&gt;
SoulEdit has a facility that lets you add command-line extensions to the editor.&lt;br /&gt;
&lt;br /&gt;
As an example, INFO is a user-written command-line extension provided by Rocket Software. It provides XML-formatted information about any Model 204 system method (output from a &amp;lt;var&amp;gt;[[LoadSystemMethodInfo (XmlDoc subroutine)|LoadSystemMethodInfo]]&amp;lt;/var&amp;gt; method call). If during an ordinary editing session you type &amp;lt;code&amp;gt;info currenttimestring&amp;lt;/code&amp;gt; into the command line of SoulEdit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;caption&amp;quot; style=&amp;quot;margin-right:23em&amp;quot;&amp;gt;User-defined command entered on command line&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:SOUL_UserCommands1.png|border|500px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You see the output of the &amp;lt;var&amp;gt;LoadSystemMethodInfo&amp;lt;/var&amp;gt; call displayed in a scrollable screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;figure&amp;quot;&amp;gt;[[File:SOUL_UserCommands2.png|border|750px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pressing the PF3 key returns to the in-progress editing session.&lt;br /&gt;
&lt;br /&gt;
The editor extensions are created via &#039;&#039;&#039;SCMD&#039;&#039;&#039; procedures stored in a user-designated file. You can see how INFO works by looking at procedure &amp;lt;code&amp;gt;SCMD\INFO&amp;lt;/code&amp;gt; in the UL/SPF &amp;lt;code&amp;gt;SIRIUS&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
To create your own commands, specify the procedure file where they will reside using the &amp;lt;var&amp;gt;PROFILE&amp;lt;/var&amp;gt; command and &#039;&#039;Custom Macros File&#039;&#039;. SoulEdit scans this file for procedures prefixed with &amp;lt;code&amp;gt;SCMD\&amp;lt;/code&amp;gt; and loads them into memory at the beginning of the editing session. Copy &amp;lt;code&amp;gt;SCMD\INFO&amp;lt;/code&amp;gt; into your Macros file with a new name, and customize the &#039;&#039;run&#039;&#039; method to your liking.&lt;br /&gt;
&lt;br /&gt;
==Timed backups==&lt;br /&gt;
SoulEdit can take timed backups of the procedures you are editing. This feature can be enabled on a user-by-user basis with the &amp;lt;var&amp;gt;PROFILE&amp;lt;/var&amp;gt; command. Backups are taken by default to the same file in which a procedure is being edited. Optionally a separate backup file can be specified, also using &amp;lt;var&amp;gt;PROFILE&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Auditing==&lt;br /&gt;
SoulEdit has an Auditing feature to list entries from the current journal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;var&amp;gt;AUDIT&amp;lt;/var&amp;gt; options are:-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;AUDIT&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;list the previous 1 minute of the current journal&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;AUDIT &amp;lt;n&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;where &amp;lt;n&amp;gt; is a positive number indicating how many minutes of the journal to show.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;AUDIT LAST[ RUN]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;After running a procedure with the &amp;lt;var&amp;gt;GO&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;RUN&amp;lt;/var&amp;gt; command from inside SoulEdit this command will show all the journal entries pertaining to the job run.  It excludes anything not associated with the GO/RUN.  In addition to the journal entries for the thread RUN it also includes all spawned daemon threads by the thread.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[SirPro]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[SirLib]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Sirius Software products]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=RecordLockingConflict_class&amp;diff=69106</id>
		<title>RecordLockingConflict class</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=RecordLockingConflict_class&amp;diff=69106"/>
		<updated>2014-04-25T04:20:19Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* Usage notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- RecordLockingConflict class --&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception class catches record locking conflict errors thrown by file object operations, that is, from methods in the &amp;lt;var&amp;gt;[[File_classes|file]]&amp;lt;/var&amp;gt; classes (&amp;lt;var&amp;gt;[[Record_class|Record]]&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;[[Recordset_class|Recordset]]&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;[[SortedRecordset_class|SortedRecordset]]&amp;lt;/var&amp;gt;, and &amp;lt;var&amp;gt;[[RecordsetCursor_class|RecordsetCursor]]&amp;lt;/var&amp;gt;).&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Summary=&lt;br /&gt;
A &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown only if there is a Catcher for the exception. This allows &amp;lt;code&amp;gt;On Record Locking Conflict&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;On Find Conflict&amp;lt;/code&amp;gt; units to trap record locking conflicts if there is no &amp;lt;var&amp;gt;[[Exceptions#Try and Catch|Catch]]&amp;lt;/var&amp;gt; block for the exception.&lt;br /&gt;
 &lt;br /&gt;
There is no distinction between a &amp;lt;var&amp;gt;Find&amp;lt;/var&amp;gt; conflict and a &amp;lt;var&amp;gt;Record Locking&amp;lt;/var&amp;gt; conflict. For example, you can use the following:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;[[Exceptions#Try and Catch|try]]&lt;br /&gt;
   fd to %foo&lt;br /&gt;
      ...&lt;br /&gt;
   end find&lt;br /&gt;
[[Exceptions#Try and Catch|catch]] recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
And you can also use:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;try&lt;br /&gt;
   %rec = [[New_(Record_constructor)|new]](%recnum, exclusive)&lt;br /&gt;
   for record %rec&lt;br /&gt;
       ...&lt;br /&gt;
   end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You can even catch record locking conflicts caused by &amp;lt;var&amp;gt;[[LoopLockStrength_(Record_property)|LoopLockStrength]]&amp;lt;/var&amp;gt; promotions during a loop:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%rec = new(%recnum, none, loopLockStrength=share)&lt;br /&gt;
 ...&lt;br /&gt;
try for record %rec&lt;br /&gt;
    ...&lt;br /&gt;
    end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Or as in the following:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%curser = new(%recset, loopLockStrength=none)&lt;br /&gt;
 ...&lt;br /&gt;
try&lt;br /&gt;
   for record at cursor %curser&lt;br /&gt;
      ...&lt;br /&gt;
   end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ..&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Or as in this example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;fdwol to %recset = new(loopLockStrength=exclusive)&lt;br /&gt;
   ...&lt;br /&gt;
end find&lt;br /&gt;
 ...&lt;br /&gt;
try for each record in %recset&lt;br /&gt;
      ...&lt;br /&gt;
    end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In the latter example, note that any iteration of the &amp;lt;var&amp;gt;For&amp;lt;/var&amp;gt; loop can [[Exceptions#Throwing exceptions|throw]] an exception, and there is no way of picking up where you left off (at the next record, say) if you get a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception in such a case.  So, unless you always want to lose the whole loop on a record locking conflict, such a case is almost always better structured with a cursor on the recordset and with &amp;lt;var&amp;gt;Try&amp;lt;/var&amp;gt; around the &amp;lt;var&amp;gt;For Record At Cursor&amp;lt;/var&amp;gt; loop:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;fdwol to %recset = new(loopLockStrength=exclusive)&lt;br /&gt;
   ...&lt;br /&gt;
end find&lt;br /&gt;
 ...&lt;br /&gt;
%curser = new(%recset, loopLockStrength=exclusive)&lt;br /&gt;
repeat while %curser:state eq hasRecord&lt;br /&gt;
   try for record at cursor %curser&lt;br /&gt;
      ...&lt;br /&gt;
   end for&lt;br /&gt;
   catch recordLockingConflict&lt;br /&gt;
      ...&lt;br /&gt;
   end try&lt;br /&gt;
   %curser:next&lt;br /&gt;
end repeat&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; The &amp;lt;var&amp;gt;For&amp;lt;/var&amp;gt; statement can be on the same line as the &amp;lt;var&amp;gt;Try&amp;lt;/var&amp;gt;, or it can be inside the &amp;lt;var&amp;gt;Try&amp;lt;/var&amp;gt; block.&lt;br /&gt;
&lt;br /&gt;
=The RecordLockingConflict methods=&lt;br /&gt;
{{Template:List of RecordLockingConflict methods}}&lt;br /&gt;
&lt;br /&gt;
The methods in the class are described in the subsections that follow. In addition:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Notation conventions for methods|&amp;quot;Notation conventions for methods&amp;quot;]] has information&lt;br /&gt;
about the conventions followed. &lt;br /&gt;
&amp;lt;li&amp;gt;[[RecordLockingConflict methods syntax|&amp;quot;RecordLockingConflict methods syntax&amp;quot;]] is a single page that contains the syntax diagrams of all the methods in the class.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ConflictingLockStrength property==&lt;br /&gt;
&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingLockStrength subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; method returns a &amp;lt;var&amp;gt;[[LockStrength_enumeration|LockStrength]]&amp;lt;/var&amp;gt; enumeration value indicating the strength of the lock held by another user that caused the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingLockStrength syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%lockStrength&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value, a &amp;lt;var&amp;gt;LockStrength&amp;lt;/var&amp;gt; enumeration value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set, this property returns a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Since an unlocked record (&amp;lt;var&amp;gt;LockStrength&amp;lt;/var&amp;gt; &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;) cannot cause a record locking conflict, a non-&amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt; return value should always be either &amp;lt;var&amp;gt;Share&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;Exclusive&amp;lt;/var&amp;gt;.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ConflictingRecordLockType property==&lt;br /&gt;
&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingRecordLockType subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; method returns a &amp;lt;var&amp;gt;[[RecordLockType_enumeration|RecordLockType]]&amp;lt;/var&amp;gt; enumeration value indicating the type of the lock held by another user that caused the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingRecordLockType syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%recordLockType&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value, a &amp;lt;var&amp;gt;RecordLockType&amp;lt;/var&amp;gt; enumeration value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit isn&#039;t set, this property will return a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ConflictTimeMilliseconds property==&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictTimeMilliseconds subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns a number that is the number of milliseconds since 1900 that the record locking conflict occurred.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictTimeMilliseconds syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set, this property returns a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var&amp;gt;[[MillisecondsToString (Float function)|MillisecondsToString]]&amp;lt;/var&amp;gt; method can be used to convert this value to a more human-friendly format.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Copy and DeepCopy functions==&lt;br /&gt;
{{Template:RecordLockingConflict:Copy subtitle}}&lt;br /&gt;
&lt;br /&gt;
{{Template:RecordLockingConflict:DeepCopy subtitle}}&lt;br /&gt;
&lt;br /&gt;
These functions return a copy of the method object, that is the &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object to which they are applied.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:Copy syntax}}&lt;br /&gt;
{{Template:RecordLockingConflict:DeepCopy syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%outRecordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A RecordLockingConflict object variable to receive the output value.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Since &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; objects contain no references to other objects, there is no difference between a &amp;lt;var&amp;gt;Copy&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;DeepCopy&amp;lt;/var&amp;gt; method for these objects.&lt;br /&gt;
&amp;lt;li&amp;gt;The presence of a &amp;lt;var&amp;gt;DeepCopy&amp;lt;/var&amp;gt; method for the &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; class means that classes that contain references to &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; objects can also be &amp;lt;var&amp;gt;DeepCopy&amp;lt;/var&amp;gt;-able.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filename property==&lt;br /&gt;
{{Template:RecordLockingConflict:Filename subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns a &amp;lt;var&amp;gt;Longstring&amp;lt;/var&amp;gt; that contains the name of the file in which the last record locking conflict occurred.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:Filename syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%string&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A &amp;lt;var&amp;gt;longstring&amp;lt;/var&amp;gt; to receive the file name.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==LockTimeMilliseconds property==&lt;br /&gt;
{{Template:RecordLockingConflict:LockTimeMilliseconds subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns a number that is the number of milliseconds since 1900 that the record that caused the record locking conflict was locked.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:LockTimeMilliseconds syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set, this property returns a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var&amp;gt;[[MillisecondsToString (Float function)|MillisecondsToString]]&amp;lt;/var&amp;gt; method can be used to convert this value to a more human-friendly format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;LockingTimeMilliseconds, along with the &amp;lt;var&amp;gt;[[#LockingUserNumber property|LockingUserNumber]]&amp;lt;/var&amp;gt; property should make it relatively easy to locate the request that locked the record that caused the record lock in the audit trail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Strictly speaking, the returned lock time is the time the finding and locking process began for the locked record, not when it was actually locked. Since the primary purpose this value is to locate audit trail information for the request that locked the conficting record, and since the entire locking process always happens within a single request, this distinction should be relatively unimportant. &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LockingUserNumber property==&lt;br /&gt;
{{Template:RecordLockingConflict:LockingUserNumber subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; property returns the user number of the user that originally locked the conflicting record. This might be different from the value returned by the &amp;lt;var&amp;gt;[[#UserNumber property|UserNumber]]&amp;lt;/var&amp;gt; property if a file object is passed between threads as a session object. In fact, a record lock caused by a file object in a closed session would return the session PST&#039;s user number for &amp;lt;var&amp;gt;UserNumber&amp;lt;/var&amp;gt; but would return the user number that originally locked the record that caused the conflict. &lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:LockingUserNumber syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set, this property returns a &amp;lt;var&amp;gt;-1&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt;, along with the &amp;lt;var&amp;gt;LockTimeMilliseconds&amp;lt;/var&amp;gt; property should make it relatively easy to locate the request that locked the record that caused the record lock in the audit trail.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==New constructor==&lt;br /&gt;
{{Template:RecordLockingConflict:New subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;Constructor&amp;lt;/var&amp;gt; generates an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception. As shown in the syntax that follows, the &amp;lt;var&amp;gt;New&amp;lt;/var&amp;gt; method arguments set the values of the class properties having the corresponding names.  Each argument to &amp;lt;var&amp;gt;New&amp;lt;/var&amp;gt; sets the value of the corresponding property of the newly constructed &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:New syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;[%(RecordLockingConflict):]&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The class name in parentheses denotes a &amp;lt;var&amp;gt;[[Notation conventions for methods#Constructors|Constructor]]&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;Filename&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This [[Methods#Named parameters|name required]] parameter specifies the &amp;lt;var&amp;gt;[[Longstrings|Longstring]]&amp;lt;/var&amp;gt; value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;string&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[Filename_(RecordLockingConflict_property)|Filename]]&amp;lt;/var&amp;gt; property. Its default value is a null string.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;RecordNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[RecordNumber_(RecordLockingConflict_property)|RecordNumber]]&amp;lt;/var&amp;gt; property. Its default value is 0.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;UserNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the exception object&#039;s &amp;lt;var&amp;gt;[[UserID_(RecordLockingConflict_property)|UserNumber]]&amp;lt;/var&amp;gt; property. Its default value is 0.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;UserID&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name required parameter specifies the longstring value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;string&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[UserNumber_(RecordLockingConflict_property)|UserID]]&amp;lt;/var&amp;gt; property. Its default value is a null string.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[LockingUserNumber_(RecordLockingConflict_property)|LockingUserNumber]]&amp;lt;/var&amp;gt; property. Its default value is &amp;lt;var&amp;gt;-1&amp;lt;/var&amp;gt;, which is not a valid user number, and is the value set for the &amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;[[RECLOCKO parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;LockTimeMilliseconds&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[LockTimeMilliseconds_(RecordLockingConflict_property)|LockTimeMilliseconds]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt;, which is the value set for the LockTimeMilliseconds property by the system when the &amp;lt;var&amp;gt;RECLOCKO&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;ConflictTimeMilliseconds&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[ConflictTimeMilliseconds_(RecordLockingConflict_property)|ConflictTimeMilliseconds]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt;, which is the value set for the &amp;lt;var&amp;gt;ConflictTimeMilliseconds&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;RECLOCKO&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;ConflictingLockStrength&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the &amp;lt;var&amp;gt;[[LockStrength]]&amp;lt;/var&amp;gt; enumeration value to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[ConflictingLockStrength_(RecordLockingConflict_property)|ConflictingLockStrength]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;, which is the value set for the &amp;lt;var&amp;gt;ConflictingLockStrength&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;RECLOCKO&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. Since a record locking conflict cannot be caused by an unlocked record, setting this value to &amp;lt;var&amp;gt;None&amp;lt;/var&amp;gt; is equivalent to setting it to &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;ConflictingRecordLockType&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the &amp;lt;var&amp;gt;[[RecordLockType]]&amp;lt;/var&amp;gt; enumeration value to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[ConflictingRecordLockType_(RecordLockingConflict_property)|ConflictingRecordLockType]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;, which is the value set for the &amp;lt;var&amp;gt;ConflictingRecordLockType&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;RECLOCKO parameter&amp;lt;/var&amp;gt; X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==NewFromLastConflict constructor==&lt;br /&gt;
{{Template:RecordLockingConflict:NewFromLastConflict subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;Constructor&amp;lt;/var&amp;gt; generates an instance of an &amp;lt;var&amp;gt;[[RecordLockingConflict_class|RecordLockingConflict]]&amp;lt;/var&amp;gt; exception. Unlike the New method, this method obtains the values of the object properties from the last record locking conflict that occurred, whether or not it was trapped (caught or handled by an On unit). In fact, the greatest utility of this method would be to create a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; instance that contains all record locking information in an &amp;lt;var&amp;gt;On Record Locking Conflict&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;On Find Conflict&amp;lt;/var&amp;gt; unit. This is especially useful for accessing the properties set by the &amp;lt;var&amp;gt;[[RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit in an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit. These properties are &amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;LockTimeMilliseconds&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;ConflictTimeMilliseconds&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;ConflictingLockStrength&amp;lt;/var&amp;gt;, and &amp;lt;var&amp;gt;ConflictingRecordLockType&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:NewFromLastConflict syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%reclockInfo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;[%(RecordLockingConflict):]&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The class name in parentheses denotes a &amp;lt;var&amp;gt;[[Notation conventions for methods#Constructors|Constructor]]&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If there have been no record locking conflicts in the current request, this method returns a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt;Since &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; clears the record locking conflict information at the start of each request, this method cannot be used to retrieve information from a previous request.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==RecordNumber property==&lt;br /&gt;
{{Template:RecordLockingConflict:RecordNumber subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; property returns the numeric value of the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; internal record number of the record that has the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:RecordNumber syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A numeric variable to receive the record number.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
The following example shows all the properties of the &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; class. While the standard record locking conflict information is available for retrieval via the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;User Language&amp;lt;/var&amp;gt; functions $rlcfile, $rlcrec, $rlcuid, and $rlcusr, that information is also set in the exception object and retrievable via that object:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%rlc  is object RecordLockingConflict&lt;br /&gt;
 ...&lt;br /&gt;
%rec = new(%recnum, none, loopLockStrength=share)&lt;br /&gt;
 ...&lt;br /&gt;
try for record %rec&lt;br /&gt;
    ...&lt;br /&gt;
    end for&lt;br /&gt;
catch recordLockingConflict to %rlc&lt;br /&gt;
   [[Audittext|auditText]] Conflict on record {%rlc:recordNumber}     -&lt;br /&gt;
      in file {%rlc:filename}&lt;br /&gt;
   auditText Conflicting user was userid {%rlc:userid}, -&lt;br /&gt;
      with user number:{%rlc:userNumber}&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UserID property==&lt;br /&gt;
{{Template:RecordLockingConflict:UserID subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; userid (login name) of the user that has the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:UserID syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%string&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A &amp;lt;var&amp;gt;[[Longstrings|longstring]]&amp;lt;/var&amp;gt; to receive the userid value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UserNumber property==&lt;br /&gt;
{{Template:RecordLockingConflict:UserNumber subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns the user number (unique per session) of the user that has the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:UserNumber syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A numeric variable to receive the user number.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:System exception classes]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=RecordLockingConflict_class&amp;diff=69105</id>
		<title>RecordLockingConflict class</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=RecordLockingConflict_class&amp;diff=69105"/>
		<updated>2014-04-25T04:19:25Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* Usage notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- RecordLockingConflict class --&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception class catches record locking conflict errors thrown by file object operations, that is, from methods in the &amp;lt;var&amp;gt;[[File_classes|file]]&amp;lt;/var&amp;gt; classes (&amp;lt;var&amp;gt;[[Record_class|Record]]&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;[[Recordset_class|Recordset]]&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;[[SortedRecordset_class|SortedRecordset]]&amp;lt;/var&amp;gt;, and &amp;lt;var&amp;gt;[[RecordsetCursor_class|RecordsetCursor]]&amp;lt;/var&amp;gt;).&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Summary=&lt;br /&gt;
A &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown only if there is a Catcher for the exception. This allows &amp;lt;code&amp;gt;On Record Locking Conflict&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;On Find Conflict&amp;lt;/code&amp;gt; units to trap record locking conflicts if there is no &amp;lt;var&amp;gt;[[Exceptions#Try and Catch|Catch]]&amp;lt;/var&amp;gt; block for the exception.&lt;br /&gt;
 &lt;br /&gt;
There is no distinction between a &amp;lt;var&amp;gt;Find&amp;lt;/var&amp;gt; conflict and a &amp;lt;var&amp;gt;Record Locking&amp;lt;/var&amp;gt; conflict. For example, you can use the following:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;[[Exceptions#Try and Catch|try]]&lt;br /&gt;
   fd to %foo&lt;br /&gt;
      ...&lt;br /&gt;
   end find&lt;br /&gt;
[[Exceptions#Try and Catch|catch]] recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
And you can also use:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;try&lt;br /&gt;
   %rec = [[New_(Record_constructor)|new]](%recnum, exclusive)&lt;br /&gt;
   for record %rec&lt;br /&gt;
       ...&lt;br /&gt;
   end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You can even catch record locking conflicts caused by &amp;lt;var&amp;gt;[[LoopLockStrength_(Record_property)|LoopLockStrength]]&amp;lt;/var&amp;gt; promotions during a loop:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%rec = new(%recnum, none, loopLockStrength=share)&lt;br /&gt;
 ...&lt;br /&gt;
try for record %rec&lt;br /&gt;
    ...&lt;br /&gt;
    end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Or as in the following:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%curser = new(%recset, loopLockStrength=none)&lt;br /&gt;
 ...&lt;br /&gt;
try&lt;br /&gt;
   for record at cursor %curser&lt;br /&gt;
      ...&lt;br /&gt;
   end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ..&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Or as in this example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;fdwol to %recset = new(loopLockStrength=exclusive)&lt;br /&gt;
   ...&lt;br /&gt;
end find&lt;br /&gt;
 ...&lt;br /&gt;
try for each record in %recset&lt;br /&gt;
      ...&lt;br /&gt;
    end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In the latter example, note that any iteration of the &amp;lt;var&amp;gt;For&amp;lt;/var&amp;gt; loop can [[Exceptions#Throwing exceptions|throw]] an exception, and there is no way of picking up where you left off (at the next record, say) if you get a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception in such a case.  So, unless you always want to lose the whole loop on a record locking conflict, such a case is almost always better structured with a cursor on the recordset and with &amp;lt;var&amp;gt;Try&amp;lt;/var&amp;gt; around the &amp;lt;var&amp;gt;For Record At Cursor&amp;lt;/var&amp;gt; loop:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;fdwol to %recset = new(loopLockStrength=exclusive)&lt;br /&gt;
   ...&lt;br /&gt;
end find&lt;br /&gt;
 ...&lt;br /&gt;
%curser = new(%recset, loopLockStrength=exclusive)&lt;br /&gt;
repeat while %curser:state eq hasRecord&lt;br /&gt;
   try for record at cursor %curser&lt;br /&gt;
      ...&lt;br /&gt;
   end for&lt;br /&gt;
   catch recordLockingConflict&lt;br /&gt;
      ...&lt;br /&gt;
   end try&lt;br /&gt;
   %curser:next&lt;br /&gt;
end repeat&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; The &amp;lt;var&amp;gt;For&amp;lt;/var&amp;gt; statement can be on the same line as the &amp;lt;var&amp;gt;Try&amp;lt;/var&amp;gt;, or it can be inside the &amp;lt;var&amp;gt;Try&amp;lt;/var&amp;gt; block.&lt;br /&gt;
&lt;br /&gt;
=The RecordLockingConflict methods=&lt;br /&gt;
{{Template:List of RecordLockingConflict methods}}&lt;br /&gt;
&lt;br /&gt;
The methods in the class are described in the subsections that follow. In addition:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Notation conventions for methods|&amp;quot;Notation conventions for methods&amp;quot;]] has information&lt;br /&gt;
about the conventions followed. &lt;br /&gt;
&amp;lt;li&amp;gt;[[RecordLockingConflict methods syntax|&amp;quot;RecordLockingConflict methods syntax&amp;quot;]] is a single page that contains the syntax diagrams of all the methods in the class.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ConflictingLockStrength property==&lt;br /&gt;
&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingLockStrength subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; method returns a &amp;lt;var&amp;gt;[[LockStrength_enumeration|LockStrength]]&amp;lt;/var&amp;gt; enumeration value indicating the strength of the lock held by another user that caused the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingLockStrength syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%lockStrength&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value, a &amp;lt;var&amp;gt;LockStrength&amp;lt;/var&amp;gt; enumeration value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set, this property returns a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Since an unlocked record (&amp;lt;var&amp;gt;LockStrength&amp;lt;/var&amp;gt; &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;) cannot cause a record locking conflict, a non-&amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt; return value should always be either &amp;lt;var&amp;gt;Share&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;Exclusive&amp;lt;/var&amp;gt;.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ConflictingRecordLockType property==&lt;br /&gt;
&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingRecordLockType subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; method returns a &amp;lt;var&amp;gt;[[RecordLockType_enumeration|RecordLockType]]&amp;lt;/var&amp;gt; enumeration value indicating the type of the lock held by another user that caused the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingRecordLockType syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%recordLockType&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value, a &amp;lt;var&amp;gt;RecordLockType&amp;lt;/var&amp;gt; enumeration value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit isn&#039;t set, this property will return a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ConflictTimeMilliseconds property==&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictTimeMilliseconds subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns a number that is the number of milliseconds since 1900 that the record locking conflict occurred.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictTimeMilliseconds syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set, this property returns a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var&amp;gt;[[MillisecondsToString (Float function)|MillisecondsToString]]&amp;lt;/var&amp;gt; method can be used to convert this value to a more human-friendly format.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Copy and DeepCopy functions==&lt;br /&gt;
{{Template:RecordLockingConflict:Copy subtitle}}&lt;br /&gt;
&lt;br /&gt;
{{Template:RecordLockingConflict:DeepCopy subtitle}}&lt;br /&gt;
&lt;br /&gt;
These functions return a copy of the method object, that is the &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object to which they are applied.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:Copy syntax}}&lt;br /&gt;
{{Template:RecordLockingConflict:DeepCopy syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%outRecordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A RecordLockingConflict object variable to receive the output value.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Since &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; objects contain no references to other objects, there is no difference between a &amp;lt;var&amp;gt;Copy&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;DeepCopy&amp;lt;/var&amp;gt; method for these objects.&lt;br /&gt;
&amp;lt;li&amp;gt;The presence of a &amp;lt;var&amp;gt;DeepCopy&amp;lt;/var&amp;gt; method for the &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; class means that classes that contain references to &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; objects can also be &amp;lt;var&amp;gt;DeepCopy&amp;lt;/var&amp;gt;-able.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filename property==&lt;br /&gt;
{{Template:RecordLockingConflict:Filename subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns a &amp;lt;var&amp;gt;Longstring&amp;lt;/var&amp;gt; that contains the name of the file in which the last record locking conflict occurred.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:Filename syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%string&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A &amp;lt;var&amp;gt;longstring&amp;lt;/var&amp;gt; to receive the file name.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==LockTimeMilliseconds property==&lt;br /&gt;
{{Template:RecordLockingConflict:LockTimeMilliseconds subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns a number that is the number of milliseconds since 1900 that the record that caused the record locking conflict was locked.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:LockTimeMilliseconds syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set, this property returns a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var&amp;gt;[[MillisecondsToString (Float function)|MillisecondsToString]]&amp;lt;/var&amp;gt; method can be used to convert this value to a more human-friendly format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;LockingTimeMilliseconds, along with the &amp;lt;var&amp;gt;[[#LockingUserNumber property|LockingUserNumber]]&amp;lt;/var&amp;gt; property should make it relatively easy to locate the request that locked the record that caused the record lock in the audit trail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Strictly speaking, the returned lock time is the time the finding and locking process began for the locked record, not when it was actually locked. Since the primary purpose this value is to locate audit trail information for the request that locked the conficting record, and since the entire locking process always happens within a single request, this distinction should be relatively unimportant. &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LockingUserNumber property==&lt;br /&gt;
{{Template:RecordLockingConflict:LockingUserNumber subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; property returns the user number of the user that originally locked the conflicting record. This might be different from the value returned by the &amp;lt;var&amp;gt;[[#UserNumber property|UserNumber]]&amp;lt;/var&amp;gt; property if a file object is passed between threads as a session object. In fact, a record lock caused by a file object in a closed session would return the session PST&#039;s user number for &amp;lt;var&amp;gt;UserNumber&amp;lt;/var&amp;gt; but would return the user number that originally locked the record that caused the conflict. &lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:LockingUserNumber syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt;, along with the &amp;lt;var&amp;gt;LockTimeMilliseconds&amp;lt;/var&amp;gt; property should make it relatively easy to locate the request that locked the record that caused the record lock in the audit trail.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==New constructor==&lt;br /&gt;
{{Template:RecordLockingConflict:New subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;Constructor&amp;lt;/var&amp;gt; generates an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception. As shown in the syntax that follows, the &amp;lt;var&amp;gt;New&amp;lt;/var&amp;gt; method arguments set the values of the class properties having the corresponding names.  Each argument to &amp;lt;var&amp;gt;New&amp;lt;/var&amp;gt; sets the value of the corresponding property of the newly constructed &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:New syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;[%(RecordLockingConflict):]&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The class name in parentheses denotes a &amp;lt;var&amp;gt;[[Notation conventions for methods#Constructors|Constructor]]&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;Filename&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This [[Methods#Named parameters|name required]] parameter specifies the &amp;lt;var&amp;gt;[[Longstrings|Longstring]]&amp;lt;/var&amp;gt; value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;string&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[Filename_(RecordLockingConflict_property)|Filename]]&amp;lt;/var&amp;gt; property. Its default value is a null string.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;RecordNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[RecordNumber_(RecordLockingConflict_property)|RecordNumber]]&amp;lt;/var&amp;gt; property. Its default value is 0.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;UserNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the exception object&#039;s &amp;lt;var&amp;gt;[[UserID_(RecordLockingConflict_property)|UserNumber]]&amp;lt;/var&amp;gt; property. Its default value is 0.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;UserID&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name required parameter specifies the longstring value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;string&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[UserNumber_(RecordLockingConflict_property)|UserID]]&amp;lt;/var&amp;gt; property. Its default value is a null string.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[LockingUserNumber_(RecordLockingConflict_property)|LockingUserNumber]]&amp;lt;/var&amp;gt; property. Its default value is &amp;lt;var&amp;gt;-1&amp;lt;/var&amp;gt;, which is not a valid user number, and is the value set for the &amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;[[RECLOCKO parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;LockTimeMilliseconds&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[LockTimeMilliseconds_(RecordLockingConflict_property)|LockTimeMilliseconds]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt;, which is the value set for the LockTimeMilliseconds property by the system when the &amp;lt;var&amp;gt;RECLOCKO&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;ConflictTimeMilliseconds&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[ConflictTimeMilliseconds_(RecordLockingConflict_property)|ConflictTimeMilliseconds]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt;, which is the value set for the &amp;lt;var&amp;gt;ConflictTimeMilliseconds&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;RECLOCKO&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;ConflictingLockStrength&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the &amp;lt;var&amp;gt;[[LockStrength]]&amp;lt;/var&amp;gt; enumeration value to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[ConflictingLockStrength_(RecordLockingConflict_property)|ConflictingLockStrength]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;, which is the value set for the &amp;lt;var&amp;gt;ConflictingLockStrength&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;RECLOCKO&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. Since a record locking conflict cannot be caused by an unlocked record, setting this value to &amp;lt;var&amp;gt;None&amp;lt;/var&amp;gt; is equivalent to setting it to &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;ConflictingRecordLockType&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the &amp;lt;var&amp;gt;[[RecordLockType]]&amp;lt;/var&amp;gt; enumeration value to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[ConflictingRecordLockType_(RecordLockingConflict_property)|ConflictingRecordLockType]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;, which is the value set for the &amp;lt;var&amp;gt;ConflictingRecordLockType&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;RECLOCKO parameter&amp;lt;/var&amp;gt; X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==NewFromLastConflict constructor==&lt;br /&gt;
{{Template:RecordLockingConflict:NewFromLastConflict subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;Constructor&amp;lt;/var&amp;gt; generates an instance of an &amp;lt;var&amp;gt;[[RecordLockingConflict_class|RecordLockingConflict]]&amp;lt;/var&amp;gt; exception. Unlike the New method, this method obtains the values of the object properties from the last record locking conflict that occurred, whether or not it was trapped (caught or handled by an On unit). In fact, the greatest utility of this method would be to create a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; instance that contains all record locking information in an &amp;lt;var&amp;gt;On Record Locking Conflict&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;On Find Conflict&amp;lt;/var&amp;gt; unit. This is especially useful for accessing the properties set by the &amp;lt;var&amp;gt;[[RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit in an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit. These properties are &amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;LockTimeMilliseconds&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;ConflictTimeMilliseconds&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;ConflictingLockStrength&amp;lt;/var&amp;gt;, and &amp;lt;var&amp;gt;ConflictingRecordLockType&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:NewFromLastConflict syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%reclockInfo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;[%(RecordLockingConflict):]&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The class name in parentheses denotes a &amp;lt;var&amp;gt;[[Notation conventions for methods#Constructors|Constructor]]&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If there have been no record locking conflicts in the current request, this method returns a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt;Since &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; clears the record locking conflict information at the start of each request, this method cannot be used to retrieve information from a previous request.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==RecordNumber property==&lt;br /&gt;
{{Template:RecordLockingConflict:RecordNumber subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; property returns the numeric value of the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; internal record number of the record that has the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:RecordNumber syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A numeric variable to receive the record number.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
The following example shows all the properties of the &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; class. While the standard record locking conflict information is available for retrieval via the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;User Language&amp;lt;/var&amp;gt; functions $rlcfile, $rlcrec, $rlcuid, and $rlcusr, that information is also set in the exception object and retrievable via that object:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%rlc  is object RecordLockingConflict&lt;br /&gt;
 ...&lt;br /&gt;
%rec = new(%recnum, none, loopLockStrength=share)&lt;br /&gt;
 ...&lt;br /&gt;
try for record %rec&lt;br /&gt;
    ...&lt;br /&gt;
    end for&lt;br /&gt;
catch recordLockingConflict to %rlc&lt;br /&gt;
   [[Audittext|auditText]] Conflict on record {%rlc:recordNumber}     -&lt;br /&gt;
      in file {%rlc:filename}&lt;br /&gt;
   auditText Conflicting user was userid {%rlc:userid}, -&lt;br /&gt;
      with user number:{%rlc:userNumber}&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UserID property==&lt;br /&gt;
{{Template:RecordLockingConflict:UserID subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; userid (login name) of the user that has the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:UserID syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%string&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A &amp;lt;var&amp;gt;[[Longstrings|longstring]]&amp;lt;/var&amp;gt; to receive the userid value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UserNumber property==&lt;br /&gt;
{{Template:RecordLockingConflict:UserNumber subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns the user number (unique per session) of the user that has the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:UserNumber syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A numeric variable to receive the user number.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:System exception classes]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=RecordLockingConflict_class&amp;diff=69104</id>
		<title>RecordLockingConflict class</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=RecordLockingConflict_class&amp;diff=69104"/>
		<updated>2014-04-25T04:17:42Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* Usage notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- RecordLockingConflict class --&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception class catches record locking conflict errors thrown by file object operations, that is, from methods in the &amp;lt;var&amp;gt;[[File_classes|file]]&amp;lt;/var&amp;gt; classes (&amp;lt;var&amp;gt;[[Record_class|Record]]&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;[[Recordset_class|Recordset]]&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;[[SortedRecordset_class|SortedRecordset]]&amp;lt;/var&amp;gt;, and &amp;lt;var&amp;gt;[[RecordsetCursor_class|RecordsetCursor]]&amp;lt;/var&amp;gt;).&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Summary=&lt;br /&gt;
A &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown only if there is a Catcher for the exception. This allows &amp;lt;code&amp;gt;On Record Locking Conflict&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;On Find Conflict&amp;lt;/code&amp;gt; units to trap record locking conflicts if there is no &amp;lt;var&amp;gt;[[Exceptions#Try and Catch|Catch]]&amp;lt;/var&amp;gt; block for the exception.&lt;br /&gt;
 &lt;br /&gt;
There is no distinction between a &amp;lt;var&amp;gt;Find&amp;lt;/var&amp;gt; conflict and a &amp;lt;var&amp;gt;Record Locking&amp;lt;/var&amp;gt; conflict. For example, you can use the following:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;[[Exceptions#Try and Catch|try]]&lt;br /&gt;
   fd to %foo&lt;br /&gt;
      ...&lt;br /&gt;
   end find&lt;br /&gt;
[[Exceptions#Try and Catch|catch]] recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
And you can also use:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;try&lt;br /&gt;
   %rec = [[New_(Record_constructor)|new]](%recnum, exclusive)&lt;br /&gt;
   for record %rec&lt;br /&gt;
       ...&lt;br /&gt;
   end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You can even catch record locking conflicts caused by &amp;lt;var&amp;gt;[[LoopLockStrength_(Record_property)|LoopLockStrength]]&amp;lt;/var&amp;gt; promotions during a loop:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%rec = new(%recnum, none, loopLockStrength=share)&lt;br /&gt;
 ...&lt;br /&gt;
try for record %rec&lt;br /&gt;
    ...&lt;br /&gt;
    end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Or as in the following:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%curser = new(%recset, loopLockStrength=none)&lt;br /&gt;
 ...&lt;br /&gt;
try&lt;br /&gt;
   for record at cursor %curser&lt;br /&gt;
      ...&lt;br /&gt;
   end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ..&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Or as in this example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;fdwol to %recset = new(loopLockStrength=exclusive)&lt;br /&gt;
   ...&lt;br /&gt;
end find&lt;br /&gt;
 ...&lt;br /&gt;
try for each record in %recset&lt;br /&gt;
      ...&lt;br /&gt;
    end for&lt;br /&gt;
catch recordLockingConflict&lt;br /&gt;
   ...&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In the latter example, note that any iteration of the &amp;lt;var&amp;gt;For&amp;lt;/var&amp;gt; loop can [[Exceptions#Throwing exceptions|throw]] an exception, and there is no way of picking up where you left off (at the next record, say) if you get a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception in such a case.  So, unless you always want to lose the whole loop on a record locking conflict, such a case is almost always better structured with a cursor on the recordset and with &amp;lt;var&amp;gt;Try&amp;lt;/var&amp;gt; around the &amp;lt;var&amp;gt;For Record At Cursor&amp;lt;/var&amp;gt; loop:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;fdwol to %recset = new(loopLockStrength=exclusive)&lt;br /&gt;
   ...&lt;br /&gt;
end find&lt;br /&gt;
 ...&lt;br /&gt;
%curser = new(%recset, loopLockStrength=exclusive)&lt;br /&gt;
repeat while %curser:state eq hasRecord&lt;br /&gt;
   try for record at cursor %curser&lt;br /&gt;
      ...&lt;br /&gt;
   end for&lt;br /&gt;
   catch recordLockingConflict&lt;br /&gt;
      ...&lt;br /&gt;
   end try&lt;br /&gt;
   %curser:next&lt;br /&gt;
end repeat&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; The &amp;lt;var&amp;gt;For&amp;lt;/var&amp;gt; statement can be on the same line as the &amp;lt;var&amp;gt;Try&amp;lt;/var&amp;gt;, or it can be inside the &amp;lt;var&amp;gt;Try&amp;lt;/var&amp;gt; block.&lt;br /&gt;
&lt;br /&gt;
=The RecordLockingConflict methods=&lt;br /&gt;
{{Template:List of RecordLockingConflict methods}}&lt;br /&gt;
&lt;br /&gt;
The methods in the class are described in the subsections that follow. In addition:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Notation conventions for methods|&amp;quot;Notation conventions for methods&amp;quot;]] has information&lt;br /&gt;
about the conventions followed. &lt;br /&gt;
&amp;lt;li&amp;gt;[[RecordLockingConflict methods syntax|&amp;quot;RecordLockingConflict methods syntax&amp;quot;]] is a single page that contains the syntax diagrams of all the methods in the class.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ConflictingLockStrength property==&lt;br /&gt;
&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingLockStrength subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; method returns a &amp;lt;var&amp;gt;[[LockStrength_enumeration|LockStrength]]&amp;lt;/var&amp;gt; enumeration value indicating the strength of the lock held by another user that caused the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingLockStrength syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%lockStrength&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value, a &amp;lt;var&amp;gt;LockStrength&amp;lt;/var&amp;gt; enumeration value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set, this property returns a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Since an unlocked record (&amp;lt;var&amp;gt;LockStrength&amp;lt;/var&amp;gt; &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;) cannot cause a record locking conflict, a non-&amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt; return value should always be either &amp;lt;var&amp;gt;Share&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;Exclusive&amp;lt;/var&amp;gt;.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ConflictingRecordLockType property==&lt;br /&gt;
&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingRecordLockType subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; method returns a &amp;lt;var&amp;gt;[[RecordLockType_enumeration|RecordLockType]]&amp;lt;/var&amp;gt; enumeration value indicating the type of the lock held by another user that caused the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictingRecordLockType syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%recordLockType&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value, a &amp;lt;var&amp;gt;RecordLockType&amp;lt;/var&amp;gt; enumeration value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit isn&#039;t set, this property will return a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ConflictTimeMilliseconds property==&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictTimeMilliseconds subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns a number that is the number of milliseconds since 1900 that the record locking conflict occurred.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:ConflictTimeMilliseconds syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the &amp;lt;var&amp;gt;[[RECLOCKO_parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set, this property returns a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt; value.&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var&amp;gt;[[MillisecondsToString (Float function)|MillisecondsToString]]&amp;lt;/var&amp;gt; method can be used to convert this value to a more human-friendly format.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Copy and DeepCopy functions==&lt;br /&gt;
{{Template:RecordLockingConflict:Copy subtitle}}&lt;br /&gt;
&lt;br /&gt;
{{Template:RecordLockingConflict:DeepCopy subtitle}}&lt;br /&gt;
&lt;br /&gt;
These functions return a copy of the method object, that is the &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object to which they are applied.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:Copy syntax}}&lt;br /&gt;
{{Template:RecordLockingConflict:DeepCopy syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%outRecordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A RecordLockingConflict object variable to receive the output value.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Since &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; objects contain no references to other objects, there is no difference between a &amp;lt;var&amp;gt;Copy&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;DeepCopy&amp;lt;/var&amp;gt; method for these objects.&lt;br /&gt;
&amp;lt;li&amp;gt;The presence of a &amp;lt;var&amp;gt;DeepCopy&amp;lt;/var&amp;gt; method for the &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; class means that classes that contain references to &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; objects can also be &amp;lt;var&amp;gt;DeepCopy&amp;lt;/var&amp;gt;-able.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filename property==&lt;br /&gt;
{{Template:RecordLockingConflict:Filename subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns a &amp;lt;var&amp;gt;Longstring&amp;lt;/var&amp;gt; that contains the name of the file in which the last record locking conflict occurred.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:Filename syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%string&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A &amp;lt;var&amp;gt;longstring&amp;lt;/var&amp;gt; to receive the file name.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==LockTimeMilliseconds property==&lt;br /&gt;
{{Template:RecordLockingConflict:LockTimeMilliseconds subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns a number that is the number of milliseconds since 1900 that the record that caused the record locking conflict was locked.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:LockTimeMilliseconds syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var&amp;gt;[[MillisecondsToString (Float function)|MillisecondsToString]]&amp;lt;/var&amp;gt; method can be used to convert this value to a more human-friendly format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;LockingTimeMilliseconds, along with the &amp;lt;var&amp;gt;[[#LockingUserNumber property|LockingUserNumber]]&amp;lt;/var&amp;gt; property should make it relatively easy to locate the request that locked the record that caused the record lock in the audit trail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Strictly speaking, the returned lock time is the time the finding and locking process began for the locked record, not when it was actually locked. Since the primary purpose this value is to locate audit trail information for the request that locked the conficting record, and since the entire locking process always happens within a single request, this distinction should be relatively unimportant. &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==LockingUserNumber property==&lt;br /&gt;
{{Template:RecordLockingConflict:LockingUserNumber subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; property returns the user number of the user that originally locked the conflicting record. This might be different from the value returned by the &amp;lt;var&amp;gt;[[#UserNumber property|UserNumber]]&amp;lt;/var&amp;gt; property if a file object is passed between threads as a session object. In fact, a record lock caused by a file object in a closed session would return the session PST&#039;s user number for &amp;lt;var&amp;gt;UserNumber&amp;lt;/var&amp;gt; but would return the user number that originally locked the record that caused the conflict. &lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:LockingUserNumber syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A variable to receive the output value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt;, along with the &amp;lt;var&amp;gt;LockTimeMilliseconds&amp;lt;/var&amp;gt; property should make it relatively easy to locate the request that locked the record that caused the record lock in the audit trail.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==New constructor==&lt;br /&gt;
{{Template:RecordLockingConflict:New subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;Constructor&amp;lt;/var&amp;gt; generates an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception. As shown in the syntax that follows, the &amp;lt;var&amp;gt;New&amp;lt;/var&amp;gt; method arguments set the values of the class properties having the corresponding names.  Each argument to &amp;lt;var&amp;gt;New&amp;lt;/var&amp;gt; sets the value of the corresponding property of the newly constructed &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:New syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;[%(RecordLockingConflict):]&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The class name in parentheses denotes a &amp;lt;var&amp;gt;[[Notation conventions for methods#Constructors|Constructor]]&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;Filename&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This [[Methods#Named parameters|name required]] parameter specifies the &amp;lt;var&amp;gt;[[Longstrings|Longstring]]&amp;lt;/var&amp;gt; value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;string&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[Filename_(RecordLockingConflict_property)|Filename]]&amp;lt;/var&amp;gt; property. Its default value is a null string.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;RecordNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[RecordNumber_(RecordLockingConflict_property)|RecordNumber]]&amp;lt;/var&amp;gt; property. Its default value is 0.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;UserNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the exception object&#039;s &amp;lt;var&amp;gt;[[UserID_(RecordLockingConflict_property)|UserNumber]]&amp;lt;/var&amp;gt; property. Its default value is 0.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;UserID&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This name required parameter specifies the longstring value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;string&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[UserNumber_(RecordLockingConflict_property)|UserID]]&amp;lt;/var&amp;gt; property. Its default value is a null string.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[LockingUserNumber_(RecordLockingConflict_property)|LockingUserNumber]]&amp;lt;/var&amp;gt; property. Its default value is &amp;lt;var&amp;gt;-1&amp;lt;/var&amp;gt;, which is not a valid user number, and is the value set for the &amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;[[RECLOCKO parameter|RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;LockTimeMilliseconds&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[LockTimeMilliseconds_(RecordLockingConflict_property)|LockTimeMilliseconds]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt;, which is the value set for the LockTimeMilliseconds property by the system when the &amp;lt;var&amp;gt;RECLOCKO&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;ConflictTimeMilliseconds&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the numeric value (&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;number&amp;lt;/var&amp;gt;) to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[ConflictTimeMilliseconds_(RecordLockingConflict_property)|ConflictTimeMilliseconds]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;0&amp;lt;/var&amp;gt;, which is the value set for the &amp;lt;var&amp;gt;ConflictTimeMilliseconds&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;RECLOCKO&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;ConflictingLockStrength&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the &amp;lt;var&amp;gt;[[LockStrength]]&amp;lt;/var&amp;gt; enumeration value to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[ConflictingLockStrength_(RecordLockingConflict_property)|ConflictingLockStrength]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;, which is the value set for the &amp;lt;var&amp;gt;ConflictingLockStrength&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;RECLOCKO&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown. Since a record locking conflict cannot be caused by an unlocked record, setting this value to &amp;lt;var&amp;gt;None&amp;lt;/var&amp;gt; is equivalent to setting it to &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;ConflictingRecordLockType&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This optional, name required parameter specifies the &amp;lt;var&amp;gt;[[RecordLockType]]&amp;lt;/var&amp;gt; enumeration value to be assigned to the object&#039;s &amp;lt;var&amp;gt;[[ConflictingRecordLockType_(RecordLockingConflict_property)|ConflictingRecordLockType]]&amp;lt;/var&amp;gt; property. Its default value is a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;, which is the value set for the &amp;lt;var&amp;gt;ConflictingRecordLockType&amp;lt;/var&amp;gt; property by the system when the &amp;lt;var&amp;gt;RECLOCKO parameter&amp;lt;/var&amp;gt; X&#039;04&#039; bit is not set and a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; exception is thrown.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==NewFromLastConflict constructor==&lt;br /&gt;
{{Template:RecordLockingConflict:NewFromLastConflict subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;Constructor&amp;lt;/var&amp;gt; generates an instance of an &amp;lt;var&amp;gt;[[RecordLockingConflict_class|RecordLockingConflict]]&amp;lt;/var&amp;gt; exception. Unlike the New method, this method obtains the values of the object properties from the last record locking conflict that occurred, whether or not it was trapped (caught or handled by an On unit). In fact, the greatest utility of this method would be to create a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; instance that contains all record locking information in an &amp;lt;var&amp;gt;On Record Locking Conflict&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;On Find Conflict&amp;lt;/var&amp;gt; unit. This is especially useful for accessing the properties set by the &amp;lt;var&amp;gt;[[RECLOCKO]]&amp;lt;/var&amp;gt; parameter X&#039;04&#039; bit in an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit. These properties are &amp;lt;var&amp;gt;LockingUserNumber&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;LockTimeMilliseconds&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;ConflictTimeMilliseconds&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;ConflictingLockStrength&amp;lt;/var&amp;gt;, and &amp;lt;var&amp;gt;ConflictingRecordLockType&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:NewFromLastConflict syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%reclockInfo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;[%(RecordLockingConflict):]&amp;lt;/var&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The class name in parentheses denotes a &amp;lt;var&amp;gt;[[Notation conventions for methods#Constructors|Constructor]]&amp;lt;/var&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usage notes====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If there have been no record locking conflicts in the current request, this method returns a &amp;lt;var&amp;gt;Null&amp;lt;/var&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt;Since &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; clears the record locking conflict information at the start of each request, this method cannot be used to retrieve information from a previous request.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==RecordNumber property==&lt;br /&gt;
{{Template:RecordLockingConflict:RecordNumber subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;[[Classes and Objects#readWrite|ReadOnly]]&amp;lt;/var&amp;gt; property returns the numeric value of the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; internal record number of the record that has the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:RecordNumber syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A numeric variable to receive the record number.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
The following example shows all the properties of the &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; class. While the standard record locking conflict information is available for retrieval via the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;User Language&amp;lt;/var&amp;gt; functions $rlcfile, $rlcrec, $rlcuid, and $rlcusr, that information is also set in the exception object and retrievable via that object:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%rlc  is object RecordLockingConflict&lt;br /&gt;
 ...&lt;br /&gt;
%rec = new(%recnum, none, loopLockStrength=share)&lt;br /&gt;
 ...&lt;br /&gt;
try for record %rec&lt;br /&gt;
    ...&lt;br /&gt;
    end for&lt;br /&gt;
catch recordLockingConflict to %rlc&lt;br /&gt;
   [[Audittext|auditText]] Conflict on record {%rlc:recordNumber}     -&lt;br /&gt;
      in file {%rlc:filename}&lt;br /&gt;
   auditText Conflicting user was userid {%rlc:userid}, -&lt;br /&gt;
      with user number:{%rlc:userNumber}&lt;br /&gt;
end try&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UserID property==&lt;br /&gt;
{{Template:RecordLockingConflict:UserID subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns the &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; userid (login name) of the user that has the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:UserID syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%string&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A &amp;lt;var&amp;gt;[[Longstrings|longstring]]&amp;lt;/var&amp;gt; to receive the userid value.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UserNumber property==&lt;br /&gt;
{{Template:RecordLockingConflict:UserNumber subtitle}}&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;var&amp;gt;ReadOnly&amp;lt;/var&amp;gt; property returns the user number (unique per session) of the user that has the conflict.&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
{{Template:RecordLockingConflict:UserNumber syntax}}&lt;br /&gt;
&lt;br /&gt;
====Syntax terms====&lt;br /&gt;
&amp;lt;table class=&amp;quot;syntaxTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;%number&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A numeric variable to receive the user number.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;recordLockingConflict&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A reference to an instance of a &amp;lt;var&amp;gt;RecordLockingConflict&amp;lt;/var&amp;gt; object.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:System exception classes]]&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=System_and_Subsystem_classes&amp;diff=13966</id>
		<title>System and Subsystem classes</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=System_and_Subsystem_classes&amp;diff=13966"/>
		<updated>2012-10-30T00:45:47Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* System-wide objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- System and Subsystem classes --&amp;gt;&lt;br /&gt;
&amp;lt;!-- on System class page, #REDIRECT [[System and Subsystem classes]]&lt;br /&gt;
     on Subystem class page, #REDIRECT [[System and Subsystem classes]] --&amp;gt; &lt;br /&gt;
The System and Subsystem classes are collections of shared methods that&lt;br /&gt;
operate on entities (globals, strings, objects) made&lt;br /&gt;
available to all users in an Online system or all users in a subsystem,&lt;br /&gt;
or that operate on environmental entities such as the current INCLUDE&lt;br /&gt;
arguments, or the current call stack that are essentially part of the&lt;br /&gt;
&amp;amp;ldquo;system.&amp;amp;rdquo;&lt;br /&gt;
 &lt;br /&gt;
There are no System or Subsystem objects, per se.&lt;br /&gt;
That is, you cannot instantiate an instance of a System or Subsystem object,&lt;br /&gt;
nor assign references from one variable to another, nor are there any&lt;br /&gt;
instance-specific methods in these classes.&lt;br /&gt;
You can, however, declare objects of these classes.&lt;br /&gt;
The main use of such objects is to provide a short-hand way of referencing&lt;br /&gt;
the classes:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %sys       is object system&lt;br /&gt;
    %subsys    is object subsystem&lt;br /&gt;
     ...&lt;br /&gt;
    %sys:setGlobal(&#039;GOOSE&#039;, &#039;SAUCE&#039;)&lt;br /&gt;
    %subsys:setGlobal(&#039;GANDER&#039;, &#039;SAUCE&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Even though you cannot instantiate or invoke instance-specific&lt;br /&gt;
methods against System or Subsystem objects, you may find it&lt;br /&gt;
helpful to think of there being an implicit System object&lt;br /&gt;
that contains system-wide and thread-specific context for the system,&lt;br /&gt;
and a SubSystem object for every valid subsystem context.&lt;br /&gt;
Still, all System and Subsystem class methods are shared methods,&lt;br /&gt;
so they are invokable via their class names:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %(system):setString(&#039;STATUS&#039;, %status)&lt;br /&gt;
    print %(subsystem):string(&#039;INFO&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Subsystem context==&lt;br /&gt;
Subsystem class methods operate on entities associated with the current&lt;br /&gt;
subsystem context.&lt;br /&gt;
This context is, by default, the current subsystem in which a request&lt;br /&gt;
is running.&lt;br /&gt;
It is, possible, however, to run with a subsystem context different from&lt;br /&gt;
the current subsystem.&lt;br /&gt;
This subsystem context can be a subsystem other than the one being run,&lt;br /&gt;
or it can even be a context that isn&#039;t associated with a real subsystem &amp;amp;mdash;&lt;br /&gt;
the context is simply a name, and it is not required to be a started or&lt;br /&gt;
even defined subsystem.&lt;br /&gt;
It is also possible to set a subsystem context for requests that are not even&lt;br /&gt;
inside a subsystem.&lt;br /&gt;
 &lt;br /&gt;
When a subsystem is entered, the subsystem context is automatically set to&lt;br /&gt;
the name of the one being entered.&lt;br /&gt;
When the subsystem is exited, the context is set back to the subsystem&lt;br /&gt;
context in effect at entry to the subsystem, whether or not the subsystem was&lt;br /&gt;
changed inside the subsystem.&lt;br /&gt;
 &lt;br /&gt;
Once the subsystem context is set, all Subsystem class methods apply to&lt;br /&gt;
that subsystem context.&lt;br /&gt;
For example, if subsystem ORDER is entered, the following statement&lt;br /&gt;
sets a subsystem string for that subsystem:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %(subsystem):setString(&#039;DEBUG&#039;, &#039;ON&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, if the following statement is run before it,&lt;br /&gt;
the SetString method actually applies to the DISORDER subsystem context:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %(subsystem):context = &#039;DISORDER&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Since setting the subsystem context allows a request to modify entities&lt;br /&gt;
associated with another subsystem, the ability to set subsystem context&lt;br /&gt;
is protected.&lt;br /&gt;
Ordinarily, only a system manager can set the subsystem context, though&lt;br /&gt;
the ability to set subsystem context can be controlled with SIRMETH&lt;br /&gt;
rules.&lt;br /&gt;
==Using SIRMETH to specify security rules==&lt;br /&gt;
The ability to modify system or subsystem entities gives a user the&lt;br /&gt;
ability to cause problems in threads other than their own.&lt;br /&gt;
As such, this capability must be protected to prevent malicious or&lt;br /&gt;
unintentional modification of system-wide or subsystem-wide&lt;br /&gt;
entities.&lt;br /&gt;
 &lt;br /&gt;
The default protection for system-wide and subsystem-wide entities&lt;br /&gt;
is:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Only system managers can modify system-wide entities (system globals&lt;br /&gt;
and strings, for example).&lt;br /&gt;
&amp;lt;li&amp;gt;Only pre-compiled procedures in a subsystem can modify subsystem-wide&lt;br /&gt;
entities.&lt;br /&gt;
&amp;lt;li&amp;gt;Only system managers can set their subsystem context.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
While these rules prevent intentional or unintentional tampering&lt;br /&gt;
with system or subsystem entities, they can also be onerous:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;There might be several trusted subsystems that one would want to&lt;br /&gt;
allow to set System globals.&lt;br /&gt;
&amp;lt;li&amp;gt;One might want to set SubSystem globals in non-precompiled procedures.&lt;br /&gt;
&amp;lt;li&amp;gt;One might want several subsystems to operate under the same subsystem&lt;br /&gt;
context, that is, share subsystem entities.&lt;br /&gt;
&amp;lt;li&amp;gt;For development and debugging, one might want very loose restrictions&lt;br /&gt;
on what programmers can and cannot do.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
While most of these problems can be worked around by giving programmers system&lt;br /&gt;
manager privileges or by having subsystems run with system manager privileges,&lt;br /&gt;
this might be further than one wants to go to provide these capabilities.&lt;br /&gt;
 &lt;br /&gt;
To ameliorate these problems, the SIRMETH command is provided.&lt;br /&gt;
The SIRMETH command provides a way of giving specific subsystems or all&lt;br /&gt;
users access to certain System or Subsystem class capabilities.&lt;br /&gt;
Of course, the SIRMETH command itself requires system manager privileges.&lt;br /&gt;
===SIRMETH command syntax===&lt;br /&gt;
   SIRMETH {ALLOW | DISALLOW}                   -&lt;br /&gt;
           {SYSTEMSET | SUBSYSTEMSET |          -&lt;br /&gt;
            SUBSYSTEMCONTEXT csubsys | ALL}     -&lt;br /&gt;
           [SUBSYSTEM subsys [NONPRE] ]&lt;br /&gt;
Where:&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
&amp;lt;dt&amp;gt;ALLOW&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates that requests matching the rule will be allowed to perform&lt;br /&gt;
the indicated action.&lt;br /&gt;
&amp;lt;dt&amp;gt;DISALLOW&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates that requests matching the rule will not be allowed to perform&lt;br /&gt;
the indicated action.&lt;br /&gt;
&amp;lt;dt&amp;gt;SYSTEMSET&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates the ability to set system strings or globals.&lt;br /&gt;
This applies to the SetGlobal and SetString methods in the System&lt;br /&gt;
class, as well as the $setg_sys function.&lt;br /&gt;
&amp;lt;dt&amp;gt;SUBSYSTEMSET&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates the ability to set subsytem strings or globals.&lt;br /&gt;
This applies to the SetGlobal and SetString methods in the SubSystem&lt;br /&gt;
class, as well as the $setg_subsys function (when the third argument,&lt;br /&gt;
the subsystem name, is not specified).&lt;br /&gt;
&amp;lt;dt&amp;gt;SUBSYSTEMCONTEXT&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates the ability to change subsytem context to the subsystem&lt;br /&gt;
indicated by &#039;&#039;csubsys&#039;&#039;.&lt;br /&gt;
&#039;&#039;csubsys&#039;&#039; can be a specific subsystem name such as SIRPRO,&lt;br /&gt;
or it can be a wild-card such as SIR* or ???PRO.&lt;br /&gt;
&amp;lt;dt&amp;gt;ALL&lt;br /&gt;
&amp;lt;dd&amp;gt;Only allowed on a DISALLOW rule, this indicates that no extra&lt;br /&gt;
capabilities are to be provided to requests matching the rule.&lt;br /&gt;
&amp;lt;dt&amp;gt;SUBSYSTEM&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates that the action is to be allowed to methods in the subsystem&lt;br /&gt;
indicated by &#039;&#039;subsys&#039;&#039;.&lt;br /&gt;
&#039;&#039;subsys&#039;&#039; can be a specific subsystem name such as INVENTORY, or it&lt;br /&gt;
can be a wild-card such as INV* or INVENTO?Y.&lt;br /&gt;
 &lt;br /&gt;
Note that if SUBSYSTEM is specified, the rule applies to the real subsystem&lt;br /&gt;
being run, regardless of the current subsystem context.&lt;br /&gt;
Note also that unless followed by the keyword NONPRE, the rule only applies&lt;br /&gt;
to pre-compiled procedures in the subsystem.&lt;br /&gt;
&amp;lt;dt&amp;gt;NONPRE&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates that non-pre-compiled&lt;br /&gt;
procedures in the subsystem are also to be given the capabilities indicated by&lt;br /&gt;
the SIRMETH rule.&lt;br /&gt;
NONPRE must immediately follow the subsystem name.&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You can specify as many SIRMETH rules as you want.&lt;br /&gt;
A SIRMETH rule that&lt;br /&gt;
totally encompasses a previous rule preempts that rule.&lt;br /&gt;
For example, in the following two rules,&lt;br /&gt;
the second SIRMETH rule completely encompasses the first, so the first&lt;br /&gt;
rule is discarded:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMSET SUBSYS FOOBAR&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMSET SUBSYS FOO*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A SIRMETH DISALLOW ALL preempts all previous rules,&lt;br /&gt;
so it is a way of starting from a clean slate.&lt;br /&gt;
If you place a SIRMETH DISALLOW ALL at the start of a&lt;br /&gt;
sequence of SIRMETH rules (most likely in a procedure), those rules&lt;br /&gt;
can be run again and again, perhaps after some of the rules have been&lt;br /&gt;
modified.&lt;br /&gt;
Of course, in the interval between the SIRMETH DISALLOW ALL and the&lt;br /&gt;
subsequent rules, some ordinarily legal requests might be disallowed,&lt;br /&gt;
so it is probably not a good idea to reapply SIRMETH rules in&lt;br /&gt;
a production region.&lt;br /&gt;
 &lt;br /&gt;
Generally, SIRMETH rules are placed in the CCAIN stream or in&lt;br /&gt;
a procedure INCLUDE&#039;d in the CCAIN stream.&lt;br /&gt;
 &lt;br /&gt;
The reason for the NONPRE keyword is that many debugging and development&lt;br /&gt;
subsystems allow users (programmers, typically) to run arbitrary code&lt;br /&gt;
from inside the subsystem.&lt;br /&gt;
Typically, this arbitrary code is run from a non-pre-compiled&lt;br /&gt;
procedure that includes the programmer&#039;s code.&lt;br /&gt;
To prevent such code from picking up the subsystem&#039;s capabilities,&lt;br /&gt;
System and Subsystem class security does not apply SIRMETH rules&lt;br /&gt;
to non-pre-compiled procedures, unless the NONPRE keyword is specified&lt;br /&gt;
on the rule.&lt;br /&gt;
Since most subsystems don&#039;t allow users to run arbitrary code inside&lt;br /&gt;
them, and since it is quite likely that you might want to set&lt;br /&gt;
subsystem globals or switch subsystem contexts inside a non-pre-compiled&lt;br /&gt;
procedure, it is probably a good idea to specify NONPRE for those&lt;br /&gt;
subsystems.&lt;br /&gt;
 &lt;br /&gt;
In a development environment,&lt;br /&gt;
to avoid the effort of modifying multiple individual SIRMETH rules,&lt;br /&gt;
you may be willing to risk letting&lt;br /&gt;
programmers modify any system or subsystem entity.&lt;br /&gt;
If so, the following rules allow everyone&lt;br /&gt;
to do everything with system and subsystem entities:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMSET&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMSET&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMCONTEXT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
It is worth reiterating that while the System and Subsystem classes are&lt;br /&gt;
the preferred interface for setting system and subsystem globals,&lt;br /&gt;
the SIRMETH rules also apply to $setg_sys and $setg_subsys.&lt;br /&gt;
If the third parameter of $setg_subsys (subsystem name) is specified,&lt;br /&gt;
no SIRMETH rules apply, and the user must be a system manager.&lt;br /&gt;
You can get the same effect as a $setg_subsys with a subsystem&lt;br /&gt;
name by saving the subsystem context, setting it, and then restoring it:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %oldContext = %(subsystem):context&lt;br /&gt;
    %(subsystem):context = &#039;CUSTOMER&#039;&lt;br /&gt;
    %(subsystem):setGlobal(&#039;CUSTFILE&#039;, &#039;GROUP CUST2004&#039;)&lt;br /&gt;
    %(subsystem):context = %oldContext&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==System and subsystem globals and strings==&lt;br /&gt;
Typically, a $getg function or a dummy string compile-time string&lt;br /&gt;
(that is, something that begins with &amp;lt;tt&amp;gt;?&amp;amp;&amp;lt;/tt&amp;gt;) is resolved from a thread-level&lt;br /&gt;
global variable (that is, a variable set via $setg).&lt;br /&gt;
Often, however, all requests in an Online or subsystem will use the&lt;br /&gt;
same value for some of these globals, so it seems appealing for these&lt;br /&gt;
users to share a copy of those globals rather than each wasting GTBL&lt;br /&gt;
space to hold a copy for each thread.&lt;br /&gt;
System and subsystem globals make this feasible.&lt;br /&gt;
 &lt;br /&gt;
By default, if a global reference (either a $getg or a dummy string)&lt;br /&gt;
cannot be resolved with thread-level globals, subsystem and then system&lt;br /&gt;
globals will be searched.&lt;br /&gt;
If one of these matches the requested global, that global will be&lt;br /&gt;
returned for the $getg or the dummy string.&lt;br /&gt;
 &lt;br /&gt;
For example, if the following statement exists in a subsystem initialization&lt;br /&gt;
procedure:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %(subsystem):setGlobal(&#039;INVFILE&#039;, &#039;PERM GROUP INV2004&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
the following line&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %inventoryRecords is object recordSet in ?&amp;amp;INVFILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
is resolved as&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %inventoryRecords is object recordSet in PERM GROUP INV2004&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
$SIRPARM has settings to indicate that $get or dummy string lookup&lt;br /&gt;
should use subsystem or system globals ahead of thread-specific globals.&lt;br /&gt;
For example, the following statement&lt;br /&gt;
indicates that subsystem or system globals are to be used ahead of thread-specific&lt;br /&gt;
globals for dummy strings:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %rc = $sirparm(&#039;DUMMYSYS&#039;, 1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And the following call indicates that subsystem or system globals are to be used&lt;br /&gt;
ahead of thread-specific globals for $getg calls:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %rc = $sirparm(&#039;GETGSYS&#039;, 1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Note that system and subsystem globals are different from system and&lt;br /&gt;
subsystem strings.&lt;br /&gt;
The latter are never returned for $getg or dummy string requests,&lt;br /&gt;
and they can only be retrieved via the [[String (System/Subsystem function)|String]]&lt;br /&gt;
function.&lt;br /&gt;
Also, system and subsystem global values can never be longer than 255 bytes,&lt;br /&gt;
whereas&lt;br /&gt;
system and subsystem strings are longstrings, which can be up to 2**31-1 bytes&lt;br /&gt;
long.&lt;br /&gt;
==System-wide objects==&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 6.7 adds methods to the Janus System and Subsystem classes&lt;br /&gt;
that make designated objects available to all users in an Online or of a subsystem.&lt;br /&gt;
Such objects, referred to as &#039;&#039;&#039;system-wide&#039;&#039;&#039; objects, are made available&lt;br /&gt;
via deep copy, so only&lt;br /&gt;
deep copyable (see [[Copying objects]]) objects are eligible.&lt;br /&gt;
 &lt;br /&gt;
An object becomes system-wide if and only if it is saved by the System class&lt;br /&gt;
SetObject method or by the Subsystem class SetObject method.&lt;br /&gt;
If by the System class SetObject method, the &amp;amp;ldquo;system&amp;amp;rdquo; in system-wide&lt;br /&gt;
refers to all users in the Online; if by the Subsystem SetObject method, all&lt;br /&gt;
users in the current or a specified subsystem.&lt;br /&gt;
 &lt;br /&gt;
System-wide objects belong to a namespace that is not the same as&lt;br /&gt;
that for System and Subsystem longstrings.&lt;br /&gt;
That is, both a System longstring and a system-wide object may be called by the&lt;br /&gt;
same name at the same time.&lt;br /&gt;
 &lt;br /&gt;
The methods that work with system-wide objects are one System and one Subsystem&lt;br /&gt;
class version of each of the following:&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Method&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Summary&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;System&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;SubSystem&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;SetObject&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Makes an object available system-wide with a specified name.&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[SetObject (System function)|SetObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[SetObject (Subsystem function)|SetObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;GetObject&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Retrieves a copy of the specified system-wide object.&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[GetObject (System function)|GetObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[GetObject (Subsystem function)|GetObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;DeleteObject&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deletes the specified system-wide object.&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[DeleteObject (System subroutine)|DeleteObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[DeleteObject (Subsystem subroutine)|DeleteObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;ListOfObjects&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Returns a Stringlist containing information about system-wide objects&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[ListOfObjects (System function)|ListOfObjects]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[ListOfObjects (Subsystem function)|ListOfObjects]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lists of System and Subsystem methods==&lt;br /&gt;
The individual System methods are summarized in [[List of System methods|&amp;quot;List of System methods&amp;quot;]].&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
The individual Subsystem methods are summarized in [[List of Subsystem methods|&amp;quot;List of Subsystem methods&amp;quot;]].&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=System_and_Subsystem_classes&amp;diff=13965</id>
		<title>System and Subsystem classes</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=System_and_Subsystem_classes&amp;diff=13965"/>
		<updated>2012-02-16T03:57:44Z</updated>

		<summary type="html">&lt;p&gt;Adrian: /* System-wide objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- System and Subsystem classes --&amp;gt;&lt;br /&gt;
&amp;lt;!-- on System class page, #REDIRECT [[System and Subsystem classes]]&lt;br /&gt;
     on Subystem class page, #REDIRECT [[System and Subsystem classes]] --&amp;gt; &lt;br /&gt;
The System and Subsystem classes are collections of shared methods that&lt;br /&gt;
operate on entities (globals, strings, objects) made&lt;br /&gt;
available to all users in an Online system or all users in a subsystem,&lt;br /&gt;
or that operate on environmental entities such as the current INCLUDE&lt;br /&gt;
arguments, or the current call stack that are essentially part of the&lt;br /&gt;
&amp;amp;ldquo;system.&amp;amp;rdquo;&lt;br /&gt;
 &lt;br /&gt;
There are no System or Subsystem objects, per se.&lt;br /&gt;
That is, you cannot instantiate an instance of a System or Subsystem object,&lt;br /&gt;
nor assign references from one variable to another, nor are there any&lt;br /&gt;
instance-specific methods in these classes.&lt;br /&gt;
You can, however, declare objects of these classes.&lt;br /&gt;
The main use of such objects is to provide a short-hand way of referencing&lt;br /&gt;
the classes:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %sys       is object system&lt;br /&gt;
    %subsys    is object subsystem&lt;br /&gt;
     ...&lt;br /&gt;
    %sys:setGlobal(&#039;GOOSE&#039;, &#039;SAUCE&#039;)&lt;br /&gt;
    %subsys:setGlobal(&#039;GANDER&#039;, &#039;SAUCE&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Even though you cannot instantiate or invoke instance-specific&lt;br /&gt;
methods against System or Subsystem objects, you may find it&lt;br /&gt;
helpful to think of there being an implicit System object&lt;br /&gt;
that contains system-wide and thread-specific context for the system,&lt;br /&gt;
and a SubSystem object for every valid subsystem context.&lt;br /&gt;
Still, all System and Subsystem class methods are shared methods,&lt;br /&gt;
so they are invokable via their class names:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %(system):setString(&#039;STATUS&#039;, %status)&lt;br /&gt;
    print %(subsystem):string(&#039;INFO&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Subsystem context==&lt;br /&gt;
Subsystem class methods operate on entities associated with the current&lt;br /&gt;
subsystem context.&lt;br /&gt;
This context is, by default, the current subsystem in which a request&lt;br /&gt;
is running.&lt;br /&gt;
It is, possible, however, to run with a subsystem context different from&lt;br /&gt;
the current subsystem.&lt;br /&gt;
This subsystem context can be a subsystem other than the one being run,&lt;br /&gt;
or it can even be a context that isn&#039;t associated with a real subsystem &amp;amp;mdash;&lt;br /&gt;
the context is simply a name, and it is not required to be a started or&lt;br /&gt;
even defined subsystem.&lt;br /&gt;
It is also possible to set a subsystem context for requests that are not even&lt;br /&gt;
inside a subsystem.&lt;br /&gt;
 &lt;br /&gt;
When a subsystem is entered, the subsystem context is automatically set to&lt;br /&gt;
the name of the one being entered.&lt;br /&gt;
When the subsystem is exited, the context is set back to the subsystem&lt;br /&gt;
context in effect at entry to the subsystem, whether or not the subsystem was&lt;br /&gt;
changed inside the subsystem.&lt;br /&gt;
 &lt;br /&gt;
Once the subsystem context is set, all Subsystem class methods apply to&lt;br /&gt;
that subsystem context.&lt;br /&gt;
For example, if subsystem ORDER is entered, the following statement&lt;br /&gt;
sets a subsystem string for that subsystem:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %(subsystem):setString(&#039;DEBUG&#039;, &#039;ON&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, if the following statement is run before it,&lt;br /&gt;
the SetString method actually applies to the DISORDER subsystem context:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %(subsystem):context = &#039;DISORDER&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Since setting the subsystem context allows a request to modify entities&lt;br /&gt;
associated with another subsystem, the ability to set subsystem context&lt;br /&gt;
is protected.&lt;br /&gt;
Ordinarily, only a system manager can set the subsystem context, though&lt;br /&gt;
the ability to set subsystem context can be controlled with SIRMETH&lt;br /&gt;
rules.&lt;br /&gt;
==Using SIRMETH to specify security rules==&lt;br /&gt;
The ability to modify system or subsystem entities gives a user the&lt;br /&gt;
ability to cause problems in threads other than their own.&lt;br /&gt;
As such, this capability must be protected to prevent malicious or&lt;br /&gt;
unintentional modification of system-wide or subsystem-wide&lt;br /&gt;
entities.&lt;br /&gt;
 &lt;br /&gt;
The default protection for system-wide and subsystem-wide entities&lt;br /&gt;
is:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Only system managers can modify system-wide entities (system globals&lt;br /&gt;
and strings, for example).&lt;br /&gt;
&amp;lt;li&amp;gt;Only pre-compiled procedures in a subsystem can modify subsystem-wide&lt;br /&gt;
entities.&lt;br /&gt;
&amp;lt;li&amp;gt;Only system managers can set their subsystem context.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
While these rules prevent intentional or unintentional tampering&lt;br /&gt;
with system or subsystem entities, they can also be onerous:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;There might be several trusted subsystems that one would want to&lt;br /&gt;
allow to set System globals.&lt;br /&gt;
&amp;lt;li&amp;gt;One might want to set SubSystem globals in non-precompiled procedures.&lt;br /&gt;
&amp;lt;li&amp;gt;One might want several subsystems to operate under the same subsystem&lt;br /&gt;
context, that is, share subsystem entities.&lt;br /&gt;
&amp;lt;li&amp;gt;For development and debugging, one might want very loose restrictions&lt;br /&gt;
on what programmers can and cannot do.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
While most of these problems can be worked around by giving programmers system&lt;br /&gt;
manager privileges or by having subsystems run with system manager privileges,&lt;br /&gt;
this might be further than one wants to go to provide these capabilities.&lt;br /&gt;
 &lt;br /&gt;
To ameliorate these problems, the SIRMETH command is provided.&lt;br /&gt;
The SIRMETH command provides a way of giving specific subsystems or all&lt;br /&gt;
users access to certain System or Subsystem class capabilities.&lt;br /&gt;
Of course, the SIRMETH command itself requires system manager privileges.&lt;br /&gt;
===SIRMETH command syntax===&lt;br /&gt;
   SIRMETH {ALLOW | DISALLOW}                   -&lt;br /&gt;
           {SYSTEMSET | SUBSYSTEMSET |          -&lt;br /&gt;
            SUBSYSTEMCONTEXT csubsys | ALL}     -&lt;br /&gt;
           [SUBSYSTEM subsys [NONPRE] ]&lt;br /&gt;
Where:&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
&amp;lt;dt&amp;gt;ALLOW&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates that requests matching the rule will be allowed to perform&lt;br /&gt;
the indicated action.&lt;br /&gt;
&amp;lt;dt&amp;gt;DISALLOW&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates that requests matching the rule will not be allowed to perform&lt;br /&gt;
the indicated action.&lt;br /&gt;
&amp;lt;dt&amp;gt;SYSTEMSET&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates the ability to set system strings or globals.&lt;br /&gt;
This applies to the SetGlobal and SetString methods in the System&lt;br /&gt;
class, as well as the $setg_sys function.&lt;br /&gt;
&amp;lt;dt&amp;gt;SUBSYSTEMSET&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates the ability to set subsytem strings or globals.&lt;br /&gt;
This applies to the SetGlobal and SetString methods in the SubSystem&lt;br /&gt;
class, as well as the $setg_subsys function (when the third argument,&lt;br /&gt;
the subsystem name, is not specified).&lt;br /&gt;
&amp;lt;dt&amp;gt;SUBSYSTEMCONTEXT&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates the ability to change subsytem context to the subsystem&lt;br /&gt;
indicated by &#039;&#039;csubsys&#039;&#039;.&lt;br /&gt;
&#039;&#039;csubsys&#039;&#039; can be a specific subsystem name such as SIRPRO,&lt;br /&gt;
or it can be a wild-card such as SIR* or ???PRO.&lt;br /&gt;
&amp;lt;dt&amp;gt;ALL&lt;br /&gt;
&amp;lt;dd&amp;gt;Only allowed on a DISALLOW rule, this indicates that no extra&lt;br /&gt;
capabilities are to be provided to requests matching the rule.&lt;br /&gt;
&amp;lt;dt&amp;gt;SUBSYSTEM&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates that the action is to be allowed to methods in the subsystem&lt;br /&gt;
indicated by &#039;&#039;subsys&#039;&#039;.&lt;br /&gt;
&#039;&#039;subsys&#039;&#039; can be a specific subsystem name such as INVENTORY, or it&lt;br /&gt;
can be a wild-card such as INV* or INVENTO?Y.&lt;br /&gt;
 &lt;br /&gt;
Note that if SUBSYSTEM is specified, the rule applies to the real subsystem&lt;br /&gt;
being run, regardless of the current subsystem context.&lt;br /&gt;
Note also that unless followed by the keyword NONPRE, the rule only applies&lt;br /&gt;
to pre-compiled procedures in the subsystem.&lt;br /&gt;
&amp;lt;dt&amp;gt;NONPRE&lt;br /&gt;
&amp;lt;dd&amp;gt;Indicates that non-pre-compiled&lt;br /&gt;
procedures in the subsystem are also to be given the capabilities indicated by&lt;br /&gt;
the SIRMETH rule.&lt;br /&gt;
NONPRE must immediately follow the subsystem name.&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You can specify as many SIRMETH rules as you want.&lt;br /&gt;
A SIRMETH rule that&lt;br /&gt;
totally encompasses a previous rule preempts that rule.&lt;br /&gt;
For example, in the following two rules,&lt;br /&gt;
the second SIRMETH rule completely encompasses the first, so the first&lt;br /&gt;
rule is discarded:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMSET SUBSYS FOOBAR&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMSET SUBSYS FOO*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A SIRMETH DISALLOW ALL preempts all previous rules,&lt;br /&gt;
so it is a way of starting from a clean slate.&lt;br /&gt;
If you place a SIRMETH DISALLOW ALL at the start of a&lt;br /&gt;
sequence of SIRMETH rules (most likely in a procedure), those rules&lt;br /&gt;
can be run again and again, perhaps after some of the rules have been&lt;br /&gt;
modified.&lt;br /&gt;
Of course, in the interval between the SIRMETH DISALLOW ALL and the&lt;br /&gt;
subsequent rules, some ordinarily legal requests might be disallowed,&lt;br /&gt;
so it is probably not a good idea to reapply SIRMETH rules in&lt;br /&gt;
a production region.&lt;br /&gt;
 &lt;br /&gt;
Generally, SIRMETH rules are placed in the CCAIN stream or in&lt;br /&gt;
a procedure INCLUDE&#039;d in the CCAIN stream.&lt;br /&gt;
 &lt;br /&gt;
The reason for the NONPRE keyword is that many debugging and development&lt;br /&gt;
subsystems allow users (programmers, typically) to run arbitrary code&lt;br /&gt;
from inside the subsystem.&lt;br /&gt;
Typically, this arbitrary code is run from a non-pre-compiled&lt;br /&gt;
procedure that includes the programmer&#039;s code.&lt;br /&gt;
To prevent such code from picking up the subsystem&#039;s capabilities,&lt;br /&gt;
System and Subsystem class security does not apply SIRMETH rules&lt;br /&gt;
to non-pre-compiled procedures, unless the NONPRE keyword is specified&lt;br /&gt;
on the rule.&lt;br /&gt;
Since most subsystems don&#039;t allow users to run arbitrary code inside&lt;br /&gt;
them, and since it is quite likely that you might want to set&lt;br /&gt;
subsystem globals or switch subsystem contexts inside a non-pre-compiled&lt;br /&gt;
procedure, it is probably a good idea to specify NONPRE for those&lt;br /&gt;
subsystems.&lt;br /&gt;
 &lt;br /&gt;
In a development environment,&lt;br /&gt;
to avoid the effort of modifying multiple individual SIRMETH rules,&lt;br /&gt;
you may be willing to risk letting&lt;br /&gt;
programmers modify any system or subsystem entity.&lt;br /&gt;
If so, the following rules allow everyone&lt;br /&gt;
to do everything with system and subsystem entities:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMSET&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMSET&lt;br /&gt;
    SIRMETH ALLOW SUBSYSTEMCONTEXT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
It is worth reiterating that while the System and Subsystem classes are&lt;br /&gt;
the preferred interface for setting system and subsystem globals,&lt;br /&gt;
the SIRMETH rules also apply to $setg_sys and $setg_subsys.&lt;br /&gt;
If the third parameter of $setg_subsys (subsystem name) is specified,&lt;br /&gt;
no SIRMETH rules apply, and the user must be a system manager.&lt;br /&gt;
You can get the same effect as a $setg_subsys with a subsystem&lt;br /&gt;
name by saving the subsystem context, setting it, and then restoring it:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %oldContext = %(subsystem):context&lt;br /&gt;
    %(subsystem):context = &#039;CUSTOMER&#039;&lt;br /&gt;
    %(subsystem):setGlobal(&#039;CUSTFILE&#039;, &#039;GROUP CUST2004&#039;)&lt;br /&gt;
    %(subsystem):context = %oldContext&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==System and subsystem globals and strings==&lt;br /&gt;
Typically, a $getg function or a dummy string compile-time string&lt;br /&gt;
(that is, something that begins with &amp;lt;tt&amp;gt;?&amp;amp;&amp;lt;/tt&amp;gt;) is resolved from a thread-level&lt;br /&gt;
global variable (that is, a variable set via $setg).&lt;br /&gt;
Often, however, all requests in an Online or subsystem will use the&lt;br /&gt;
same value for some of these globals, so it seems appealing for these&lt;br /&gt;
users to share a copy of those globals rather than each wasting GTBL&lt;br /&gt;
space to hold a copy for each thread.&lt;br /&gt;
System and subsystem globals make this feasible.&lt;br /&gt;
 &lt;br /&gt;
By default, if a global reference (either a $getg or a dummy string)&lt;br /&gt;
cannot be resolved with thread-level globals, subsystem and then system&lt;br /&gt;
globals will be searched.&lt;br /&gt;
If one of these matches the requested global, that global will be&lt;br /&gt;
returned for the $getg or the dummy string.&lt;br /&gt;
 &lt;br /&gt;
For example, if the following statement exists in a subsystem initialization&lt;br /&gt;
procedure:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %(subsystem):setGlobal(&#039;INVFILE&#039;, &#039;PERM GROUP INV2004&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
the following line&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %inventoryRecords is object recordSet in ?&amp;amp;INVFILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
is resolved as&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %inventoryRecords is object recordSet in PERM GROUP INV2004&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
$SIRPARM has settings to indicate that $get or dummy string lookup&lt;br /&gt;
should use subsystem or system globals ahead of thread-specific globals.&lt;br /&gt;
For example, the following statement&lt;br /&gt;
indicates that subsystem or system globals are to be used ahead of thread-specific&lt;br /&gt;
globals for dummy strings:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %rc = $sirparm(&#039;DUMMYSYS&#039;, 1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And the following call indicates that subsystem or system globals are to be used&lt;br /&gt;
ahead of thread-specific globals for $getg calls:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;xmp&amp;quot;&amp;gt;&lt;br /&gt;
    %rc = $sirparm(&#039;GETGSYS&#039;, 1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Note that system and subsystem globals are different from system and&lt;br /&gt;
subsystem strings.&lt;br /&gt;
The latter are never returned for $getg or dummy string requests,&lt;br /&gt;
and they can only be retrieved via the [[String (System/Subsystem function)|String]]&lt;br /&gt;
function.&lt;br /&gt;
Also, system and subsystem global values can never be longer than 255 bytes,&lt;br /&gt;
whereas&lt;br /&gt;
system and subsystem strings are longstrings, which can be up to 2**31-1 bytes&lt;br /&gt;
long.&lt;br /&gt;
==System-wide objects==&lt;br /&gt;
&#039;&#039;Sirius Mods&#039;&#039; version 6.7 adds methods to the Janus System and Subsystem classes&lt;br /&gt;
that make designated objects available to all users in an Online or of a subsystem.&lt;br /&gt;
Such objects, referred to as &#039;&#039;&#039;system-wide&#039;&#039;&#039; objects, are made available&lt;br /&gt;
via deep copy, so only&lt;br /&gt;
deep copyable (see [[Copying objects]]) objects are eligible.&lt;br /&gt;
 &lt;br /&gt;
An object becomes system-wide if and only if it is saved by the System class&lt;br /&gt;
SetObject method or by the Subsystem class SetObject method.&lt;br /&gt;
If by the System class SetObject method, the &amp;amp;ldquo;system&amp;amp;rdquo; in system-wide&lt;br /&gt;
refers to all users in the Online; if by the Subsystem SetObject method, all&lt;br /&gt;
users in the current or a specified subsystem.&lt;br /&gt;
 &lt;br /&gt;
System-wide objects belong to a namespace that is not the same as&lt;br /&gt;
that for System and Subsystem longstrings.&lt;br /&gt;
That is, both a System longstring and a system-wide object may be called by the&lt;br /&gt;
same name at the same time.&lt;br /&gt;
 &lt;br /&gt;
The methods that work with system-wide objects are one System and one Subsystem&lt;br /&gt;
class version of each of the following:&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Method&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Summary&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;System&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;SubSystem&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;SetObject&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Makes an object available system-wide with a specified name.&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[SetObject (System function)|SetObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[SetObject (Subsystem function)|SetObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;GetObject&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Retrieves a copy of the specified system-wide object.&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[GetObject (System function)|GetObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[GetObject (Subsystem function)|GetObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;DeleteObject&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deletes the specified system-wide object.&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[DeleteObject (System subroutine)|DeleteObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[DeleteObject (Subsystem subroutine)|DeleteObject]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;ListOfObjects&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Returns a Stringlist containing information about system-wide objects&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[ListOfObjects (System function)|ListOfObjects]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[ListOfObjects (Subsystem function)|ListOfObjects]]&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lists of System and Subsystem methods==&lt;br /&gt;
The individual System methods are summarized in [[List of System methods|&amp;quot;List of System methods&amp;quot;]].&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
The individual Subsystem methods are summarized in [[List of Subsystem methods|&amp;quot;List of Subsystem methods&amp;quot;]].&lt;/div&gt;</summary>
		<author><name>Adrian</name></author>
	</entry>
</feed>