<?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=Heikki</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=Heikki"/>
	<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Special:Contributions/Heikki"/>
	<updated>2026-04-20T00:34:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Local_and_Common_entities&amp;diff=78434</id>
		<title>Local and Common entities</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Local_and_Common_entities&amp;diff=78434"/>
		<updated>2015-07-23T04:10:50Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Using a Common Subroutine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many methods are useful in a wide variety of applications.&lt;br /&gt;
System methods usually fall into this category, as they are intended to&lt;br /&gt;
provide basic services that are useful in many applications.&lt;br /&gt;
Methods that are widely useful will usually be contained in a class,&lt;br /&gt;
often as &amp;lt;var&amp;gt;Public&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;Private&amp;lt;/var&amp;gt; methods, but sometimes as [[Enhancement methods|enhancement methods]],&lt;br /&gt;
and sometimes as non-enhancement shared methods.&lt;br /&gt;
 &lt;br /&gt;
On the other hand, some methods have only relatively local applicability.&lt;br /&gt;
That is, while useful in a specific application context, they are not likely&lt;br /&gt;
to be useful in other contexts.&lt;br /&gt;
The following are cases where using such essentially-local methods might be beneficial:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;As a substitute for a large block of code in the main line of application processing,&lt;br /&gt;
increasing code readability.&lt;br /&gt;
&amp;lt;li&amp;gt;As a container for application-specific code that is repeated exactly or almost&lt;br /&gt;
exactly several times in a block of code, yet&lt;br /&gt;
does not lend itself to a loop construct.&lt;br /&gt;
&amp;lt;li&amp;gt;As an alternative way to implement a locally recursive process.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
There are many other situations where locally applicable methods would be useful.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3 --&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; &#039;&#039;&#039;local methods&#039;&#039;&#039; facilitate the writing&lt;br /&gt;
of locally applicable methods. Local methods provide all the functionality of simple subroutines, and more:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;They can be nested inside other methods.&lt;br /&gt;
&amp;lt;li&amp;gt;They can have local variables.&lt;br /&gt;
&amp;lt;li&amp;gt;They can have access to containing context variables or not as one wishes.&lt;br /&gt;
&amp;lt;li&amp;gt;They have all the capabilities of method calls including optional and named&lt;br /&gt;
parameters and the ability to return values or even be settable (a property).&lt;br /&gt;
&amp;lt;li&amp;gt;They are invoked with object-oriented syntax.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Accompanying local methods are additional entities that have local scope:&lt;br /&gt;
&amp;lt;!-- as of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3: --&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Classes, enumerations, and structures have&lt;br /&gt;
[[#Local classes, enumerations, and structures|local counterparts]].&lt;br /&gt;
&amp;lt;li&amp;gt;[[#Local aliases|Local aliases]]&lt;br /&gt;
are a simplified way to call a non-local method in a local context.&lt;br /&gt;
&amp;lt;li&amp;gt;[[#Persistent and Shared local variables|Local variables]]&lt;br /&gt;
are variables that can be used only within a local method&lt;br /&gt;
but that have greater persistence than simple percent variables.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- Also as of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3, --&amp;gt;[[#Common methods and aliases|Common methods and aliases]] are variations of&lt;br /&gt;
local methods and aliases that are designed to be similar enough to standard&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; Common variables and complex subroutines to replace them in existing applications.&lt;br /&gt;
&lt;br /&gt;
==Scope and locality==&lt;br /&gt;
One important thing to understand about local methods is the concept of&lt;br /&gt;
&#039;&#039;&#039;scope&#039;&#039;&#039;.&lt;br /&gt;
A scope is a block of code whose variables are isolated from other scopes.&lt;br /&gt;
For example, the outermost scope in &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;: the block of code inside the &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt; block for a request, but not inside a method or complex subroutine, is one scope.&lt;br /&gt;
 &lt;br /&gt;
Each complex subroutine is another scope, and each method, yet another.&lt;br /&gt;
This means that a particular variable name, say, &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt;, can only&lt;br /&gt;
be declared once in a given scope, and that variable is distinct from an&lt;br /&gt;
identically named variable in another scope.&lt;br /&gt;
So, in the following example,&lt;br /&gt;
&amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; is a &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; object variable in the outermost scope, a &amp;lt;var&amp;gt;Unicode&amp;lt;/var&amp;gt; variable&lt;br /&gt;
in complex subroutine &amp;lt;code&amp;gt;WorkHarder&amp;lt;/code&amp;gt;, and a &amp;lt;var&amp;gt;Float&amp;lt;/var&amp;gt; variable in function &amp;lt;code&amp;gt;Cipher&amp;lt;/code&amp;gt; in class&lt;br /&gt;
&amp;lt;code&amp;gt;Neat&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;begin&lt;br /&gt;
  %foo    is object stringlist&lt;br /&gt;
  ...&lt;br /&gt;
  subroutine workHarder&lt;br /&gt;
     %foo    is unicode&lt;br /&gt;
     ...&lt;br /&gt;
  end subroutine&lt;br /&gt;
  ...&lt;br /&gt;
  class neat&lt;br /&gt;
     ...&lt;br /&gt;
     function cipher is float&lt;br /&gt;
        %foo    is float&lt;br /&gt;
        ...&lt;br /&gt;
     end function&lt;br /&gt;
     ...&lt;br /&gt;
  end class&lt;br /&gt;
  ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Because the outermost, complex subroutine, and method scopes are isolated, there is&lt;br /&gt;
no danger of confusion for the &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; variables in the preceding example.&lt;br /&gt;
In fact, there is no way to access the outermost scope &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; from the inside&lt;br /&gt;
of complex subroutine &amp;lt;code&amp;gt;WorkHarder&amp;lt;/code&amp;gt; or function &amp;lt;code&amp;gt;Cipher&amp;lt;/code&amp;gt;, even if no local &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; had been&lt;br /&gt;
defined in these scopes.&lt;br /&gt;
Scope applies to what are termed &#039;&#039;&#039;local variables&#039;&#039;&#039;, that is, variables&lt;br /&gt;
that are local to the scope.&lt;br /&gt;
 &lt;br /&gt;
Class variables are &#039;&#039;always&#039;&#039; accessed via an object variable of the class,&lt;br /&gt;
so they are not affected by local scoping.&lt;br /&gt;
That is, a variable in class Clever called Junk can only be accessed via an object&lt;br /&gt;
variable of class Clever.&lt;br /&gt;
So, if %smart is an object of class Clever, variable Junk could be accessed via&lt;br /&gt;
&amp;lt;code&amp;gt;%smart:junk&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Sometimes, the object variable is implicit.&lt;br /&gt;
For example, inside an instance (non-shared) method inside of class Clever, a&lt;br /&gt;
%junk would be interpreted as &amp;lt;code&amp;gt;%this:junk&amp;lt;/code&amp;gt; if no local variable called %junk were&lt;br /&gt;
defined.&lt;br /&gt;
Similarly, if function Piggledy on local object variable %higgledy produced a&lt;br /&gt;
Clever object, the Junk variable in that object could be accessed via&lt;br /&gt;
&amp;lt;code&amp;gt;%higgledy:piggledy:junk&amp;lt;/code&amp;gt;.&lt;br /&gt;
Again, the Clever class variable is implicit here.&lt;br /&gt;
 &lt;br /&gt;
Shared variables in a class are global in scope, that is, they maintain their&lt;br /&gt;
value and can be accessed from inside of any scope.&lt;br /&gt;
This can be done using the &amp;lt;code&amp;gt;(&amp;lt;classname&amp;gt;):&amp;lt;variable&amp;gt;&amp;lt;/code&amp;gt; syntax or&lt;br /&gt;
the &amp;lt;code&amp;gt;%&amp;lt;object&amp;gt;:&amp;lt;variable&amp;gt;&amp;lt;/code&amp;gt; syntax.&lt;br /&gt;
Because, the class distinguishes the variable from other identically named variables&lt;br /&gt;
in other scopes, there is no need to scope such variables: they can be&lt;br /&gt;
accessed from any scope inside a &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; request.&lt;br /&gt;
 &lt;br /&gt;
Of course, private variables in a class can only be accessed from methods inside&lt;br /&gt;
the class.&lt;br /&gt;
So, in some sense, a class is, itself, a scope where private variables in the&lt;br /&gt;
class might be accessed.&lt;br /&gt;
However, for the purposes of most discussion, scope will refer only to the&lt;br /&gt;
scope for local variables, so it will only refer to the outermost (&amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt;) scope,&lt;br /&gt;
complex subroutine scope, and method scope.&lt;br /&gt;
 &lt;br /&gt;
It is worth mentioning &#039;&#039;&#039;common variables&#039;&#039;&#039; with regard to scoping.&lt;br /&gt;
Common variables, as their name might suggest, can be accessed from many different&lt;br /&gt;
scopes.&lt;br /&gt;
However, they must be declared as common in each scope in which they are to be&lt;br /&gt;
accessed.&lt;br /&gt;
 &lt;br /&gt;
For example, to change the previous example slightly:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;begin&lt;br /&gt;
   %foo    is object stringlist common&lt;br /&gt;
   ...&lt;br /&gt;
   subroutine workHarder&lt;br /&gt;
      %foo    is unicode&lt;br /&gt;
      ...&lt;br /&gt;
   end subroutine&lt;br /&gt;
   ...&lt;br /&gt;
   class neat&lt;br /&gt;
      ...&lt;br /&gt;
      function cipher is float&lt;br /&gt;
         %foo    is object stringlist common&lt;br /&gt;
         ...&lt;br /&gt;
      end function&lt;br /&gt;
      ...&lt;br /&gt;
   end class&lt;br /&gt;
   ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In this example, the &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; variables in the outermost scope and in the scope&lt;br /&gt;
for method &amp;lt;code&amp;gt;Cipher&amp;lt;/code&amp;gt; in class &amp;lt;code&amp;gt;Neat&amp;lt;/code&amp;gt; reference the same &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; object variable.&lt;br /&gt;
On the other hand, &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; in the complex subroutine &amp;lt;code&amp;gt;WorkHarder&amp;lt;/code&amp;gt; is a local variable,&lt;br /&gt;
so the &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; common variable cannot be accessed in that scope.&lt;br /&gt;
==Defining and invoking a local method==&lt;br /&gt;
The local method facility lets you create methods that&lt;br /&gt;
are &#039;&#039;not&#039;&#039; part of a class and are only available&lt;br /&gt;
inside the scope within which their definition is contained.&lt;br /&gt;
A local method does not require a separate declaration block before it is defined.&lt;br /&gt;
Typically, a local method&#039;s declaration begins the method definition.&lt;br /&gt;
 &lt;br /&gt;
Local methods are declared with the keyword &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt;, followed by the&lt;br /&gt;
method type, followed by the method name and description:&lt;br /&gt;
===Local method declaration syntax===&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;Local &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodType methodName methodDesc&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where:&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;methodType&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The method type, which has the following syntax:&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;Subroutine | Function | Property&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The types of local method are like those of class methods:&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns no 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;&amp;lt;var&amp;gt;Function&amp;lt;/var&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns a value, but cannot be set to a 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;&amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Can return a value or be set to a value. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/p&amp;gt;&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;methodName&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The method name, which can be any name that follows the rules for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; %variables, possibly preceded by the class that the method enhances (locally). However, like variable declarations inside of &amp;lt;var&amp;gt;Class&amp;lt;/var&amp;gt; blocks, the name does not start with the percent (&amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt;) sign.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In addition, the name cannot be the same as a simple percent variable in the same scope (though it can be the same as a class variable or method, as discussed in [[#Using Defer and Expose|&amp;quot;Using Defer and Expose&amp;quot;]]). &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The method name syntax is: &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;literal&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;className&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&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;term&amp;quot;&amp;gt;methodname&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt; &lt;br /&gt;
If a class name is not specified, the method is assumed to be a shared, non-enhancement local method.&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;methodDesc&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The method description, which has exactly the same structure as the method descriptions for class variables. That is, a local method has an optional parameter list which can contain required and optional, named and unnamed parameters, and their types. The parameter list is followed by a method result type (for &amp;lt;var&amp;gt;Functions&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Properties&amp;lt;/var&amp;gt;) and then possibly by further qualifiers.&lt;br /&gt;
&amp;lt;p&amp;gt; &lt;br /&gt;
The method description syntax is: &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;literal&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;literal&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;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;term&amp;quot;&amp;gt;datatype&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;qualifiers&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;While most qualifiers can be used for both local and class methods, some qualifiers (such as &amp;lt;var&amp;gt;Public&amp;lt;/var&amp;gt;) make no sense in local method declarations, so they are not allowed, while a few others, like &amp;lt;var&amp;gt;Expose&amp;lt;/var&amp;gt; (discussed later), only make sense for &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; methods. &amp;lt;/p&amp;gt;&lt;br /&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;
An example of a local function declaration follows:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (float):addAndMult(%what is float) is float&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Unlike class methods, local methods can and must be declared inside some other scope.&lt;br /&gt;
And unlike complex subroutines, local methods can be contained inside any scope,&lt;br /&gt;
not just the outermost scope.&lt;br /&gt;
 &lt;br /&gt;
Like simple variables, local methods, themselves, have scope.&lt;br /&gt;
That is, they can only be called inside the scope in which they are defined.&lt;br /&gt;
This is different from complex subroutines, which must be declared in the&lt;br /&gt;
outermost scope, but can be called from any scope.&lt;br /&gt;
 &lt;br /&gt;
In general, as in the following example, a local method declaration is followed&lt;br /&gt;
by the definition of the method (although as described in [[#Using Defer and Expose|&amp;quot;Using Defer and Expose&amp;quot;]],&lt;br /&gt;
you can declare a method and then define it later in the request if need be).&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):bytes is float&lt;br /&gt;
   %i     is float&lt;br /&gt;
   %bytes is float&lt;br /&gt;
   for %i from 1 to %this:count&lt;br /&gt;
      %bytes = %bytes + %this:itemLength(%i)&lt;br /&gt;
   end for&lt;br /&gt;
   return %bytes&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
When you invoke a local method (that operates on a specific object instance)&lt;br /&gt;
you do not qualify the method name with a classname.&lt;br /&gt;
The syntax for the invocation is simply:&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;object&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A different syntax is warrented for methods that do not operate&lt;br /&gt;
on a specific object instance,&lt;br /&gt;
as discussed in [[#Using non-enhancement and recursive local methods|&amp;quot;Using non-enhancement and recursive local methods&amp;quot;]].&lt;br /&gt;
 &lt;br /&gt;
The following request is a simple example that features a local method.&lt;br /&gt;
The local function in this program&lt;br /&gt;
calculates the number of bytes in all the items in a &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
local function (stringlist):bytes is float&lt;br /&gt;
   %i     is float&lt;br /&gt;
   %bytes is float&lt;br /&gt;
   for %i from 1 to %this:count&lt;br /&gt;
      %bytes = %bytes + %this:itemLength(%i)&lt;br /&gt;
   end for&lt;br /&gt;
   return %bytes&lt;br /&gt;
end function&lt;br /&gt;
 &lt;br /&gt;
%sl  is object stringlist&lt;br /&gt;
%sl = new&lt;br /&gt;
text to %sl&lt;br /&gt;
   The noise&lt;br /&gt;
   Of worldly fame is but a blast of wind,&lt;br /&gt;
   That blows from diverse points, and shifts its name,&lt;br /&gt;
   Shifting the point it blows from.&lt;br /&gt;
end text&lt;br /&gt;
 &lt;br /&gt;
printtext {~} = {%sl:bytes}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using Defer and Expose===&lt;br /&gt;
As described in the previous section,&lt;br /&gt;
a local method does not require a declaration separate from its definition.&lt;br /&gt;
However, you can do so in a situation where it is warranted&lt;br /&gt;
to declare a method before defining it (because method A&lt;br /&gt;
calls method B which calls method A).&lt;br /&gt;
In such a case, you specify a separate method declaration, append the&lt;br /&gt;
keyword &amp;lt;var&amp;gt;Defer&amp;lt;/var&amp;gt; to it, then repeat the declaration later in the&lt;br /&gt;
program as part of the method definition:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):bytes is float defer&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;amp;&#039;italic(other code)&lt;br /&gt;
 ...&lt;br /&gt;
local function (stringlist):bytes is float&lt;br /&gt;
   %i     is float&lt;br /&gt;
   %bytes is float&lt;br /&gt;
   for %i from 1 to %this:count&lt;br /&gt;
      %bytes = %bytes + %this:itemLength(%i)&lt;br /&gt;
   end for&lt;br /&gt;
   return %bytes&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A local method has its own scope and its variables are not visible to the containing&lt;br /&gt;
code.&lt;br /&gt;
Similarly, variables in the containing code are not visible to the local method&lt;br /&gt;
&amp;amp;mdash; unless the keyword &amp;lt;var&amp;gt;Expose&amp;lt;/var&amp;gt; is specified on the method declaration.&lt;br /&gt;
In the following example, the &amp;lt;code&amp;gt;Multiply&amp;lt;/code&amp;gt; local method references the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt;&lt;br /&gt;
variable in the containing code:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
%multiplier is float&lt;br /&gt;
 &lt;br /&gt;
local function (float):multiply is float expose&lt;br /&gt;
   return %multiplier * %this&lt;br /&gt;
end function&lt;br /&gt;
 &lt;br /&gt;
%multiplier = 1.5&lt;br /&gt;
printtext {~} = {17:multiply}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
When you specify &amp;lt;code&amp;gt;Expose&amp;lt;/code&amp;gt;, the %variables (and local methods)&lt;br /&gt;
that are exposed are&lt;br /&gt;
those in the containing context that are declared before the&lt;br /&gt;
method definition.&lt;br /&gt;
Labels, images, and screens are &#039;&#039;&#039;not&#039;&#039;&#039; exposed.&lt;br /&gt;
 &lt;br /&gt;
A percent variable inside an&lt;br /&gt;
exposed method &amp;quot;hides&amp;quot; a same-named variable in the exposed context.&lt;br /&gt;
In the following request,&lt;br /&gt;
the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt; inside the local &amp;lt;code&amp;gt;Multiply&amp;lt;/code&amp;gt; method is&lt;br /&gt;
the one that is used inside the method &amp;amp;mdash; not the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt; declared&lt;br /&gt;
in the exposed context and assigned later:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
%multiplier is float&lt;br /&gt;
 &lt;br /&gt;
local function (float):multiply is float expose&lt;br /&gt;
   %multiplier is float initial(1.2)&lt;br /&gt;
   return %multiplier * %this&lt;br /&gt;
end function&lt;br /&gt;
 &lt;br /&gt;
%multiplier = 1.5&lt;br /&gt;
printtext {~} = {17:multiply}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You are allowed to reference a hidden variable&lt;br /&gt;
before it is hidden, as in this example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
%multiplier is float&lt;br /&gt;
 &lt;br /&gt;
local function (float):multiply is float expose&lt;br /&gt;
   printText {~} = {%multiplier}&lt;br /&gt;
   %multiplier is float initial(1.2)&lt;br /&gt;
   printText {~} = {%multiplier}&lt;br /&gt;
   return %multiplier * %this&lt;br /&gt;
end function&lt;br /&gt;
 &lt;br /&gt;
%multiplier = 1.5&lt;br /&gt;
printtext {~} = {17:multiply}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The first &amp;lt;code&amp;gt;PrintText&amp;lt;/code&amp;gt; statement in the &amp;lt;code&amp;gt;Multiply&amp;lt;/code&amp;gt; method prints the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt;.&lt;br /&gt;
in the exposed context.&lt;br /&gt;
The second &amp;lt;code&amp;gt;PrintText&amp;lt;/code&amp;gt; statement prints the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt; declared in the &amp;lt;code&amp;gt;Multiply&amp;lt;/code&amp;gt; method.&lt;br /&gt;
 &lt;br /&gt;
While the value of this tactic in a small local method like the one above&lt;br /&gt;
may be questionable, it might be useful in a larger local method.&lt;br /&gt;
You might want to access a containing context&#039;s&lt;br /&gt;
data after writing a great deal of code that uses the same variable name internally&lt;br /&gt;
for something else.&lt;br /&gt;
 &lt;br /&gt;
Local methods that expose the containing context are nestable.&lt;br /&gt;
Consider the following fragment:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
   ...&lt;br /&gt;
   local subroutine (stringlist):a expose&lt;br /&gt;
      ...&lt;br /&gt;
      local subroutine (stringlist):b&lt;br /&gt;
         ...&lt;br /&gt;
         local subroutine (stringlist):c expose&lt;br /&gt;
            ...&lt;br /&gt;
            local subroutine (stringlist):d expose&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In this example, method &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; can access the outermost scope&#039;s variables.&lt;br /&gt;
Neither methods &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, nor &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; can access the outermost scope&#039;s variables,&lt;br /&gt;
nor can they access method &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;&#039;s because method &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; is not exposed.&lt;br /&gt;
Methods &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; can both access method &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;&#039;s variables, and method &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; can access method &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;&#039;s.&lt;br /&gt;
Probably this level of nesting will be quite rare.&lt;br /&gt;
&lt;br /&gt;
===Using non-enhancement and recursive local methods===&lt;br /&gt;
In all the examples in the preceding subsection, the local methods are&lt;br /&gt;
enhancement methods, which is likely to be the most common type of local method.&lt;br /&gt;
Local methods can enhance intrinsic, system, or user-defined classes.&lt;br /&gt;
You can also define a non-enhancement local method.&lt;br /&gt;
 &lt;br /&gt;
If you define a non-enhancement local method, you can&lt;br /&gt;
invoke it in either of two ways:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;With &amp;lt;code&amp;gt;%(local):&amp;lt;/code&amp;gt;, the syntax for invoking a [[Notation conventions for methods#Shared members|shared]] method with&lt;br /&gt;
the term &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; in parentheses instead of a class name.&lt;br /&gt;
&amp;lt;li&amp;gt;With simply a percent sign (&amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt;) preceding the method name.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Here is an example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
%a is float&lt;br /&gt;
%b is longstring&lt;br /&gt;
%c is fixed dp 2&lt;br /&gt;
 &lt;br /&gt;
local subroutine debug expose&lt;br /&gt;
   printText {~} = {%a}&lt;br /&gt;
   printText {~} = &#039;{%b}&#039;&lt;br /&gt;
   printText {~} = {%c}&lt;br /&gt;
end subroutine&lt;br /&gt;
 &lt;br /&gt;
%(local):debug&lt;br /&gt;
 &lt;br /&gt;
%a = 12&lt;br /&gt;
%b = &#039;north&#039;&lt;br /&gt;
%c = .99&lt;br /&gt;
 &lt;br /&gt;
call %debug&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The result is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%a = 0&lt;br /&gt;
%b = &#039;&#039;&lt;br /&gt;
%c = 0.00&lt;br /&gt;
%a = 12&lt;br /&gt;
%b = &#039;north&#039;&lt;br /&gt;
%c = 0.99&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;For a local subroutine as in the example above, the keyword &amp;lt;var&amp;gt;Call&amp;lt;/var&amp;gt;&lt;br /&gt;
is also legal before &amp;lt;code&amp;gt;%(local):&amp;lt;/code&amp;gt;, but it is required if using just&lt;br /&gt;
the &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The name &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; is not allowed as a class name.&lt;br /&gt;
&amp;lt;!-- as of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As stated earlier, the name of a local method cannot be the same as a percent variable&lt;br /&gt;
in the same scope.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
As a special case to support recursive local methods,&lt;br /&gt;
unexposed methods are allowed to call themselves.&lt;br /&gt;
The following definition is valid:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (float):factorial is float&lt;br /&gt;
   if %this le 1 then&lt;br /&gt;
      return %this&lt;br /&gt;
   end if&lt;br /&gt;
   return %this * (%this - 1):factorial&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using locally inherited methods===&lt;br /&gt;
Like enhancement methods, local methods &#039;&#039;never&#039;&#039; automatically apply&lt;br /&gt;
to any extension classes.&lt;br /&gt;
For example, if the declaration of local function &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):bytes is float&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Simply applying &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; to object &amp;lt;code&amp;gt;%foolist&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;%foolist:bytes&amp;lt;/code&amp;gt;)&lt;br /&gt;
is &#039;&#039;not&#039;&#039; allowed if&lt;br /&gt;
object &amp;lt;code&amp;gt;%foolist&amp;lt;/code&amp;gt; is of class &amp;lt;code&amp;gt;MyStringlist&amp;lt;/code&amp;gt; which extends &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt;.&lt;br /&gt;
But the following &#039;&#039;is valid&#039;&#039;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%foolist:(stringlist)bytes&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You can use &amp;lt;code&amp;gt;%foolist:bytes&amp;lt;/code&amp;gt;,&lt;br /&gt;
however, if you first specify an explicit &amp;lt;var&amp;gt;Local Inherit&amp;lt;/var&amp;gt; statement, as described below.&lt;br /&gt;
&lt;br /&gt;
====Local Inherit statement syntax====&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;Local Inherit (&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;extensionClass&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;)::&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;From &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;baseclass&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;baseMethod&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;
Where:&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;extensionClass&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the extended class for which you want the local method to be inherited.&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;method&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the local enhancement method that you want to be inherited for &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;extensionClass&amp;lt;/var&amp;gt;.&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;baseClass&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The class that &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;extensionClass&amp;lt;/var&amp;gt; extends.&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;baseMethod&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The base method name, which is assumed to be the same as &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt;, the inherited name.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In the case of the preceding example, the appropriate &amp;lt;var&amp;gt;Local Inherit&amp;lt;/var&amp;gt; statement is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local inherit (myStringlist):bytes from stringlist&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Then the local &amp;lt;code&amp;gt;(stringlist):bytes&amp;lt;/code&amp;gt; method is invoked by:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%foolist:bytes&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
If you want to use a different name, say &amp;lt;code&amp;gt;characters&amp;lt;/code&amp;gt;,&lt;br /&gt;
for the inherited method (&amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt;, above), you specify:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local inherit (myStringlist):characters from stringlist bytes&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
And to invoke the method, you specify:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%foolist:characters&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;&lt;br /&gt;
You can only locally inherit local methods. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;persistVars&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Persistent and Shared local variables==&lt;br /&gt;
&amp;lt;!--Caution: &amp;lt;div&amp;gt; above--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Included in the &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; features introduced in Sirius Mods 7.3 is support for --&amp;gt;&lt;br /&gt;
These method-specific variables can be used only within a local method.&lt;br /&gt;
They have local scope:&lt;br /&gt;
they can only be accessed&lt;br /&gt;
inside the local method in which they are declared, and they&lt;br /&gt;
have no meaning outside that method.&lt;br /&gt;
 &lt;br /&gt;
A &#039;&#039;&#039;Persistent local variable&#039;&#039;&#039; is set&lt;br /&gt;
to its initial value every time the method&lt;br /&gt;
that contains the local method is invoked.&lt;br /&gt;
This unusual characteristic is elaborated further, below.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;Shared local variable&#039;&#039;&#039; is never reset to its initial value; it&lt;br /&gt;
maintains its&lt;br /&gt;
value over the entire request (everything between &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt;) regardless of where&lt;br /&gt;
it is contained.&lt;br /&gt;
 &lt;br /&gt;
A simple %variable in a local method is initialized (and stacked&lt;br /&gt;
as needed) every time the local method is entered.&lt;br /&gt;
A &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; local variable, however, is&lt;br /&gt;
initialized and stacked during entry to the &#039;&#039;context that contains&#039;&#039; the&lt;br /&gt;
local method that contains the variable.&lt;br /&gt;
This context may be&lt;br /&gt;
a method (local or not), a non-OO &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; complex subroutine, or a &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt; block.&lt;br /&gt;
 &lt;br /&gt;
For example,&lt;br /&gt;
when the &amp;lt;code&amp;gt;Sleep&amp;lt;/code&amp;gt; method below is called, &amp;lt;code&amp;gt;%timesSnored&amp;lt;/code&amp;gt; is initialized to 0:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class person&lt;br /&gt;
 ...&lt;br /&gt;
subroutine sleep&lt;br /&gt;
   ...&lt;br /&gt;
   local function snore is float&lt;br /&gt;
      %timesSnored is float persistent&lt;br /&gt;
      %consecutive is float&lt;br /&gt;
      ...&lt;br /&gt;
      %timesSnored = %timesSnored + 1&lt;br /&gt;
      return %timesSnored&lt;br /&gt;
   end function&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
If &amp;lt;code&amp;gt;Snore&amp;lt;/code&amp;gt; is called:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%timesSnored&amp;lt;/code&amp;gt; is &#039;&#039;&#039;not&#039;&#039;&#039; initialized.&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;code&amp;gt;Sleep&amp;lt;/code&amp;gt; method is &#039;&#039;&#039;not&#039;&#039;&#039; initialized (that would&lt;br /&gt;
make it useless for counting snores).&lt;br /&gt;
&amp;lt;li&amp;gt;Simple local variable &amp;lt;code&amp;gt;%consecutive&amp;lt;/code&amp;gt; &#039;&#039;&#039;is&#039;&#039;&#039; initialized.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
If &amp;lt;code&amp;gt;Sleep&amp;lt;/code&amp;gt; is called recursively, however, the current value of &amp;lt;code&amp;gt;%timesSnored&amp;lt;/code&amp;gt;&lt;br /&gt;
is stacked, as are all simple variables within &amp;lt;code&amp;gt;Sleep&amp;lt;/code&amp;gt;&#039;s context.&lt;br /&gt;
They are then restored upon the return from the recursive call.&lt;br /&gt;
 &lt;br /&gt;
If you do want a local variable to persist over recursion, you declare it&lt;br /&gt;
a &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; variable, and like a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; %variable, it will never be&lt;br /&gt;
reinitialized or stacked:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function snore is float&lt;br /&gt;
   %timesSnored is float shared&lt;br /&gt;
   ...&lt;br /&gt;
   %timesSnored = %timesSnored + 1&lt;br /&gt;
   return %timesSnored&lt;br /&gt;
end function&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;&lt;br /&gt;
If the code that contains the local method that contains a &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variable&lt;br /&gt;
is the &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt; block or a complex subroutine, no variable value re-initialization occurs &amp;amp;mdash; in this case,&lt;br /&gt;
there is no difference between a &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; local variable and a&lt;br /&gt;
&amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; local variable. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Syntax for Persistent or Shared===&lt;br /&gt;
The syntax for declaring a &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; local variable is:&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;%&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;literal&amp;quot;&amp;gt;Is &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;type&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;Persistent | Shared&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;
Where:&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;name&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the local variable.&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;type&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The variable&#039;s datatype definition.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;blockquote class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Notes:&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; keywords must be the last keywords on the %variable declaration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; local variables may be declared&lt;br /&gt;
inside a &amp;lt;var&amp;gt;Local Property&amp;lt;/var&amp;gt; block but outside the &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; blocks, as shown in the following example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local property concat is longstring&lt;br /&gt;
   %shadow is longstring persistent&lt;br /&gt;
   set&lt;br /&gt;
      %shadow = %shadow with %concat&lt;br /&gt;
   end set&lt;br /&gt;
   get&lt;br /&gt;
      return %shadow&lt;br /&gt;
   end get&lt;br /&gt;
end property&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prior to the introduction of &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variables,&lt;br /&gt;
only the &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; blocks were allowed inside a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; block.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Working with Persistent variables===&lt;br /&gt;
&amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variables provide a&lt;br /&gt;
way for a method to locally maintain some value that needs to be remembered&lt;br /&gt;
from call to call.&lt;br /&gt;
The following examples show how this capability can be used to&lt;br /&gt;
make local variables and properties interchangeable.&lt;br /&gt;
 &lt;br /&gt;
For example, suppose one subroutine locally manipulates &amp;lt;code&amp;gt;%balance&amp;lt;/code&amp;gt;,&lt;br /&gt;
and a local function &amp;lt;code&amp;gt;BalanceChange&amp;lt;/code&amp;gt; returns the change since the last time&lt;br /&gt;
you checked:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine calculate&lt;br /&gt;
    ...&lt;br /&gt;
    %balance is float&lt;br /&gt;
    ...&lt;br /&gt;
    local function balanceChange is float expose&lt;br /&gt;
       %lastBalance is float persistent&lt;br /&gt;
       %return is float&lt;br /&gt;
       %return = %balance - %lastBalance&lt;br /&gt;
       %lastBalance = %balance&lt;br /&gt;
       return %return&lt;br /&gt;
    end function&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variable &amp;lt;code&amp;gt;%lastBalance&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;balanceChange&amp;lt;/code&amp;gt; gets initialized to 0 whenever&lt;br /&gt;
&amp;lt;code&amp;gt;Calculate&amp;lt;/code&amp;gt; is entered, at the same time that &amp;lt;code&amp;gt;%balance&amp;lt;/code&amp;gt; gets initialized.&lt;br /&gt;
 &lt;br /&gt;
Now, suppose you want to change &amp;lt;code&amp;gt;%balance&amp;lt;/code&amp;gt;, as above,&lt;br /&gt;
into a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt;.&lt;br /&gt;
You can use &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variable &amp;lt;code&amp;gt;shadow&amp;lt;/code&amp;gt; to maintain the value of &amp;lt;code&amp;gt;%balance&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine calculate&lt;br /&gt;
   ...&lt;br /&gt;
   local property balance is float&lt;br /&gt;
      %shadow is float persistent&lt;br /&gt;
      get&lt;br /&gt;
         return %shadow&lt;br /&gt;
      end get&lt;br /&gt;
      set&lt;br /&gt;
         %shadow = %balance&lt;br /&gt;
      end set&lt;br /&gt;
   end property&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Once you have the local property definition above, then inside subroutine &amp;lt;code&amp;gt;Calculate&amp;lt;/code&amp;gt;,&lt;br /&gt;
references to the &amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt; property can simply use a percent sign instead of&lt;br /&gt;
using a &amp;lt;code&amp;gt;%(local)&amp;lt;/code&amp;gt; qualifier (introduced in [[#Using non-enhancement and recursive local methods|&amp;quot;Using non-enhancement and recursive local methods&amp;quot;]]).&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%balance = %balance + %adjustment&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Consequently, you can change a local variable to a property and vice versa&lt;br /&gt;
without affecting any of the code that uses the property.&lt;br /&gt;
 &lt;br /&gt;
Carrying this reversibilty concept further, you could&lt;br /&gt;
also readily change a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable to a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt;.&lt;br /&gt;
For example, to turn &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; into a property, you might do something&lt;br /&gt;
like the following:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class common&lt;br /&gt;
    public shared&lt;br /&gt;
       property foo is longstring&lt;br /&gt;
       ...&lt;br /&gt;
    end public shared&lt;br /&gt;
    ...&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where you want to access the property locally as &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt;, you specify&lt;br /&gt;
a [[#Local aliases|local alias]]:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local alias foo for (common):foo&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Then when you type &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; in that scope, you access the&lt;br /&gt;
property &amp;lt;code&amp;gt;(common):foo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Using Persistent versus exposing the local method===&lt;br /&gt;
A &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variable&lt;br /&gt;
maintains its value across subsequent invocations of the local method&lt;br /&gt;
that contains it, but only until the next time the container of that method&lt;br /&gt;
is called.&lt;br /&gt;
A &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; variable maintains its value for the duration of the request.&lt;br /&gt;
 &lt;br /&gt;
Consider the method called &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class labor&lt;br /&gt;
   public&lt;br /&gt;
      ...&lt;br /&gt;
      function monthlyPayment is float&lt;br /&gt;
      ...&lt;br /&gt;
   end public&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Suppose inside &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt; you want a local property to keep track&lt;br /&gt;
of the total payments, but which will never return a value larger than 2000.&lt;br /&gt;
The property might look like:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class labor&lt;br /&gt;
   ...&lt;br /&gt;
   function monthlyPayment is float&lt;br /&gt;
      ...&lt;br /&gt;
      local property amount is float&lt;br /&gt;
         %currentAmount is float persistent&lt;br /&gt;
         get&lt;br /&gt;
            if %currentAmount gt 2000 then&lt;br /&gt;
               return 2000&lt;br /&gt;
            end if&lt;br /&gt;
            return %currentAmount&lt;br /&gt;
         end get&lt;br /&gt;
         set&lt;br /&gt;
            %currentAmount = %amount&lt;br /&gt;
         end set&lt;br /&gt;
      end property&lt;br /&gt;
      ...&lt;br /&gt;
   end function&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Because &amp;lt;code&amp;gt;%currentAmount&amp;lt;/code&amp;gt; is &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt;, it will get set to 0 every time &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;&lt;br /&gt;
is entered.&lt;br /&gt;
If it was &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt;, its value would be preserved between invocations of&lt;br /&gt;
&amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;, which is not what is wanted here.&lt;br /&gt;
And if it was&lt;br /&gt;
a simple local variable inside &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt;, it would&lt;br /&gt;
get set to 0 every time &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt; was invoked.&lt;br /&gt;
 &lt;br /&gt;
Compare the solution above to the following alternative.&lt;br /&gt;
You can accomplish the same end if you make &amp;lt;code&amp;gt;%currentAmount&amp;lt;/code&amp;gt;&lt;br /&gt;
a simple variable inside of &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;, and if you make &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt;&lt;br /&gt;
an &amp;quot;exposed&amp;quot; method (introduced in [[#Using Defer and Expose|&amp;quot;Using Defer and Expose&amp;quot;]]):&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class labor&lt;br /&gt;
   ...&lt;br /&gt;
   function monthlyPayment is float&lt;br /&gt;
      ...&lt;br /&gt;
      %currentAmount is float&lt;br /&gt;
      ...&lt;br /&gt;
      local property amount is float exposed&lt;br /&gt;
         get&lt;br /&gt;
            if %currentAmount gt 2000 then&lt;br /&gt;
               return 2000&lt;br /&gt;
            end if&lt;br /&gt;
            return %currentAmount&lt;br /&gt;
         end get&lt;br /&gt;
         set&lt;br /&gt;
            %currentAmount = %amount&lt;br /&gt;
         end set&lt;br /&gt;
      end property&lt;br /&gt;
      ...&lt;br /&gt;
   end function&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
But this approach has weaknesses:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%currentAmount&amp;lt;/code&amp;gt; can&lt;br /&gt;
be set or retrieved throughout &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;, which may be inviting a problem.&lt;br /&gt;
&amp;lt;li&amp;gt;Making &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt; exposed opens the door to problems&lt;br /&gt;
or bugs caused by variables shared between &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The latter of these is not necessarily a weakness &amp;amp;mdash;&lt;br /&gt;
you might prefer that&lt;br /&gt;
&amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt; is able to see &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;&#039;s variables, or you might&lt;br /&gt;
want &amp;lt;code&amp;gt;%currentAmount&amp;lt;/code&amp;gt; to be manipulated in code outside of &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt;.&lt;br /&gt;
But &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; can occasionally be a superior way&lt;br /&gt;
to provide just the right level of isolation of a local variable.&lt;br /&gt;
&lt;br /&gt;
==Local classes, enumerations, and structures==&lt;br /&gt;
It may be advantageous in rare cases to define an entire class for use&lt;br /&gt;
for a local scope.&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; support for local tools &amp;lt;!-- introduced in &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3 --&amp;gt;&lt;br /&gt;
includes &#039;&#039;&#039;local classes&#039;&#039;&#039;, as well as for &#039;&#039;&#039;local enumerations&#039;&#039;&#039;,&lt;br /&gt;
and &#039;&#039;&#039;local structures&#039;&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
A local class is a class whose members and objects are available only&lt;br /&gt;
inside the scope within which their definition is contained.&lt;br /&gt;
For example, within the definition of a method in a class, you might&lt;br /&gt;
want to make use of a local class:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class myclass&lt;br /&gt;
   ...&lt;br /&gt;
  public&lt;br /&gt;
  function foobar is float&lt;br /&gt;
  end public&lt;br /&gt;
   ...&lt;br /&gt;
  function foobar is float&lt;br /&gt;
     ...&lt;br /&gt;
    &#039;&#039;&#039;local class mumble&#039;&#039;&#039;&lt;br /&gt;
      public&lt;br /&gt;
      subroutine spec5(%newval is float)&lt;br /&gt;
      end public&lt;br /&gt;
 &lt;br /&gt;
      subroutine spec5(%newval is float)&lt;br /&gt;
       ...&lt;br /&gt;
      end subroutine&lt;br /&gt;
    &#039;&#039;&#039;end class mumble&#039;&#039;&#039;&lt;br /&gt;
       ...&lt;br /&gt;
    call spec5(19)&lt;br /&gt;
     ...&lt;br /&gt;
  end function&lt;br /&gt;
   ...&lt;br /&gt;
end class myclass&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A local class block is no different from a normal class block (as described&lt;br /&gt;
in [[Classes and Objects|&amp;quot;Classes and Objects&amp;quot;]]) except that the class name must be preceded&lt;br /&gt;
by the keywords &amp;lt;var&amp;gt;Local Class&amp;lt;/var&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
You may define a local class in any scope in a program, including within&lt;br /&gt;
a local method and within the outermost scope (directly within &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt; and&lt;br /&gt;
&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt; statements).&lt;br /&gt;
A local class in the&lt;br /&gt;
outer scope is different from a normal class in that it can only be&lt;br /&gt;
referenced by outer scope code, simple&lt;br /&gt;
subroutines, and local &amp;quot;exposed&amp;quot; subroutines.&lt;br /&gt;
 &lt;br /&gt;
A local class &amp;quot;hides&amp;quot; any same-named class in the global scope.&lt;br /&gt;
That is, within the local scope,&lt;br /&gt;
local class member and variable names take precedence, and out-of-scope same-named&lt;br /&gt;
methods and variables cannot be accessed.&lt;br /&gt;
Similar hiding was discussed for variables in local methods (see [[#Using Defer and Expose|&amp;quot;Using Defer and Expose&amp;quot;]]),&lt;br /&gt;
but unlike local methods, which have a workaround for this hiding,&lt;br /&gt;
there is no way to unhide a hidden class.&lt;br /&gt;
&lt;br /&gt;
==Local structures and enumerations==&lt;br /&gt;
 Just as you can prepend the keyword &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; to a class block,&lt;br /&gt;
define the class,&lt;br /&gt;
then apply the class contents in the local scope, you can also&lt;br /&gt;
define a locally-scoped enumeration or a locally-scoped structure. &amp;lt;!-- as of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3. --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Within a method or complex subroutine, only such a local&lt;br /&gt;
enumeration or structure is allowed: the keyword &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt;&lt;br /&gt;
is required for any enumeration or structure block you declare&lt;br /&gt;
inside a method or complex subroutine.&lt;br /&gt;
 &lt;br /&gt;
The syntax of an enumeration block is described in&lt;br /&gt;
[[Enumerations#User Language enumerations|User Language enumerations]].&lt;br /&gt;
The syntax of a structure block is described in [[Structures]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;aliases&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Local aliases==&lt;br /&gt;
&amp;lt;!--Caution: &amp;lt;div&amp;gt; above--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In certain circumstances, you can improve code readability and possibly&lt;br /&gt;
coding efficiency by&lt;br /&gt;
mapping an alternative name to an existing method for a local scope.&lt;br /&gt;
You do this by declaring a &#039;&#039;&#039;local alias&#039;&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
For example, consider a case where you have a class named &amp;lt;code&amp;gt;Utility&amp;lt;/code&amp;gt; that&lt;br /&gt;
contains an enhancement method named &amp;lt;code&amp;gt;Shift&amp;lt;/code&amp;gt; that operates on strings:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class utility&lt;br /&gt;
  public shared&lt;br /&gt;
     function (string):shift(%number is float) is longstring&lt;br /&gt;
     ...&lt;br /&gt;
  end public shared&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Suppose that in some context in your program, you use many statements like these&lt;br /&gt;
to operate on objects that belong to another class:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%a = %b:(+utility)shift(1)&lt;br /&gt;
%c = %d:(+utility)shift(2)&lt;br /&gt;
%e = %f:(+utility)shift(3)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
As a way to eliminate the repetition of the qualifying classname,&lt;br /&gt;
you can define an alias:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local alias (string):shift for (+utility)shift&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Then the statements above that are in the same local scope as the alias statement&lt;br /&gt;
can be shortened to:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%a = %b:shift(1)&lt;br /&gt;
%c = %d:shift(2)&lt;br /&gt;
%e = %f:shift(3)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
An alternative way to accomplish the same economy with a little more effort&lt;br /&gt;
is to define a local function:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (string):shift(%number is float) is longstring&lt;br /&gt;
   return %this:(+utility)shift(%number)&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Although you can declare and use a local alias for system and user class methods,&lt;br /&gt;
they are probably most suited for [[Enhancement methods|enhancement]] methods.&lt;br /&gt;
Because of the potential confusion caused by aliases, you probably should&lt;br /&gt;
use them sparingly.&lt;br /&gt;
 &lt;br /&gt;
===Local alias declaration syntax===&lt;br /&gt;
Formally, the syntax for an alias declaration is:&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;Local Alias &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;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&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;term&amp;quot;&amp;gt;alias&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;For&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;literal&amp;quot;&amp;gt;(+&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;enhancingClass&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;) | (&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;containingClass&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&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;term&amp;quot;&amp;gt;method&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where:&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;class&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The class of the objects on which the actual method, &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt;, is defined to operate.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the alias is for an instance method, you must specify the class before the alias name. If for a shared, non-enhancement method, you do not specify a class before the alias name.  &amp;lt;/p&amp;gt;&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;alias&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the method alias. This name typically is the same as &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt;, but it does not have to be.&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;&amp;lt;var&amp;gt;+&amp;lt;/var&amp;gt;enhancingClass&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the class in which &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt; is a member. Specify this class if &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt; is an enhancement method.&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;containingClass&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the class in which &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt; is a member. Specify this class if &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt; is a shared method.&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;method&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the actual method for which the alias is to be used.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
 &lt;br /&gt;
The following series of examples demonstrates how to use&lt;br /&gt;
local aliases in a variety of contexts.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The following fragment shows an alias for an instance method&lt;br /&gt;
(&amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Count&amp;lt;/var&amp;gt;):&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local alias (stringlist):number for count&lt;br /&gt;
   ...&lt;br /&gt;
%sl is object stringlist&lt;br /&gt;
   ...&lt;br /&gt;
print %sl:number&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In the following example, local alias &amp;lt;code&amp;gt;Foolish&amp;lt;/code&amp;gt; is used for&lt;br /&gt;
public subroutine &amp;lt;code&amp;gt;Silly&amp;lt;/code&amp;gt; in class &amp;lt;code&amp;gt;Absurd&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class absurd&lt;br /&gt;
  ...&lt;br /&gt;
  public&lt;br /&gt;
      ...&lt;br /&gt;
     subroutine silly&lt;br /&gt;
      ...&lt;br /&gt;
  end public&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
local alias (absurd):foolish for silly&lt;br /&gt;
 ...&lt;br /&gt;
%whacky is object silly&lt;br /&gt;
 ...&lt;br /&gt;
%whacky:foolish&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In the following example, a local alias is used for&lt;br /&gt;
an enhancement method in class &amp;lt;code&amp;gt;Util&amp;lt;/code&amp;gt; for &amp;lt;var&amp;gt;Stringlists&amp;lt;/var&amp;gt;.&lt;br /&gt;
This is likely an atypical case where the local alias name&lt;br /&gt;
is &#039;&#039;not&#039;&#039; the same as the enhancement method name.&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class util&lt;br /&gt;
   ...&lt;br /&gt;
   public shared&lt;br /&gt;
      ...&lt;br /&gt;
      function (stringlist):hash is longstring&lt;br /&gt;
      ...&lt;br /&gt;
   end public shred&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
local alias (stringlist):digest for (+util)hash&lt;br /&gt;
 ...&lt;br /&gt;
%sl is object stringlist&lt;br /&gt;
 ...&lt;br /&gt;
print %sl:digest&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;li&amp;gt;As shown in this example for the &amp;lt;var&amp;gt;System&amp;lt;/var&amp;gt; class method &amp;lt;var&amp;gt;[[Arguments (System function)|Arguments]]&amp;lt;/var&amp;gt;,&lt;br /&gt;
a local alias statement for a non-enhancement, shared method must &#039;&#039;not&#039;&#039;&lt;br /&gt;
have a class name preceding the alias name:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local alias args for (system):arguments&lt;br /&gt;
 ...&lt;br /&gt;
printtext Input arguments: {%args}&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Note that a non-instance alias is simply accessed by the alias name preceded by&lt;br /&gt;
a percent sign (&amp;lt;code&amp;gt;%args&amp;lt;/code&amp;gt;) &amp;amp;mdash; just like a local non-instance method&lt;br /&gt;
(see [[#Using non-enhancement and recursive local methods|&amp;quot;Using non-enhancement and recursive local methods&amp;quot;]], for example).&lt;br /&gt;
The alternative access to this is to use the keyword &amp;lt;code&amp;gt;Local&amp;lt;/code&amp;gt;, as in: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;printtext Input arguments: {%(local):args}&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can also use the simple percent-sign access for an alias for a non-instance&lt;br /&gt;
user-defined method, as in the following:  &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class foobar&lt;br /&gt;
   ...&lt;br /&gt;
   public shared&lt;br /&gt;
      ...&lt;br /&gt;
      property mostFoo is float&lt;br /&gt;
      ...&lt;br /&gt;
   end public shared&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
local alias maxFoo for (foobar):mostFoo&lt;br /&gt;
 ...&lt;br /&gt;
%maxFoo = 77&lt;br /&gt;
 ...&lt;br /&gt;
print %maxFoo&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;li&amp;gt;You can also use a local alias to provide an alias for a hidden method.&lt;br /&gt;
For example, suppose your program has many &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;[[Add (Stringlist function)|Add]]&amp;lt;/var&amp;gt; calls in a local context,&lt;br /&gt;
and you are required to make the same modification to each of those &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; calls.&lt;br /&gt;
Rather than changing each &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; call &amp;quot;by hand,&amp;quot; a convenient solution is to&lt;br /&gt;
create a local &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; method that applies the modification:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):add(%what is longstring)  -&lt;br /&gt;
 is float&lt;br /&gt;
   ...&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To call the system &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; method from within the local &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; function,&lt;br /&gt;
you can use an alias like the following &amp;amp;mdash; otherwise an &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; call inside the&lt;br /&gt;
function is a recursive call to itself: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):add(%what is longstring)  -&lt;br /&gt;
 is float&lt;br /&gt;
   local alias (stringlist):realAdd for add&lt;br /&gt;
    ...&lt;br /&gt;
   return %this:realAdd(%what)&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Common methods and aliases==&lt;br /&gt;
&amp;lt;!-- As of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3, --&amp;gt;&lt;br /&gt;
You can define &#039;&#039;&#039;Common methods&#039;&#039;&#039; and &#039;&#039;&#039;Common aliases&#039;&#039;&#039;.&lt;br /&gt;
The only methods you can&lt;br /&gt;
declare as &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; are properties and subroutines.&lt;br /&gt;
The only &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; alias you can declare is for a &amp;lt;var&amp;gt;Shared Property&amp;lt;/var&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; properties and &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines are designed to ease the&lt;br /&gt;
migration of existing &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; code elements to comparable &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;&lt;br /&gt;
object-oriented constructs.&lt;br /&gt;
You can define&lt;br /&gt;
a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property, for example, that is largely interchangeable with a non-OO &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable.&lt;br /&gt;
Similarly, a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutine can be used interchangeably with a non-OO &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;&lt;br /&gt;
complex subroutine.&lt;br /&gt;
&amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; functions do not exist, because prior to &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;&lt;br /&gt;
there were no user-created &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;User Language&amp;lt;/var&amp;gt; functions (so no functions to migrate).&lt;br /&gt;
&lt;br /&gt;
===Declaring and invoking a Common method===&lt;br /&gt;
Like a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; method, a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; method is&lt;br /&gt;
not part of a class and&lt;br /&gt;
its contents are not visible to the containing code.&lt;br /&gt;
A &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; is only available&lt;br /&gt;
inside the scope within which its definition is contained,&lt;br /&gt;
but a &amp;lt;var&amp;gt;Common Subroutine&amp;lt;/var&amp;gt; (which must be at the outermost scope) is available throughout the request.&lt;br /&gt;
 &lt;br /&gt;
A &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; method does not allow a separate declaration block before it is defined;&lt;br /&gt;
its declaration always begins the method definition.&lt;br /&gt;
Its declaration syntax is like that for a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; method ([[#Defining and invoking a local method|Defining and invoking a local method]]).&lt;br /&gt;
&lt;br /&gt;
===Common method declaration syntax===&lt;br /&gt;
A &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; method is declared with the keyword &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;, followed by the&lt;br /&gt;
method type, followed by the method name and description:&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;Common &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodType methodName methodDesc&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where:&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;methodType&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The method type, which has the following syntax:&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;Subroutine | Property&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &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;methodName&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The method name, which can be any name that follows the rules for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; %variables, but it cannot be the same as a simple percent variable in the same scope.&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;methodDesc&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The method description, which has the same structure as the method descriptions for &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; methods:&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;literal&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;literal&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;term&amp;quot;&amp;gt;datatype&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;qualifiers&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;
An &amp;lt;var&amp;gt;Initial&amp;lt;/var&amp;gt; clause is not allowed. The qualifier &amp;lt;var&amp;gt;Defer&amp;lt;/var&amp;gt; is &#039;&#039;not&#039;&#039; allowed. The qualifier &amp;lt;var&amp;gt;Expose&amp;lt;/var&amp;gt; is allowed only for &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
An example of a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property declaration follows:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;common property foo is float&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; may be contained inside any scope in a request; a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt; must be contained in the outermost scope.&lt;br /&gt;
A &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; must be called inside the scope in which it is defined.&lt;br /&gt;
A &amp;lt;var&amp;gt;Common Subroutine&amp;lt;/var&amp;gt; may be called from any scope.&lt;br /&gt;
 &lt;br /&gt;
The way you invoke a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; method depends on whether the method&lt;br /&gt;
is a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; or a &amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt;, as described in [[#Using a Common Property|&amp;quot;Using a Common Property&amp;quot;]]&lt;br /&gt;
and [[#Using a Common Subroutine|&amp;quot;Using a Common Subroutine&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
===Using a Common Property===&lt;br /&gt;
The principle&lt;br /&gt;
reason for the existence of &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; properties and aliases is to enable a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;&lt;br /&gt;
variable declaration to be converted into a &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; declaration without&lt;br /&gt;
changing the code.&lt;br /&gt;
You can only declare a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property that has no parameters,&lt;br /&gt;
but unlike common subroutines, you can declare a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property&lt;br /&gt;
within any scope in a request.&lt;br /&gt;
 &lt;br /&gt;
As an example, consider the following &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property definition:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;common property notSmall is float&lt;br /&gt;
  %shadow  is float shared&lt;br /&gt;
  set&lt;br /&gt;
     if %notSmall gt 10 then&lt;br /&gt;
        %shadow = %notSmall&lt;br /&gt;
     else&lt;br /&gt;
        %shadow = 10&lt;br /&gt;
     end if&lt;br /&gt;
  end set&lt;br /&gt;
  get&lt;br /&gt;
     return %shadow&lt;br /&gt;
  end get&lt;br /&gt;
end property&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
To access this property, since it is not a member of a class,&lt;br /&gt;
you must declare as &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; within a scope&lt;br /&gt;
a variable with the same name as the property name:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%notSmall is common&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Declaring a same-named &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable is necessary&lt;br /&gt;
even in the scope in which the &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property is defined.&lt;br /&gt;
If you specify datatype attributes on the &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable declaration, they must&lt;br /&gt;
match the property datatype:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%notSmall is float common&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
If you are converting &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variables to properties,&lt;br /&gt;
the &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; definition block may well be in one&lt;br /&gt;
&amp;lt;var&amp;gt;Included&amp;lt;/var&amp;gt; procedure while the common variable declaration is in another.&lt;br /&gt;
Or you might&lt;br /&gt;
want a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable that is declared in some standard&lt;br /&gt;
&amp;lt;var&amp;gt;Include&amp;lt;/var&amp;gt; block to be a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; in a particular request.&lt;br /&gt;
You might just have the&lt;br /&gt;
&amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; block at the top of the request (after the &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;) and let the&lt;br /&gt;
&amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable be used wherever it is already declared.&lt;br /&gt;
 &lt;br /&gt;
For an additional example featuring &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; properties and variables,&lt;br /&gt;
see [[#Using Common aliases|&amp;quot;Using Common aliases&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
===Using a Common Subroutine===&lt;br /&gt;
Just as &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; properties enable a fairly straightforward&lt;br /&gt;
conversion of standard &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variables to properties, so &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines&lt;br /&gt;
simplify the conversion of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; non-OO complex subroutines to &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; OO subroutines.&lt;br /&gt;
Such a subroutine conversion is advantageous because,&lt;br /&gt;
without having to change the&lt;br /&gt;
invocation of a formerly complex, now &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;, subroutine, you gain&lt;br /&gt;
the benefits of object-oriented methods:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Automatic initialization of local variables.&lt;br /&gt;
&amp;lt;li&amp;gt;Optional and named parameters.&lt;br /&gt;
&amp;lt;li&amp;gt;Better recursion behavior.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Note however that unlike complex subroutines, common subroutines must be defined before they are called (or alternatively have an earlier declaration using the [[#Using Defer and Expose|defer]] keyword).&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; subroutines are tightly scoped and restricted to the scope in which&lt;br /&gt;
they are defined, they are not suited to the conversion task because&lt;br /&gt;
complex subroutines are available throughout the request, that is,&lt;br /&gt;
essentially common.&lt;br /&gt;
 &lt;br /&gt;
A &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt; is like a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt; except:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It is invoked like a complex subroutine:&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;Call &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subroutineName&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Note that &#039;&#039;no&#039;&#039; percent sign (&amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt;) precedes the subroutine name.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It may be contained only in the outermost (&amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt;) scope of a request; it&lt;br /&gt;
cannot be nested.&lt;br /&gt;
&amp;lt;li&amp;gt;It is in the same namespace as complex subroutines, so &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;&lt;br /&gt;
and complex subroutines may not have the same name.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Invoking a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; method that has the same name as a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutine does not&lt;br /&gt;
preempt (hide) the invocation of the subroutine, because the &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;&lt;br /&gt;
subroutine must be preceded by the &amp;lt;var&amp;gt;Call&amp;lt;/var&amp;gt; keyword.&lt;br /&gt;
This is true even if the &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; method is a subroutine.&lt;br /&gt;
 &lt;br /&gt;
For example, &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutine &amp;lt;code&amp;gt;Jiggle&amp;lt;/code&amp;gt; is&lt;br /&gt;
followed by a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; subroutine with the same name.&lt;br /&gt;
The &amp;lt;code&amp;gt;Call Jiggle&amp;lt;/code&amp;gt; statement will call the &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; &amp;lt;code&amp;gt;Jiggle&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;common subroutine jiggle&lt;br /&gt;
   ...&lt;br /&gt;
end subroutine&lt;br /&gt;
   ...&lt;br /&gt;
function wiggle is float&lt;br /&gt;
   local subroutine jiggle&lt;br /&gt;
      ...&lt;br /&gt;
   end subroutine jiggle&lt;br /&gt;
    ...&lt;br /&gt;
   call jiggle&lt;br /&gt;
    ...&lt;br /&gt;
end subroutine wiggle&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A &amp;lt;code&amp;gt;Call %jiggle&amp;lt;/code&amp;gt; statement will call the &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; &amp;lt;code&amp;gt;Jiggle&amp;lt;/code&amp;gt;,&lt;br /&gt;
as will &amp;lt;code&amp;gt;Call %(local):jiggle&amp;lt;/code&amp;gt; or&lt;br /&gt;
even &amp;lt;code&amp;gt;%(local):jiggle&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Common Expose==&lt;br /&gt;
 &lt;br /&gt;
You can easily replace simple subroutines with &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines.&lt;br /&gt;
Where your code calls a simple subroutine&lt;br /&gt;
from inside a complex subroutine or method, you can use&lt;br /&gt;
an &amp;quot;exposed&amp;quot; &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutine.&lt;br /&gt;
 &lt;br /&gt;
For example, suppose your site uses simple subroutines&lt;br /&gt;
containing the application code, like the following:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;TALLY: SUBROUTINE&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In the application code, you can change the way&lt;br /&gt;
the above subroutine is initially generated to this:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;common subroutine tally expose&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
end subroutine&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Your existing &amp;lt;code&amp;gt;CALL TALLY&amp;lt;/code&amp;gt; statements will subsequently&lt;br /&gt;
invoke the &amp;lt;code&amp;gt;tally&amp;lt;/code&amp;gt; method.&lt;br /&gt;
The keyword &amp;lt;var&amp;gt;Expose&amp;lt;/var&amp;gt; gives the &amp;lt;code&amp;gt;tally&amp;lt;/code&amp;gt; method&lt;br /&gt;
access to the variables in the request that are declared outside and&lt;br /&gt;
prior to &amp;lt;code&amp;gt;tally&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Exposed &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines are better than simple&lt;br /&gt;
subroutines, which essentially they replace.&lt;br /&gt;
The specific advantage of this is that you can formally differentiate between&lt;br /&gt;
those variables that have entire program scope versus those that are truly&lt;br /&gt;
local to the common subroutine.&lt;br /&gt;
&lt;br /&gt;
===Using Common aliases===&lt;br /&gt;
&amp;lt;!-- As of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3, --&amp;gt;&lt;br /&gt;
You can declare a &amp;lt;var&amp;gt;Common Alias&amp;lt;/var&amp;gt; for a shared, non-enhancement property.&lt;br /&gt;
The most likely use of this alias is to provide a property inside a class that&lt;br /&gt;
replaces a common variable.&lt;br /&gt;
This might be advantageous by providing access to private class variables&lt;br /&gt;
from within the property:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class util&lt;br /&gt;
   public shared&lt;br /&gt;
      ...&lt;br /&gt;
      property goofy is longstring&lt;br /&gt;
      ...&lt;br /&gt;
   end public shared&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
common alias pluto for (util):goofy&lt;br /&gt;
 ...&lt;br /&gt;
%pluto is common&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Common alias declaration syntax====&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;Common Alias&amp;lt;/var&amp;gt; statement is straightforward:&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;Common Alias &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;aliasName&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt; For (&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;):&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;sharedProperty&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where:&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;aliasName&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The name of the shared method alias.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;class&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The name of the class in which &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;sharedProperty&amp;lt;/var&amp;gt; is a member.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;sharedProperty&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The name of the &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; for which the alias is to be used.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The following example shows two common properties sharing&lt;br /&gt;
private data via a class.&lt;br /&gt;
In the example, you enforce a condition that the&lt;br /&gt;
request is cancelled if the sum of two common variables exceeds 100:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
class util&lt;br /&gt;
   public shared&lt;br /&gt;
      property foo is float&lt;br /&gt;
      property bar is float&lt;br /&gt;
   end public shared&lt;br /&gt;
   private shared&lt;br /&gt;
      variable shadowFoo is float&lt;br /&gt;
      variable shadowBar is float&lt;br /&gt;
   end private shared&lt;br /&gt;
   property foo is float&lt;br /&gt;
      get&lt;br /&gt;
         return %shadowFoo&lt;br /&gt;
      end get&lt;br /&gt;
      set&lt;br /&gt;
         assert (%foo + %shadowBar) le 100&lt;br /&gt;
         %shadowFoo = %foo&lt;br /&gt;
      end set&lt;br /&gt;
   end property&lt;br /&gt;
   property bar is float&lt;br /&gt;
      get&lt;br /&gt;
         return %shadowBar&lt;br /&gt;
      end get&lt;br /&gt;
      set&lt;br /&gt;
         assert (%bar + %shadowFoo) le 100&lt;br /&gt;
         %shadowBar = %bar&lt;br /&gt;
      end set&lt;br /&gt;
   end property&lt;br /&gt;
end class&lt;br /&gt;
 &lt;br /&gt;
common alias foo for (util):foo&lt;br /&gt;
common alias bar for (util):bar&lt;br /&gt;
 &lt;br /&gt;
%foo is common&lt;br /&gt;
%bar is common&lt;br /&gt;
 &lt;br /&gt;
%foo = 22&lt;br /&gt;
%bar = 33&lt;br /&gt;
printText {~} = {%foo}, {~} = {%bar}&lt;br /&gt;
 &lt;br /&gt;
%foo = 44&lt;br /&gt;
%bar = 55&lt;br /&gt;
printText {~} = {%foo}, {~} = {%bar}&lt;br /&gt;
 &lt;br /&gt;
%foo = 66&lt;br /&gt;
%bar = 77&lt;br /&gt;
printText {~} = {%foo}, {~} = {%bar}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The result is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;output&amp;quot;&amp;gt;%foo = 22, %bar = 33&lt;br /&gt;
%foo = 44, %bar = 55&lt;br /&gt;
&amp;amp;#42;**  1  CANCELLING REQUEST: MSIR.0491: Assert: line 17 ...&lt;br /&gt;
&amp;lt;/p&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;[[Classes and Objects]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[Global and session objects]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[Methods]]&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>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Local_and_Common_entities&amp;diff=78433</id>
		<title>Local and Common entities</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Local_and_Common_entities&amp;diff=78433"/>
		<updated>2015-07-23T04:03:58Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Using a Common Subroutine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many methods are useful in a wide variety of applications.&lt;br /&gt;
System methods usually fall into this category, as they are intended to&lt;br /&gt;
provide basic services that are useful in many applications.&lt;br /&gt;
Methods that are widely useful will usually be contained in a class,&lt;br /&gt;
often as &amp;lt;var&amp;gt;Public&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;Private&amp;lt;/var&amp;gt; methods, but sometimes as [[Enhancement methods|enhancement methods]],&lt;br /&gt;
and sometimes as non-enhancement shared methods.&lt;br /&gt;
 &lt;br /&gt;
On the other hand, some methods have only relatively local applicability.&lt;br /&gt;
That is, while useful in a specific application context, they are not likely&lt;br /&gt;
to be useful in other contexts.&lt;br /&gt;
The following are cases where using such essentially-local methods might be beneficial:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;As a substitute for a large block of code in the main line of application processing,&lt;br /&gt;
increasing code readability.&lt;br /&gt;
&amp;lt;li&amp;gt;As a container for application-specific code that is repeated exactly or almost&lt;br /&gt;
exactly several times in a block of code, yet&lt;br /&gt;
does not lend itself to a loop construct.&lt;br /&gt;
&amp;lt;li&amp;gt;As an alternative way to implement a locally recursive process.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
There are many other situations where locally applicable methods would be useful.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3 --&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; &#039;&#039;&#039;local methods&#039;&#039;&#039; facilitate the writing&lt;br /&gt;
of locally applicable methods. Local methods provide all the functionality of simple subroutines, and more:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;They can be nested inside other methods.&lt;br /&gt;
&amp;lt;li&amp;gt;They can have local variables.&lt;br /&gt;
&amp;lt;li&amp;gt;They can have access to containing context variables or not as one wishes.&lt;br /&gt;
&amp;lt;li&amp;gt;They have all the capabilities of method calls including optional and named&lt;br /&gt;
parameters and the ability to return values or even be settable (a property).&lt;br /&gt;
&amp;lt;li&amp;gt;They are invoked with object-oriented syntax.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Accompanying local methods are additional entities that have local scope:&lt;br /&gt;
&amp;lt;!-- as of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3: --&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Classes, enumerations, and structures have&lt;br /&gt;
[[#Local classes, enumerations, and structures|local counterparts]].&lt;br /&gt;
&amp;lt;li&amp;gt;[[#Local aliases|Local aliases]]&lt;br /&gt;
are a simplified way to call a non-local method in a local context.&lt;br /&gt;
&amp;lt;li&amp;gt;[[#Persistent and Shared local variables|Local variables]]&lt;br /&gt;
are variables that can be used only within a local method&lt;br /&gt;
but that have greater persistence than simple percent variables.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- Also as of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3, --&amp;gt;[[#Common methods and aliases|Common methods and aliases]] are variations of&lt;br /&gt;
local methods and aliases that are designed to be similar enough to standard&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; Common variables and complex subroutines to replace them in existing applications.&lt;br /&gt;
&lt;br /&gt;
==Scope and locality==&lt;br /&gt;
One important thing to understand about local methods is the concept of&lt;br /&gt;
&#039;&#039;&#039;scope&#039;&#039;&#039;.&lt;br /&gt;
A scope is a block of code whose variables are isolated from other scopes.&lt;br /&gt;
For example, the outermost scope in &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;: the block of code inside the &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt; block for a request, but not inside a method or complex subroutine, is one scope.&lt;br /&gt;
 &lt;br /&gt;
Each complex subroutine is another scope, and each method, yet another.&lt;br /&gt;
This means that a particular variable name, say, &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt;, can only&lt;br /&gt;
be declared once in a given scope, and that variable is distinct from an&lt;br /&gt;
identically named variable in another scope.&lt;br /&gt;
So, in the following example,&lt;br /&gt;
&amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; is a &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; object variable in the outermost scope, a &amp;lt;var&amp;gt;Unicode&amp;lt;/var&amp;gt; variable&lt;br /&gt;
in complex subroutine &amp;lt;code&amp;gt;WorkHarder&amp;lt;/code&amp;gt;, and a &amp;lt;var&amp;gt;Float&amp;lt;/var&amp;gt; variable in function &amp;lt;code&amp;gt;Cipher&amp;lt;/code&amp;gt; in class&lt;br /&gt;
&amp;lt;code&amp;gt;Neat&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;begin&lt;br /&gt;
  %foo    is object stringlist&lt;br /&gt;
  ...&lt;br /&gt;
  subroutine workHarder&lt;br /&gt;
     %foo    is unicode&lt;br /&gt;
     ...&lt;br /&gt;
  end subroutine&lt;br /&gt;
  ...&lt;br /&gt;
  class neat&lt;br /&gt;
     ...&lt;br /&gt;
     function cipher is float&lt;br /&gt;
        %foo    is float&lt;br /&gt;
        ...&lt;br /&gt;
     end function&lt;br /&gt;
     ...&lt;br /&gt;
  end class&lt;br /&gt;
  ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Because the outermost, complex subroutine, and method scopes are isolated, there is&lt;br /&gt;
no danger of confusion for the &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; variables in the preceding example.&lt;br /&gt;
In fact, there is no way to access the outermost scope &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; from the inside&lt;br /&gt;
of complex subroutine &amp;lt;code&amp;gt;WorkHarder&amp;lt;/code&amp;gt; or function &amp;lt;code&amp;gt;Cipher&amp;lt;/code&amp;gt;, even if no local &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; had been&lt;br /&gt;
defined in these scopes.&lt;br /&gt;
Scope applies to what are termed &#039;&#039;&#039;local variables&#039;&#039;&#039;, that is, variables&lt;br /&gt;
that are local to the scope.&lt;br /&gt;
 &lt;br /&gt;
Class variables are &#039;&#039;always&#039;&#039; accessed via an object variable of the class,&lt;br /&gt;
so they are not affected by local scoping.&lt;br /&gt;
That is, a variable in class Clever called Junk can only be accessed via an object&lt;br /&gt;
variable of class Clever.&lt;br /&gt;
So, if %smart is an object of class Clever, variable Junk could be accessed via&lt;br /&gt;
&amp;lt;code&amp;gt;%smart:junk&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Sometimes, the object variable is implicit.&lt;br /&gt;
For example, inside an instance (non-shared) method inside of class Clever, a&lt;br /&gt;
%junk would be interpreted as &amp;lt;code&amp;gt;%this:junk&amp;lt;/code&amp;gt; if no local variable called %junk were&lt;br /&gt;
defined.&lt;br /&gt;
Similarly, if function Piggledy on local object variable %higgledy produced a&lt;br /&gt;
Clever object, the Junk variable in that object could be accessed via&lt;br /&gt;
&amp;lt;code&amp;gt;%higgledy:piggledy:junk&amp;lt;/code&amp;gt;.&lt;br /&gt;
Again, the Clever class variable is implicit here.&lt;br /&gt;
 &lt;br /&gt;
Shared variables in a class are global in scope, that is, they maintain their&lt;br /&gt;
value and can be accessed from inside of any scope.&lt;br /&gt;
This can be done using the &amp;lt;code&amp;gt;(&amp;lt;classname&amp;gt;):&amp;lt;variable&amp;gt;&amp;lt;/code&amp;gt; syntax or&lt;br /&gt;
the &amp;lt;code&amp;gt;%&amp;lt;object&amp;gt;:&amp;lt;variable&amp;gt;&amp;lt;/code&amp;gt; syntax.&lt;br /&gt;
Because, the class distinguishes the variable from other identically named variables&lt;br /&gt;
in other scopes, there is no need to scope such variables: they can be&lt;br /&gt;
accessed from any scope inside a &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; request.&lt;br /&gt;
 &lt;br /&gt;
Of course, private variables in a class can only be accessed from methods inside&lt;br /&gt;
the class.&lt;br /&gt;
So, in some sense, a class is, itself, a scope where private variables in the&lt;br /&gt;
class might be accessed.&lt;br /&gt;
However, for the purposes of most discussion, scope will refer only to the&lt;br /&gt;
scope for local variables, so it will only refer to the outermost (&amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt;) scope,&lt;br /&gt;
complex subroutine scope, and method scope.&lt;br /&gt;
 &lt;br /&gt;
It is worth mentioning &#039;&#039;&#039;common variables&#039;&#039;&#039; with regard to scoping.&lt;br /&gt;
Common variables, as their name might suggest, can be accessed from many different&lt;br /&gt;
scopes.&lt;br /&gt;
However, they must be declared as common in each scope in which they are to be&lt;br /&gt;
accessed.&lt;br /&gt;
 &lt;br /&gt;
For example, to change the previous example slightly:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;begin&lt;br /&gt;
   %foo    is object stringlist common&lt;br /&gt;
   ...&lt;br /&gt;
   subroutine workHarder&lt;br /&gt;
      %foo    is unicode&lt;br /&gt;
      ...&lt;br /&gt;
   end subroutine&lt;br /&gt;
   ...&lt;br /&gt;
   class neat&lt;br /&gt;
      ...&lt;br /&gt;
      function cipher is float&lt;br /&gt;
         %foo    is object stringlist common&lt;br /&gt;
         ...&lt;br /&gt;
      end function&lt;br /&gt;
      ...&lt;br /&gt;
   end class&lt;br /&gt;
   ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In this example, the &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; variables in the outermost scope and in the scope&lt;br /&gt;
for method &amp;lt;code&amp;gt;Cipher&amp;lt;/code&amp;gt; in class &amp;lt;code&amp;gt;Neat&amp;lt;/code&amp;gt; reference the same &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; object variable.&lt;br /&gt;
On the other hand, &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; in the complex subroutine &amp;lt;code&amp;gt;WorkHarder&amp;lt;/code&amp;gt; is a local variable,&lt;br /&gt;
so the &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; common variable cannot be accessed in that scope.&lt;br /&gt;
==Defining and invoking a local method==&lt;br /&gt;
The local method facility lets you create methods that&lt;br /&gt;
are &#039;&#039;not&#039;&#039; part of a class and are only available&lt;br /&gt;
inside the scope within which their definition is contained.&lt;br /&gt;
A local method does not require a separate declaration block before it is defined.&lt;br /&gt;
Typically, a local method&#039;s declaration begins the method definition.&lt;br /&gt;
 &lt;br /&gt;
Local methods are declared with the keyword &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt;, followed by the&lt;br /&gt;
method type, followed by the method name and description:&lt;br /&gt;
===Local method declaration syntax===&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;Local &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodType methodName methodDesc&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where:&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;methodType&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The method type, which has the following syntax:&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;Subroutine | Function | Property&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The types of local method are like those of class methods:&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns no 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;&amp;lt;var&amp;gt;Function&amp;lt;/var&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns a value, but cannot be set to a 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;&amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Can return a value or be set to a value. &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/p&amp;gt;&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;methodName&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The method name, which can be any name that follows the rules for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; %variables, possibly preceded by the class that the method enhances (locally). However, like variable declarations inside of &amp;lt;var&amp;gt;Class&amp;lt;/var&amp;gt; blocks, the name does not start with the percent (&amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt;) sign.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In addition, the name cannot be the same as a simple percent variable in the same scope (though it can be the same as a class variable or method, as discussed in [[#Using Defer and Expose|&amp;quot;Using Defer and Expose&amp;quot;]]). &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The method name syntax is: &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;literal&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;className&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&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;term&amp;quot;&amp;gt;methodname&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt; &lt;br /&gt;
If a class name is not specified, the method is assumed to be a shared, non-enhancement local method.&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;methodDesc&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The method description, which has exactly the same structure as the method descriptions for class variables. That is, a local method has an optional parameter list which can contain required and optional, named and unnamed parameters, and their types. The parameter list is followed by a method result type (for &amp;lt;var&amp;gt;Functions&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Properties&amp;lt;/var&amp;gt;) and then possibly by further qualifiers.&lt;br /&gt;
&amp;lt;p&amp;gt; &lt;br /&gt;
The method description syntax is: &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;literal&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;literal&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;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;term&amp;quot;&amp;gt;datatype&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;qualifiers&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;While most qualifiers can be used for both local and class methods, some qualifiers (such as &amp;lt;var&amp;gt;Public&amp;lt;/var&amp;gt;) make no sense in local method declarations, so they are not allowed, while a few others, like &amp;lt;var&amp;gt;Expose&amp;lt;/var&amp;gt; (discussed later), only make sense for &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; methods. &amp;lt;/p&amp;gt;&lt;br /&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;
An example of a local function declaration follows:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (float):addAndMult(%what is float) is float&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Unlike class methods, local methods can and must be declared inside some other scope.&lt;br /&gt;
And unlike complex subroutines, local methods can be contained inside any scope,&lt;br /&gt;
not just the outermost scope.&lt;br /&gt;
 &lt;br /&gt;
Like simple variables, local methods, themselves, have scope.&lt;br /&gt;
That is, they can only be called inside the scope in which they are defined.&lt;br /&gt;
This is different from complex subroutines, which must be declared in the&lt;br /&gt;
outermost scope, but can be called from any scope.&lt;br /&gt;
 &lt;br /&gt;
In general, as in the following example, a local method declaration is followed&lt;br /&gt;
by the definition of the method (although as described in [[#Using Defer and Expose|&amp;quot;Using Defer and Expose&amp;quot;]],&lt;br /&gt;
you can declare a method and then define it later in the request if need be).&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):bytes is float&lt;br /&gt;
   %i     is float&lt;br /&gt;
   %bytes is float&lt;br /&gt;
   for %i from 1 to %this:count&lt;br /&gt;
      %bytes = %bytes + %this:itemLength(%i)&lt;br /&gt;
   end for&lt;br /&gt;
   return %bytes&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
When you invoke a local method (that operates on a specific object instance)&lt;br /&gt;
you do not qualify the method name with a classname.&lt;br /&gt;
The syntax for the invocation is simply:&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;object&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A different syntax is warrented for methods that do not operate&lt;br /&gt;
on a specific object instance,&lt;br /&gt;
as discussed in [[#Using non-enhancement and recursive local methods|&amp;quot;Using non-enhancement and recursive local methods&amp;quot;]].&lt;br /&gt;
 &lt;br /&gt;
The following request is a simple example that features a local method.&lt;br /&gt;
The local function in this program&lt;br /&gt;
calculates the number of bytes in all the items in a &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
local function (stringlist):bytes is float&lt;br /&gt;
   %i     is float&lt;br /&gt;
   %bytes is float&lt;br /&gt;
   for %i from 1 to %this:count&lt;br /&gt;
      %bytes = %bytes + %this:itemLength(%i)&lt;br /&gt;
   end for&lt;br /&gt;
   return %bytes&lt;br /&gt;
end function&lt;br /&gt;
 &lt;br /&gt;
%sl  is object stringlist&lt;br /&gt;
%sl = new&lt;br /&gt;
text to %sl&lt;br /&gt;
   The noise&lt;br /&gt;
   Of worldly fame is but a blast of wind,&lt;br /&gt;
   That blows from diverse points, and shifts its name,&lt;br /&gt;
   Shifting the point it blows from.&lt;br /&gt;
end text&lt;br /&gt;
 &lt;br /&gt;
printtext {~} = {%sl:bytes}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using Defer and Expose===&lt;br /&gt;
As described in the previous section,&lt;br /&gt;
a local method does not require a declaration separate from its definition.&lt;br /&gt;
However, you can do so in a situation where it is warranted&lt;br /&gt;
to declare a method before defining it (because method A&lt;br /&gt;
calls method B which calls method A).&lt;br /&gt;
In such a case, you specify a separate method declaration, append the&lt;br /&gt;
keyword &amp;lt;var&amp;gt;Defer&amp;lt;/var&amp;gt; to it, then repeat the declaration later in the&lt;br /&gt;
program as part of the method definition:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):bytes is float defer&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;amp;&#039;italic(other code)&lt;br /&gt;
 ...&lt;br /&gt;
local function (stringlist):bytes is float&lt;br /&gt;
   %i     is float&lt;br /&gt;
   %bytes is float&lt;br /&gt;
   for %i from 1 to %this:count&lt;br /&gt;
      %bytes = %bytes + %this:itemLength(%i)&lt;br /&gt;
   end for&lt;br /&gt;
   return %bytes&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A local method has its own scope and its variables are not visible to the containing&lt;br /&gt;
code.&lt;br /&gt;
Similarly, variables in the containing code are not visible to the local method&lt;br /&gt;
&amp;amp;mdash; unless the keyword &amp;lt;var&amp;gt;Expose&amp;lt;/var&amp;gt; is specified on the method declaration.&lt;br /&gt;
In the following example, the &amp;lt;code&amp;gt;Multiply&amp;lt;/code&amp;gt; local method references the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt;&lt;br /&gt;
variable in the containing code:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
%multiplier is float&lt;br /&gt;
 &lt;br /&gt;
local function (float):multiply is float expose&lt;br /&gt;
   return %multiplier * %this&lt;br /&gt;
end function&lt;br /&gt;
 &lt;br /&gt;
%multiplier = 1.5&lt;br /&gt;
printtext {~} = {17:multiply}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
When you specify &amp;lt;code&amp;gt;Expose&amp;lt;/code&amp;gt;, the %variables (and local methods)&lt;br /&gt;
that are exposed are&lt;br /&gt;
those in the containing context that are declared before the&lt;br /&gt;
method definition.&lt;br /&gt;
Labels, images, and screens are &#039;&#039;&#039;not&#039;&#039;&#039; exposed.&lt;br /&gt;
 &lt;br /&gt;
A percent variable inside an&lt;br /&gt;
exposed method &amp;quot;hides&amp;quot; a same-named variable in the exposed context.&lt;br /&gt;
In the following request,&lt;br /&gt;
the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt; inside the local &amp;lt;code&amp;gt;Multiply&amp;lt;/code&amp;gt; method is&lt;br /&gt;
the one that is used inside the method &amp;amp;mdash; not the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt; declared&lt;br /&gt;
in the exposed context and assigned later:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
%multiplier is float&lt;br /&gt;
 &lt;br /&gt;
local function (float):multiply is float expose&lt;br /&gt;
   %multiplier is float initial(1.2)&lt;br /&gt;
   return %multiplier * %this&lt;br /&gt;
end function&lt;br /&gt;
 &lt;br /&gt;
%multiplier = 1.5&lt;br /&gt;
printtext {~} = {17:multiply}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You are allowed to reference a hidden variable&lt;br /&gt;
before it is hidden, as in this example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
%multiplier is float&lt;br /&gt;
 &lt;br /&gt;
local function (float):multiply is float expose&lt;br /&gt;
   printText {~} = {%multiplier}&lt;br /&gt;
   %multiplier is float initial(1.2)&lt;br /&gt;
   printText {~} = {%multiplier}&lt;br /&gt;
   return %multiplier * %this&lt;br /&gt;
end function&lt;br /&gt;
 &lt;br /&gt;
%multiplier = 1.5&lt;br /&gt;
printtext {~} = {17:multiply}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The first &amp;lt;code&amp;gt;PrintText&amp;lt;/code&amp;gt; statement in the &amp;lt;code&amp;gt;Multiply&amp;lt;/code&amp;gt; method prints the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt;.&lt;br /&gt;
in the exposed context.&lt;br /&gt;
The second &amp;lt;code&amp;gt;PrintText&amp;lt;/code&amp;gt; statement prints the &amp;lt;code&amp;gt;%multiplier&amp;lt;/code&amp;gt; declared in the &amp;lt;code&amp;gt;Multiply&amp;lt;/code&amp;gt; method.&lt;br /&gt;
 &lt;br /&gt;
While the value of this tactic in a small local method like the one above&lt;br /&gt;
may be questionable, it might be useful in a larger local method.&lt;br /&gt;
You might want to access a containing context&#039;s&lt;br /&gt;
data after writing a great deal of code that uses the same variable name internally&lt;br /&gt;
for something else.&lt;br /&gt;
 &lt;br /&gt;
Local methods that expose the containing context are nestable.&lt;br /&gt;
Consider the following fragment:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
   ...&lt;br /&gt;
   local subroutine (stringlist):a expose&lt;br /&gt;
      ...&lt;br /&gt;
      local subroutine (stringlist):b&lt;br /&gt;
         ...&lt;br /&gt;
         local subroutine (stringlist):c expose&lt;br /&gt;
            ...&lt;br /&gt;
            local subroutine (stringlist):d expose&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In this example, method &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; can access the outermost scope&#039;s variables.&lt;br /&gt;
Neither methods &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, nor &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; can access the outermost scope&#039;s variables,&lt;br /&gt;
nor can they access method &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;&#039;s because method &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; is not exposed.&lt;br /&gt;
Methods &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; can both access method &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;&#039;s variables, and method &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; can access method &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;&#039;s.&lt;br /&gt;
Probably this level of nesting will be quite rare.&lt;br /&gt;
&lt;br /&gt;
===Using non-enhancement and recursive local methods===&lt;br /&gt;
In all the examples in the preceding subsection, the local methods are&lt;br /&gt;
enhancement methods, which is likely to be the most common type of local method.&lt;br /&gt;
Local methods can enhance intrinsic, system, or user-defined classes.&lt;br /&gt;
You can also define a non-enhancement local method.&lt;br /&gt;
 &lt;br /&gt;
If you define a non-enhancement local method, you can&lt;br /&gt;
invoke it in either of two ways:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;With &amp;lt;code&amp;gt;%(local):&amp;lt;/code&amp;gt;, the syntax for invoking a [[Notation conventions for methods#Shared members|shared]] method with&lt;br /&gt;
the term &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; in parentheses instead of a class name.&lt;br /&gt;
&amp;lt;li&amp;gt;With simply a percent sign (&amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt;) preceding the method name.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Here is an example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
%a is float&lt;br /&gt;
%b is longstring&lt;br /&gt;
%c is fixed dp 2&lt;br /&gt;
 &lt;br /&gt;
local subroutine debug expose&lt;br /&gt;
   printText {~} = {%a}&lt;br /&gt;
   printText {~} = &#039;{%b}&#039;&lt;br /&gt;
   printText {~} = {%c}&lt;br /&gt;
end subroutine&lt;br /&gt;
 &lt;br /&gt;
%(local):debug&lt;br /&gt;
 &lt;br /&gt;
%a = 12&lt;br /&gt;
%b = &#039;north&#039;&lt;br /&gt;
%c = .99&lt;br /&gt;
 &lt;br /&gt;
call %debug&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The result is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%a = 0&lt;br /&gt;
%b = &#039;&#039;&lt;br /&gt;
%c = 0.00&lt;br /&gt;
%a = 12&lt;br /&gt;
%b = &#039;north&#039;&lt;br /&gt;
%c = 0.99&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;For a local subroutine as in the example above, the keyword &amp;lt;var&amp;gt;Call&amp;lt;/var&amp;gt;&lt;br /&gt;
is also legal before &amp;lt;code&amp;gt;%(local):&amp;lt;/code&amp;gt;, but it is required if using just&lt;br /&gt;
the &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The name &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; is not allowed as a class name.&lt;br /&gt;
&amp;lt;!-- as of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As stated earlier, the name of a local method cannot be the same as a percent variable&lt;br /&gt;
in the same scope.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
As a special case to support recursive local methods,&lt;br /&gt;
unexposed methods are allowed to call themselves.&lt;br /&gt;
The following definition is valid:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (float):factorial is float&lt;br /&gt;
   if %this le 1 then&lt;br /&gt;
      return %this&lt;br /&gt;
   end if&lt;br /&gt;
   return %this * (%this - 1):factorial&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using locally inherited methods===&lt;br /&gt;
Like enhancement methods, local methods &#039;&#039;never&#039;&#039; automatically apply&lt;br /&gt;
to any extension classes.&lt;br /&gt;
For example, if the declaration of local function &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):bytes is float&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Simply applying &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; to object &amp;lt;code&amp;gt;%foolist&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;%foolist:bytes&amp;lt;/code&amp;gt;)&lt;br /&gt;
is &#039;&#039;not&#039;&#039; allowed if&lt;br /&gt;
object &amp;lt;code&amp;gt;%foolist&amp;lt;/code&amp;gt; is of class &amp;lt;code&amp;gt;MyStringlist&amp;lt;/code&amp;gt; which extends &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt;.&lt;br /&gt;
But the following &#039;&#039;is valid&#039;&#039;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%foolist:(stringlist)bytes&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You can use &amp;lt;code&amp;gt;%foolist:bytes&amp;lt;/code&amp;gt;,&lt;br /&gt;
however, if you first specify an explicit &amp;lt;var&amp;gt;Local Inherit&amp;lt;/var&amp;gt; statement, as described below.&lt;br /&gt;
&lt;br /&gt;
====Local Inherit statement syntax====&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;Local Inherit (&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;extensionClass&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;)::&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;From &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;baseclass&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;baseMethod&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;
Where:&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;extensionClass&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the extended class for which you want the local method to be inherited.&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;method&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the local enhancement method that you want to be inherited for &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;extensionClass&amp;lt;/var&amp;gt;.&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;baseClass&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The class that &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;extensionClass&amp;lt;/var&amp;gt; extends.&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;baseMethod&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The base method name, which is assumed to be the same as &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt;, the inherited name.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In the case of the preceding example, the appropriate &amp;lt;var&amp;gt;Local Inherit&amp;lt;/var&amp;gt; statement is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local inherit (myStringlist):bytes from stringlist&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Then the local &amp;lt;code&amp;gt;(stringlist):bytes&amp;lt;/code&amp;gt; method is invoked by:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%foolist:bytes&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
If you want to use a different name, say &amp;lt;code&amp;gt;characters&amp;lt;/code&amp;gt;,&lt;br /&gt;
for the inherited method (&amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt;, above), you specify:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local inherit (myStringlist):characters from stringlist bytes&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
And to invoke the method, you specify:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%foolist:characters&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;&lt;br /&gt;
You can only locally inherit local methods. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;persistVars&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Persistent and Shared local variables==&lt;br /&gt;
&amp;lt;!--Caution: &amp;lt;div&amp;gt; above--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Included in the &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; features introduced in Sirius Mods 7.3 is support for --&amp;gt;&lt;br /&gt;
These method-specific variables can be used only within a local method.&lt;br /&gt;
They have local scope:&lt;br /&gt;
they can only be accessed&lt;br /&gt;
inside the local method in which they are declared, and they&lt;br /&gt;
have no meaning outside that method.&lt;br /&gt;
 &lt;br /&gt;
A &#039;&#039;&#039;Persistent local variable&#039;&#039;&#039; is set&lt;br /&gt;
to its initial value every time the method&lt;br /&gt;
that contains the local method is invoked.&lt;br /&gt;
This unusual characteristic is elaborated further, below.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;Shared local variable&#039;&#039;&#039; is never reset to its initial value; it&lt;br /&gt;
maintains its&lt;br /&gt;
value over the entire request (everything between &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt;) regardless of where&lt;br /&gt;
it is contained.&lt;br /&gt;
 &lt;br /&gt;
A simple %variable in a local method is initialized (and stacked&lt;br /&gt;
as needed) every time the local method is entered.&lt;br /&gt;
A &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; local variable, however, is&lt;br /&gt;
initialized and stacked during entry to the &#039;&#039;context that contains&#039;&#039; the&lt;br /&gt;
local method that contains the variable.&lt;br /&gt;
This context may be&lt;br /&gt;
a method (local or not), a non-OO &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; complex subroutine, or a &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt; block.&lt;br /&gt;
 &lt;br /&gt;
For example,&lt;br /&gt;
when the &amp;lt;code&amp;gt;Sleep&amp;lt;/code&amp;gt; method below is called, &amp;lt;code&amp;gt;%timesSnored&amp;lt;/code&amp;gt; is initialized to 0:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class person&lt;br /&gt;
 ...&lt;br /&gt;
subroutine sleep&lt;br /&gt;
   ...&lt;br /&gt;
   local function snore is float&lt;br /&gt;
      %timesSnored is float persistent&lt;br /&gt;
      %consecutive is float&lt;br /&gt;
      ...&lt;br /&gt;
      %timesSnored = %timesSnored + 1&lt;br /&gt;
      return %timesSnored&lt;br /&gt;
   end function&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
If &amp;lt;code&amp;gt;Snore&amp;lt;/code&amp;gt; is called:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%timesSnored&amp;lt;/code&amp;gt; is &#039;&#039;&#039;not&#039;&#039;&#039; initialized.&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;code&amp;gt;Sleep&amp;lt;/code&amp;gt; method is &#039;&#039;&#039;not&#039;&#039;&#039; initialized (that would&lt;br /&gt;
make it useless for counting snores).&lt;br /&gt;
&amp;lt;li&amp;gt;Simple local variable &amp;lt;code&amp;gt;%consecutive&amp;lt;/code&amp;gt; &#039;&#039;&#039;is&#039;&#039;&#039; initialized.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
If &amp;lt;code&amp;gt;Sleep&amp;lt;/code&amp;gt; is called recursively, however, the current value of &amp;lt;code&amp;gt;%timesSnored&amp;lt;/code&amp;gt;&lt;br /&gt;
is stacked, as are all simple variables within &amp;lt;code&amp;gt;Sleep&amp;lt;/code&amp;gt;&#039;s context.&lt;br /&gt;
They are then restored upon the return from the recursive call.&lt;br /&gt;
 &lt;br /&gt;
If you do want a local variable to persist over recursion, you declare it&lt;br /&gt;
a &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; variable, and like a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; %variable, it will never be&lt;br /&gt;
reinitialized or stacked:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function snore is float&lt;br /&gt;
   %timesSnored is float shared&lt;br /&gt;
   ...&lt;br /&gt;
   %timesSnored = %timesSnored + 1&lt;br /&gt;
   return %timesSnored&lt;br /&gt;
end function&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;&lt;br /&gt;
If the code that contains the local method that contains a &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variable&lt;br /&gt;
is the &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt; block or a complex subroutine, no variable value re-initialization occurs &amp;amp;mdash; in this case,&lt;br /&gt;
there is no difference between a &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; local variable and a&lt;br /&gt;
&amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; local variable. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Syntax for Persistent or Shared===&lt;br /&gt;
The syntax for declaring a &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; local variable is:&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;%&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;literal&amp;quot;&amp;gt;Is &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;type&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;Persistent | Shared&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;
Where:&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;name&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the local variable.&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;type&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The variable&#039;s datatype definition.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;blockquote class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Notes:&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; keywords must be the last keywords on the %variable declaration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; local variables may be declared&lt;br /&gt;
inside a &amp;lt;var&amp;gt;Local Property&amp;lt;/var&amp;gt; block but outside the &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; blocks, as shown in the following example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local property concat is longstring&lt;br /&gt;
   %shadow is longstring persistent&lt;br /&gt;
   set&lt;br /&gt;
      %shadow = %shadow with %concat&lt;br /&gt;
   end set&lt;br /&gt;
   get&lt;br /&gt;
      return %shadow&lt;br /&gt;
   end get&lt;br /&gt;
end property&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prior to the introduction of &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variables,&lt;br /&gt;
only the &amp;lt;var&amp;gt;Get&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;Set&amp;lt;/var&amp;gt; blocks were allowed inside a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; block.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Working with Persistent variables===&lt;br /&gt;
&amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variables provide a&lt;br /&gt;
way for a method to locally maintain some value that needs to be remembered&lt;br /&gt;
from call to call.&lt;br /&gt;
The following examples show how this capability can be used to&lt;br /&gt;
make local variables and properties interchangeable.&lt;br /&gt;
 &lt;br /&gt;
For example, suppose one subroutine locally manipulates &amp;lt;code&amp;gt;%balance&amp;lt;/code&amp;gt;,&lt;br /&gt;
and a local function &amp;lt;code&amp;gt;BalanceChange&amp;lt;/code&amp;gt; returns the change since the last time&lt;br /&gt;
you checked:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine calculate&lt;br /&gt;
    ...&lt;br /&gt;
    %balance is float&lt;br /&gt;
    ...&lt;br /&gt;
    local function balanceChange is float expose&lt;br /&gt;
       %lastBalance is float persistent&lt;br /&gt;
       %return is float&lt;br /&gt;
       %return = %balance - %lastBalance&lt;br /&gt;
       %lastBalance = %balance&lt;br /&gt;
       return %return&lt;br /&gt;
    end function&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variable &amp;lt;code&amp;gt;%lastBalance&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;balanceChange&amp;lt;/code&amp;gt; gets initialized to 0 whenever&lt;br /&gt;
&amp;lt;code&amp;gt;Calculate&amp;lt;/code&amp;gt; is entered, at the same time that &amp;lt;code&amp;gt;%balance&amp;lt;/code&amp;gt; gets initialized.&lt;br /&gt;
 &lt;br /&gt;
Now, suppose you want to change &amp;lt;code&amp;gt;%balance&amp;lt;/code&amp;gt;, as above,&lt;br /&gt;
into a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt;.&lt;br /&gt;
You can use &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variable &amp;lt;code&amp;gt;shadow&amp;lt;/code&amp;gt; to maintain the value of &amp;lt;code&amp;gt;%balance&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;subroutine calculate&lt;br /&gt;
   ...&lt;br /&gt;
   local property balance is float&lt;br /&gt;
      %shadow is float persistent&lt;br /&gt;
      get&lt;br /&gt;
         return %shadow&lt;br /&gt;
      end get&lt;br /&gt;
      set&lt;br /&gt;
         %shadow = %balance&lt;br /&gt;
      end set&lt;br /&gt;
   end property&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Once you have the local property definition above, then inside subroutine &amp;lt;code&amp;gt;Calculate&amp;lt;/code&amp;gt;,&lt;br /&gt;
references to the &amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt; property can simply use a percent sign instead of&lt;br /&gt;
using a &amp;lt;code&amp;gt;%(local)&amp;lt;/code&amp;gt; qualifier (introduced in [[#Using non-enhancement and recursive local methods|&amp;quot;Using non-enhancement and recursive local methods&amp;quot;]]).&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%balance = %balance + %adjustment&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Consequently, you can change a local variable to a property and vice versa&lt;br /&gt;
without affecting any of the code that uses the property.&lt;br /&gt;
 &lt;br /&gt;
Carrying this reversibilty concept further, you could&lt;br /&gt;
also readily change a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable to a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt;.&lt;br /&gt;
For example, to turn &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; into a property, you might do something&lt;br /&gt;
like the following:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class common&lt;br /&gt;
    public shared&lt;br /&gt;
       property foo is longstring&lt;br /&gt;
       ...&lt;br /&gt;
    end public shared&lt;br /&gt;
    ...&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where you want to access the property locally as &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt;, you specify&lt;br /&gt;
a [[#Local aliases|local alias]]:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local alias foo for (common):foo&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Then when you type &amp;lt;code&amp;gt;%foo&amp;lt;/code&amp;gt; in that scope, you access the&lt;br /&gt;
property &amp;lt;code&amp;gt;(common):foo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Using Persistent versus exposing the local method===&lt;br /&gt;
A &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; variable&lt;br /&gt;
maintains its value across subsequent invocations of the local method&lt;br /&gt;
that contains it, but only until the next time the container of that method&lt;br /&gt;
is called.&lt;br /&gt;
A &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt; variable maintains its value for the duration of the request.&lt;br /&gt;
 &lt;br /&gt;
Consider the method called &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class labor&lt;br /&gt;
   public&lt;br /&gt;
      ...&lt;br /&gt;
      function monthlyPayment is float&lt;br /&gt;
      ...&lt;br /&gt;
   end public&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Suppose inside &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt; you want a local property to keep track&lt;br /&gt;
of the total payments, but which will never return a value larger than 2000.&lt;br /&gt;
The property might look like:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class labor&lt;br /&gt;
   ...&lt;br /&gt;
   function monthlyPayment is float&lt;br /&gt;
      ...&lt;br /&gt;
      local property amount is float&lt;br /&gt;
         %currentAmount is float persistent&lt;br /&gt;
         get&lt;br /&gt;
            if %currentAmount gt 2000 then&lt;br /&gt;
               return 2000&lt;br /&gt;
            end if&lt;br /&gt;
            return %currentAmount&lt;br /&gt;
         end get&lt;br /&gt;
         set&lt;br /&gt;
            %currentAmount = %amount&lt;br /&gt;
         end set&lt;br /&gt;
      end property&lt;br /&gt;
      ...&lt;br /&gt;
   end function&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Because &amp;lt;code&amp;gt;%currentAmount&amp;lt;/code&amp;gt; is &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt;, it will get set to 0 every time &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;&lt;br /&gt;
is entered.&lt;br /&gt;
If it was &amp;lt;var&amp;gt;Shared&amp;lt;/var&amp;gt;, its value would be preserved between invocations of&lt;br /&gt;
&amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;, which is not what is wanted here.&lt;br /&gt;
And if it was&lt;br /&gt;
a simple local variable inside &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt;, it would&lt;br /&gt;
get set to 0 every time &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt; was invoked.&lt;br /&gt;
 &lt;br /&gt;
Compare the solution above to the following alternative.&lt;br /&gt;
You can accomplish the same end if you make &amp;lt;code&amp;gt;%currentAmount&amp;lt;/code&amp;gt;&lt;br /&gt;
a simple variable inside of &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;, and if you make &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt;&lt;br /&gt;
an &amp;quot;exposed&amp;quot; method (introduced in [[#Using Defer and Expose|&amp;quot;Using Defer and Expose&amp;quot;]]):&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class labor&lt;br /&gt;
   ...&lt;br /&gt;
   function monthlyPayment is float&lt;br /&gt;
      ...&lt;br /&gt;
      %currentAmount is float&lt;br /&gt;
      ...&lt;br /&gt;
      local property amount is float exposed&lt;br /&gt;
         get&lt;br /&gt;
            if %currentAmount gt 2000 then&lt;br /&gt;
               return 2000&lt;br /&gt;
            end if&lt;br /&gt;
            return %currentAmount&lt;br /&gt;
         end get&lt;br /&gt;
         set&lt;br /&gt;
            %currentAmount = %amount&lt;br /&gt;
         end set&lt;br /&gt;
      end property&lt;br /&gt;
      ...&lt;br /&gt;
   end function&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
But this approach has weaknesses:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%currentAmount&amp;lt;/code&amp;gt; can&lt;br /&gt;
be set or retrieved throughout &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;, which may be inviting a problem.&lt;br /&gt;
&amp;lt;li&amp;gt;Making &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt; exposed opens the door to problems&lt;br /&gt;
or bugs caused by variables shared between &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The latter of these is not necessarily a weakness &amp;amp;mdash;&lt;br /&gt;
you might prefer that&lt;br /&gt;
&amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt; is able to see &amp;lt;code&amp;gt;MonthlyPayment&amp;lt;/code&amp;gt;&#039;s variables, or you might&lt;br /&gt;
want &amp;lt;code&amp;gt;%currentAmount&amp;lt;/code&amp;gt; to be manipulated in code outside of &amp;lt;code&amp;gt;Amount&amp;lt;/code&amp;gt;.&lt;br /&gt;
But &amp;lt;var&amp;gt;Persistent&amp;lt;/var&amp;gt; can occasionally be a superior way&lt;br /&gt;
to provide just the right level of isolation of a local variable.&lt;br /&gt;
&lt;br /&gt;
==Local classes, enumerations, and structures==&lt;br /&gt;
It may be advantageous in rare cases to define an entire class for use&lt;br /&gt;
for a local scope.&lt;br /&gt;
&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; support for local tools &amp;lt;!-- introduced in &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3 --&amp;gt;&lt;br /&gt;
includes &#039;&#039;&#039;local classes&#039;&#039;&#039;, as well as for &#039;&#039;&#039;local enumerations&#039;&#039;&#039;,&lt;br /&gt;
and &#039;&#039;&#039;local structures&#039;&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
A local class is a class whose members and objects are available only&lt;br /&gt;
inside the scope within which their definition is contained.&lt;br /&gt;
For example, within the definition of a method in a class, you might&lt;br /&gt;
want to make use of a local class:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class myclass&lt;br /&gt;
   ...&lt;br /&gt;
  public&lt;br /&gt;
  function foobar is float&lt;br /&gt;
  end public&lt;br /&gt;
   ...&lt;br /&gt;
  function foobar is float&lt;br /&gt;
     ...&lt;br /&gt;
    &#039;&#039;&#039;local class mumble&#039;&#039;&#039;&lt;br /&gt;
      public&lt;br /&gt;
      subroutine spec5(%newval is float)&lt;br /&gt;
      end public&lt;br /&gt;
 &lt;br /&gt;
      subroutine spec5(%newval is float)&lt;br /&gt;
       ...&lt;br /&gt;
      end subroutine&lt;br /&gt;
    &#039;&#039;&#039;end class mumble&#039;&#039;&#039;&lt;br /&gt;
       ...&lt;br /&gt;
    call spec5(19)&lt;br /&gt;
     ...&lt;br /&gt;
  end function&lt;br /&gt;
   ...&lt;br /&gt;
end class myclass&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A local class block is no different from a normal class block (as described&lt;br /&gt;
in [[Classes and Objects|&amp;quot;Classes and Objects&amp;quot;]]) except that the class name must be preceded&lt;br /&gt;
by the keywords &amp;lt;var&amp;gt;Local Class&amp;lt;/var&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
You may define a local class in any scope in a program, including within&lt;br /&gt;
a local method and within the outermost scope (directly within &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt; and&lt;br /&gt;
&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt; statements).&lt;br /&gt;
A local class in the&lt;br /&gt;
outer scope is different from a normal class in that it can only be&lt;br /&gt;
referenced by outer scope code, simple&lt;br /&gt;
subroutines, and local &amp;quot;exposed&amp;quot; subroutines.&lt;br /&gt;
 &lt;br /&gt;
A local class &amp;quot;hides&amp;quot; any same-named class in the global scope.&lt;br /&gt;
That is, within the local scope,&lt;br /&gt;
local class member and variable names take precedence, and out-of-scope same-named&lt;br /&gt;
methods and variables cannot be accessed.&lt;br /&gt;
Similar hiding was discussed for variables in local methods (see [[#Using Defer and Expose|&amp;quot;Using Defer and Expose&amp;quot;]]),&lt;br /&gt;
but unlike local methods, which have a workaround for this hiding,&lt;br /&gt;
there is no way to unhide a hidden class.&lt;br /&gt;
&lt;br /&gt;
==Local structures and enumerations==&lt;br /&gt;
 Just as you can prepend the keyword &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; to a class block,&lt;br /&gt;
define the class,&lt;br /&gt;
then apply the class contents in the local scope, you can also&lt;br /&gt;
define a locally-scoped enumeration or a locally-scoped structure. &amp;lt;!-- as of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3. --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Within a method or complex subroutine, only such a local&lt;br /&gt;
enumeration or structure is allowed: the keyword &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt;&lt;br /&gt;
is required for any enumeration or structure block you declare&lt;br /&gt;
inside a method or complex subroutine.&lt;br /&gt;
 &lt;br /&gt;
The syntax of an enumeration block is described in&lt;br /&gt;
[[Enumerations#User Language enumerations|User Language enumerations]].&lt;br /&gt;
The syntax of a structure block is described in [[Structures]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;aliases&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Local aliases==&lt;br /&gt;
&amp;lt;!--Caution: &amp;lt;div&amp;gt; above--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In certain circumstances, you can improve code readability and possibly&lt;br /&gt;
coding efficiency by&lt;br /&gt;
mapping an alternative name to an existing method for a local scope.&lt;br /&gt;
You do this by declaring a &#039;&#039;&#039;local alias&#039;&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
For example, consider a case where you have a class named &amp;lt;code&amp;gt;Utility&amp;lt;/code&amp;gt; that&lt;br /&gt;
contains an enhancement method named &amp;lt;code&amp;gt;Shift&amp;lt;/code&amp;gt; that operates on strings:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class utility&lt;br /&gt;
  public shared&lt;br /&gt;
     function (string):shift(%number is float) is longstring&lt;br /&gt;
     ...&lt;br /&gt;
  end public shared&lt;br /&gt;
end class&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Suppose that in some context in your program, you use many statements like these&lt;br /&gt;
to operate on objects that belong to another class:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%a = %b:(+utility)shift(1)&lt;br /&gt;
%c = %d:(+utility)shift(2)&lt;br /&gt;
%e = %f:(+utility)shift(3)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
As a way to eliminate the repetition of the qualifying classname,&lt;br /&gt;
you can define an alias:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local alias (string):shift for (+utility)shift&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Then the statements above that are in the same local scope as the alias statement&lt;br /&gt;
can be shortened to:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%a = %b:shift(1)&lt;br /&gt;
%c = %d:shift(2)&lt;br /&gt;
%e = %f:shift(3)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
An alternative way to accomplish the same economy with a little more effort&lt;br /&gt;
is to define a local function:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (string):shift(%number is float) is longstring&lt;br /&gt;
   return %this:(+utility)shift(%number)&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Although you can declare and use a local alias for system and user class methods,&lt;br /&gt;
they are probably most suited for [[Enhancement methods|enhancement]] methods.&lt;br /&gt;
Because of the potential confusion caused by aliases, you probably should&lt;br /&gt;
use them sparingly.&lt;br /&gt;
 &lt;br /&gt;
===Local alias declaration syntax===&lt;br /&gt;
Formally, the syntax for an alias declaration is:&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;Local Alias &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;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&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;term&amp;quot;&amp;gt;alias&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;For&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;literal&amp;quot;&amp;gt;(+&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;enhancingClass&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;) | (&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;containingClass&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&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;term&amp;quot;&amp;gt;method&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where:&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;class&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The class of the objects on which the actual method, &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt;, is defined to operate.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the alias is for an instance method, you must specify the class before the alias name. If for a shared, non-enhancement method, you do not specify a class before the alias name.  &amp;lt;/p&amp;gt;&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;alias&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the method alias. This name typically is the same as &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt;, but it does not have to be.&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;&amp;lt;var&amp;gt;+&amp;lt;/var&amp;gt;enhancingClass&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the class in which &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt; is a member. Specify this class if &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt; is an enhancement method.&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;containingClass&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the class in which &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt; is a member. Specify this class if &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;method&amp;lt;/var&amp;gt; is a shared method.&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;method&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The name of the actual method for which the alias is to be used.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
 &lt;br /&gt;
The following series of examples demonstrates how to use&lt;br /&gt;
local aliases in a variety of contexts.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The following fragment shows an alias for an instance method&lt;br /&gt;
(&amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Count&amp;lt;/var&amp;gt;):&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local alias (stringlist):number for count&lt;br /&gt;
   ...&lt;br /&gt;
%sl is object stringlist&lt;br /&gt;
   ...&lt;br /&gt;
print %sl:number&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In the following example, local alias &amp;lt;code&amp;gt;Foolish&amp;lt;/code&amp;gt; is used for&lt;br /&gt;
public subroutine &amp;lt;code&amp;gt;Silly&amp;lt;/code&amp;gt; in class &amp;lt;code&amp;gt;Absurd&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class absurd&lt;br /&gt;
  ...&lt;br /&gt;
  public&lt;br /&gt;
      ...&lt;br /&gt;
     subroutine silly&lt;br /&gt;
      ...&lt;br /&gt;
  end public&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
local alias (absurd):foolish for silly&lt;br /&gt;
 ...&lt;br /&gt;
%whacky is object silly&lt;br /&gt;
 ...&lt;br /&gt;
%whacky:foolish&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In the following example, a local alias is used for&lt;br /&gt;
an enhancement method in class &amp;lt;code&amp;gt;Util&amp;lt;/code&amp;gt; for &amp;lt;var&amp;gt;Stringlists&amp;lt;/var&amp;gt;.&lt;br /&gt;
This is likely an atypical case where the local alias name&lt;br /&gt;
is &#039;&#039;not&#039;&#039; the same as the enhancement method name.&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class util&lt;br /&gt;
   ...&lt;br /&gt;
   public shared&lt;br /&gt;
      ...&lt;br /&gt;
      function (stringlist):hash is longstring&lt;br /&gt;
      ...&lt;br /&gt;
   end public shred&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
local alias (stringlist):digest for (+util)hash&lt;br /&gt;
 ...&lt;br /&gt;
%sl is object stringlist&lt;br /&gt;
 ...&lt;br /&gt;
print %sl:digest&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;li&amp;gt;As shown in this example for the &amp;lt;var&amp;gt;System&amp;lt;/var&amp;gt; class method &amp;lt;var&amp;gt;[[Arguments (System function)|Arguments]]&amp;lt;/var&amp;gt;,&lt;br /&gt;
a local alias statement for a non-enhancement, shared method must &#039;&#039;not&#039;&#039;&lt;br /&gt;
have a class name preceding the alias name:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local alias args for (system):arguments&lt;br /&gt;
 ...&lt;br /&gt;
printtext Input arguments: {%args}&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Note that a non-instance alias is simply accessed by the alias name preceded by&lt;br /&gt;
a percent sign (&amp;lt;code&amp;gt;%args&amp;lt;/code&amp;gt;) &amp;amp;mdash; just like a local non-instance method&lt;br /&gt;
(see [[#Using non-enhancement and recursive local methods|&amp;quot;Using non-enhancement and recursive local methods&amp;quot;]], for example).&lt;br /&gt;
The alternative access to this is to use the keyword &amp;lt;code&amp;gt;Local&amp;lt;/code&amp;gt;, as in: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;printtext Input arguments: {%(local):args}&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can also use the simple percent-sign access for an alias for a non-instance&lt;br /&gt;
user-defined method, as in the following:  &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class foobar&lt;br /&gt;
   ...&lt;br /&gt;
   public shared&lt;br /&gt;
      ...&lt;br /&gt;
      property mostFoo is float&lt;br /&gt;
      ...&lt;br /&gt;
   end public shared&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
local alias maxFoo for (foobar):mostFoo&lt;br /&gt;
 ...&lt;br /&gt;
%maxFoo = 77&lt;br /&gt;
 ...&lt;br /&gt;
print %maxFoo&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;li&amp;gt;You can also use a local alias to provide an alias for a hidden method.&lt;br /&gt;
For example, suppose your program has many &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;[[Add (Stringlist function)|Add]]&amp;lt;/var&amp;gt; calls in a local context,&lt;br /&gt;
and you are required to make the same modification to each of those &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; calls.&lt;br /&gt;
Rather than changing each &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; call &amp;quot;by hand,&amp;quot; a convenient solution is to&lt;br /&gt;
create a local &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; method that applies the modification:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):add(%what is longstring)  -&lt;br /&gt;
 is float&lt;br /&gt;
   ...&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To call the system &amp;lt;var&amp;gt;Stringlist&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; method from within the local &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; function,&lt;br /&gt;
you can use an alias like the following &amp;amp;mdash; otherwise an &amp;lt;var&amp;gt;Add&amp;lt;/var&amp;gt; call inside the&lt;br /&gt;
function is a recursive call to itself: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;local function (stringlist):add(%what is longstring)  -&lt;br /&gt;
 is float&lt;br /&gt;
   local alias (stringlist):realAdd for add&lt;br /&gt;
    ...&lt;br /&gt;
   return %this:realAdd(%what)&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Common methods and aliases==&lt;br /&gt;
&amp;lt;!-- As of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3, --&amp;gt;&lt;br /&gt;
You can define &#039;&#039;&#039;Common methods&#039;&#039;&#039; and &#039;&#039;&#039;Common aliases&#039;&#039;&#039;.&lt;br /&gt;
The only methods you can&lt;br /&gt;
declare as &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; are properties and subroutines.&lt;br /&gt;
The only &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; alias you can declare is for a &amp;lt;var&amp;gt;Shared Property&amp;lt;/var&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; properties and &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines are designed to ease the&lt;br /&gt;
migration of existing &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; code elements to comparable &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;&lt;br /&gt;
object-oriented constructs.&lt;br /&gt;
You can define&lt;br /&gt;
a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property, for example, that is largely interchangeable with a non-OO &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable.&lt;br /&gt;
Similarly, a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutine can be used interchangeably with a non-OO &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;&lt;br /&gt;
complex subroutine.&lt;br /&gt;
&amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; functions do not exist, because prior to &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt;&lt;br /&gt;
there were no user-created &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;User Language&amp;lt;/var&amp;gt; functions (so no functions to migrate).&lt;br /&gt;
&lt;br /&gt;
===Declaring and invoking a Common method===&lt;br /&gt;
Like a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; method, a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; method is&lt;br /&gt;
not part of a class and&lt;br /&gt;
its contents are not visible to the containing code.&lt;br /&gt;
A &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; is only available&lt;br /&gt;
inside the scope within which its definition is contained,&lt;br /&gt;
but a &amp;lt;var&amp;gt;Common Subroutine&amp;lt;/var&amp;gt; (which must be at the outermost scope) is available throughout the request.&lt;br /&gt;
 &lt;br /&gt;
A &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; method does not allow a separate declaration block before it is defined;&lt;br /&gt;
its declaration always begins the method definition.&lt;br /&gt;
Its declaration syntax is like that for a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; method ([[#Defining and invoking a local method|Defining and invoking a local method]]).&lt;br /&gt;
&lt;br /&gt;
===Common method declaration syntax===&lt;br /&gt;
A &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; method is declared with the keyword &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;, followed by the&lt;br /&gt;
method type, followed by the method name and description:&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;Common &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;methodType methodName methodDesc&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where:&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;methodType&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The method type, which has the following syntax:&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;Subroutine | Property&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &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;methodName&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The method name, which can be any name that follows the rules for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; %variables, but it cannot be the same as a simple percent variable in the same scope.&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;methodDesc&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;The method description, which has the same structure as the method descriptions for &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; methods:&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;literal&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;literal&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;term&amp;quot;&amp;gt;datatype&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;qualifiers&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;
An &amp;lt;var&amp;gt;Initial&amp;lt;/var&amp;gt; clause is not allowed. The qualifier &amp;lt;var&amp;gt;Defer&amp;lt;/var&amp;gt; is &#039;&#039;not&#039;&#039; allowed. The qualifier &amp;lt;var&amp;gt;Expose&amp;lt;/var&amp;gt; is allowed only for &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
An example of a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property declaration follows:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;common property foo is float&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; may be contained inside any scope in a request; a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt; must be contained in the outermost scope.&lt;br /&gt;
A &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; must be called inside the scope in which it is defined.&lt;br /&gt;
A &amp;lt;var&amp;gt;Common Subroutine&amp;lt;/var&amp;gt; may be called from any scope.&lt;br /&gt;
 &lt;br /&gt;
The way you invoke a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; method depends on whether the method&lt;br /&gt;
is a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; or a &amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt;, as described in [[#Using a Common Property|&amp;quot;Using a Common Property&amp;quot;]]&lt;br /&gt;
and [[#Using a Common Subroutine|&amp;quot;Using a Common Subroutine&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
===Using a Common Property===&lt;br /&gt;
The principle&lt;br /&gt;
reason for the existence of &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; properties and aliases is to enable a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;&lt;br /&gt;
variable declaration to be converted into a &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; declaration without&lt;br /&gt;
changing the code.&lt;br /&gt;
You can only declare a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property that has no parameters,&lt;br /&gt;
but unlike common subroutines, you can declare a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property&lt;br /&gt;
within any scope in a request.&lt;br /&gt;
 &lt;br /&gt;
As an example, consider the following &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property definition:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;common property notSmall is float&lt;br /&gt;
  %shadow  is float shared&lt;br /&gt;
  set&lt;br /&gt;
     if %notSmall gt 10 then&lt;br /&gt;
        %shadow = %notSmall&lt;br /&gt;
     else&lt;br /&gt;
        %shadow = 10&lt;br /&gt;
     end if&lt;br /&gt;
  end set&lt;br /&gt;
  get&lt;br /&gt;
     return %shadow&lt;br /&gt;
  end get&lt;br /&gt;
end property&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
To access this property, since it is not a member of a class,&lt;br /&gt;
you must declare as &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; within a scope&lt;br /&gt;
a variable with the same name as the property name:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%notSmall is common&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Declaring a same-named &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable is necessary&lt;br /&gt;
even in the scope in which the &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; property is defined.&lt;br /&gt;
If you specify datatype attributes on the &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable declaration, they must&lt;br /&gt;
match the property datatype:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%notSmall is float common&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
If you are converting &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variables to properties,&lt;br /&gt;
the &amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; definition block may well be in one&lt;br /&gt;
&amp;lt;var&amp;gt;Included&amp;lt;/var&amp;gt; procedure while the common variable declaration is in another.&lt;br /&gt;
Or you might&lt;br /&gt;
want a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable that is declared in some standard&lt;br /&gt;
&amp;lt;var&amp;gt;Include&amp;lt;/var&amp;gt; block to be a &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; in a particular request.&lt;br /&gt;
You might just have the&lt;br /&gt;
&amp;lt;var&amp;gt;Common Property&amp;lt;/var&amp;gt; block at the top of the request (after the &amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;) and let the&lt;br /&gt;
&amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variable be used wherever it is already declared.&lt;br /&gt;
 &lt;br /&gt;
For an additional example featuring &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; properties and variables,&lt;br /&gt;
see [[#Using Common aliases|&amp;quot;Using Common aliases&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
===Using a Common Subroutine===&lt;br /&gt;
Just as &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; properties enable a fairly straightforward&lt;br /&gt;
conversion of standard &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; variables to properties, so &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines&lt;br /&gt;
simplify the conversion of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; non-OO complex subroutines to &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SOUL&amp;lt;/var&amp;gt; OO subroutines.&lt;br /&gt;
Such a subroutine conversion is advantageous because,&lt;br /&gt;
without having to change the&lt;br /&gt;
invocation of a formerly complex, now &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;, subroutine, you gain&lt;br /&gt;
the benefits of object-oriented methods:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Automatic initialization of local variables.&lt;br /&gt;
&amp;lt;li&amp;gt;Optional and named parameters.&lt;br /&gt;
&amp;lt;li&amp;gt;Better recursion behavior.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Note however that unlike complex subroutines, common subroutines must be defined before they are called (or alternatively have an earlier declaration using the [[Using Defer and Expose|defer]] keyword).&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; subroutines are tightly scoped and restricted to the scope in which&lt;br /&gt;
they are defined, they are not suited to the conversion task because&lt;br /&gt;
complex subroutines are available throughout the request, that is,&lt;br /&gt;
essentially common.&lt;br /&gt;
 &lt;br /&gt;
A &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt; is like a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;Subroutine&amp;lt;/var&amp;gt; except:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It is invoked like a complex subroutine:&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;Call &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subroutineName&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Note that &#039;&#039;no&#039;&#039; percent sign (&amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt;) precedes the subroutine name.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It may be contained only in the outermost (&amp;lt;var&amp;gt;Begin&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;End&amp;lt;/var&amp;gt;) scope of a request; it&lt;br /&gt;
cannot be nested.&lt;br /&gt;
&amp;lt;li&amp;gt;It is in the same namespace as complex subroutines, so &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;&lt;br /&gt;
and complex subroutines may not have the same name.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Invoking a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; method that has the same name as a &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutine does not&lt;br /&gt;
preempt (hide) the invocation of the subroutine, because the &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt;&lt;br /&gt;
subroutine must be preceded by the &amp;lt;var&amp;gt;Call&amp;lt;/var&amp;gt; keyword.&lt;br /&gt;
This is true even if the &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; method is a subroutine.&lt;br /&gt;
 &lt;br /&gt;
For example, &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutine &amp;lt;code&amp;gt;Jiggle&amp;lt;/code&amp;gt; is&lt;br /&gt;
followed by a &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; subroutine with the same name.&lt;br /&gt;
The &amp;lt;code&amp;gt;Call Jiggle&amp;lt;/code&amp;gt; statement will call the &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; &amp;lt;code&amp;gt;Jiggle&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;common subroutine jiggle&lt;br /&gt;
   ...&lt;br /&gt;
end subroutine&lt;br /&gt;
   ...&lt;br /&gt;
function wiggle is float&lt;br /&gt;
   local subroutine jiggle&lt;br /&gt;
      ...&lt;br /&gt;
   end subroutine jiggle&lt;br /&gt;
    ...&lt;br /&gt;
   call jiggle&lt;br /&gt;
    ...&lt;br /&gt;
end subroutine wiggle&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A &amp;lt;code&amp;gt;Call %jiggle&amp;lt;/code&amp;gt; statement will call the &amp;lt;var&amp;gt;Local&amp;lt;/var&amp;gt; &amp;lt;code&amp;gt;Jiggle&amp;lt;/code&amp;gt;,&lt;br /&gt;
as will &amp;lt;code&amp;gt;Call %(local):jiggle&amp;lt;/code&amp;gt; or&lt;br /&gt;
even &amp;lt;code&amp;gt;%(local):jiggle&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Common Expose==&lt;br /&gt;
 &lt;br /&gt;
You can easily replace simple subroutines with &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines.&lt;br /&gt;
Where your code calls a simple subroutine&lt;br /&gt;
from inside a complex subroutine or method, you can use&lt;br /&gt;
an &amp;quot;exposed&amp;quot; &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutine.&lt;br /&gt;
 &lt;br /&gt;
For example, suppose your site uses simple subroutines&lt;br /&gt;
containing the application code, like the following:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;TALLY: SUBROUTINE&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
In the application code, you can change the way&lt;br /&gt;
the above subroutine is initially generated to this:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;common subroutine tally expose&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
end subroutine&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Your existing &amp;lt;code&amp;gt;CALL TALLY&amp;lt;/code&amp;gt; statements will subsequently&lt;br /&gt;
invoke the &amp;lt;code&amp;gt;tally&amp;lt;/code&amp;gt; method.&lt;br /&gt;
The keyword &amp;lt;var&amp;gt;Expose&amp;lt;/var&amp;gt; gives the &amp;lt;code&amp;gt;tally&amp;lt;/code&amp;gt; method&lt;br /&gt;
access to the variables in the request that are declared outside and&lt;br /&gt;
prior to &amp;lt;code&amp;gt;tally&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Exposed &amp;lt;var&amp;gt;Common&amp;lt;/var&amp;gt; subroutines are better than simple&lt;br /&gt;
subroutines, which essentially they replace.&lt;br /&gt;
The specific advantage of this is that you can formally differentiate between&lt;br /&gt;
those variables that have entire program scope versus those that are truly&lt;br /&gt;
local to the common subroutine.&lt;br /&gt;
&lt;br /&gt;
===Using Common aliases===&lt;br /&gt;
&amp;lt;!-- As of &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Sirius Mods&amp;lt;/var&amp;gt; version 7.3, --&amp;gt;&lt;br /&gt;
You can declare a &amp;lt;var&amp;gt;Common Alias&amp;lt;/var&amp;gt; for a shared, non-enhancement property.&lt;br /&gt;
The most likely use of this alias is to provide a property inside a class that&lt;br /&gt;
replaces a common variable.&lt;br /&gt;
This might be advantageous by providing access to private class variables&lt;br /&gt;
from within the property:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;class util&lt;br /&gt;
   public shared&lt;br /&gt;
      ...&lt;br /&gt;
      property goofy is longstring&lt;br /&gt;
      ...&lt;br /&gt;
   end public shared&lt;br /&gt;
   ...&lt;br /&gt;
end class&lt;br /&gt;
 ...&lt;br /&gt;
common alias pluto for (util):goofy&lt;br /&gt;
 ...&lt;br /&gt;
%pluto is common&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Common alias declaration syntax====&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;Common Alias&amp;lt;/var&amp;gt; statement is straightforward:&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;Common Alias &amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;aliasName&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt; For (&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;):&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;sharedProperty&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Where:&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;aliasName&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The name of the shared method alias.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;class&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The name of the class in which &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;sharedProperty&amp;lt;/var&amp;gt; is a member.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;sharedProperty&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The name of the &amp;lt;var&amp;gt;Property&amp;lt;/var&amp;gt; for which the alias is to be used.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The following example shows two common properties sharing&lt;br /&gt;
private data via a class.&lt;br /&gt;
In the example, you enforce a condition that the&lt;br /&gt;
request is cancelled if the sum of two common variables exceeds 100:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;b&lt;br /&gt;
 &lt;br /&gt;
class util&lt;br /&gt;
   public shared&lt;br /&gt;
      property foo is float&lt;br /&gt;
      property bar is float&lt;br /&gt;
   end public shared&lt;br /&gt;
   private shared&lt;br /&gt;
      variable shadowFoo is float&lt;br /&gt;
      variable shadowBar is float&lt;br /&gt;
   end private shared&lt;br /&gt;
   property foo is float&lt;br /&gt;
      get&lt;br /&gt;
         return %shadowFoo&lt;br /&gt;
      end get&lt;br /&gt;
      set&lt;br /&gt;
         assert (%foo + %shadowBar) le 100&lt;br /&gt;
         %shadowFoo = %foo&lt;br /&gt;
      end set&lt;br /&gt;
   end property&lt;br /&gt;
   property bar is float&lt;br /&gt;
      get&lt;br /&gt;
         return %shadowBar&lt;br /&gt;
      end get&lt;br /&gt;
      set&lt;br /&gt;
         assert (%bar + %shadowFoo) le 100&lt;br /&gt;
         %shadowBar = %bar&lt;br /&gt;
      end set&lt;br /&gt;
   end property&lt;br /&gt;
end class&lt;br /&gt;
 &lt;br /&gt;
common alias foo for (util):foo&lt;br /&gt;
common alias bar for (util):bar&lt;br /&gt;
 &lt;br /&gt;
%foo is common&lt;br /&gt;
%bar is common&lt;br /&gt;
 &lt;br /&gt;
%foo = 22&lt;br /&gt;
%bar = 33&lt;br /&gt;
printText {~} = {%foo}, {~} = {%bar}&lt;br /&gt;
 &lt;br /&gt;
%foo = 44&lt;br /&gt;
%bar = 55&lt;br /&gt;
printText {~} = {%foo}, {~} = {%bar}&lt;br /&gt;
 &lt;br /&gt;
%foo = 66&lt;br /&gt;
%bar = 77&lt;br /&gt;
printText {~} = {%foo}, {~} = {%bar}&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The result is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;output&amp;quot;&amp;gt;%foo = 22, %bar = 33&lt;br /&gt;
%foo = 44, %bar = 55&lt;br /&gt;
&amp;amp;#42;**  1  CANCELLING REQUEST: MSIR.0491: Assert: line 17 ...&lt;br /&gt;
&amp;lt;/p&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;[[Classes and Objects]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[Global and session objects]]&lt;br /&gt;
&amp;lt;li&amp;gt;[[Methods]]&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>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Subroutines&amp;diff=78432</id>
		<title>Subroutines</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Subroutines&amp;diff=78432"/>
		<updated>2015-07-23T03:45:37Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Example 3 */&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;
User Language lets you treat a single set of statements as a simple or complex subroutine. You can:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Execute simple subroutines a number of times from different locations within a request.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Use complex subroutines as you would simple subroutines. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
In addition, you can:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Pass parameters via parameter lists.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declare variables locally.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Common elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An element that is not passed as a parameter can be shared between complex subroutines, or between a complex subroutine and the main request, when you declare that element as COMMON.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An ON unit specifies a response action to a triggering event: for example, the terminal operator pressing one of the ATTENTION identifier (AID) keys. ON units let an application override the normal system response.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Simple subroutines==&lt;br /&gt;
 &lt;br /&gt;
===Outlining a simple subroutine===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following statements are used in simple subroutines within a request:&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;Statement&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Purpose&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transfers control to the subroutine.&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&amp;gt;&amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Indicates the end of the subroutine.&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&amp;gt;&amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transfers control to another statement in the request.&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&amp;gt;&amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately following the CALL statement. &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&amp;gt;&amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Indicates the beginning of a subroutine. &amp;lt;/td&amp;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;
The statements are coded in the following sequence, so they are described in order of usage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statements as appropriate&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A simple subroutine consists of a sequence of SOUL statements that must begin with a &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement. The body of the subroutine is composed of the statements immediately following the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;SUBROUTINE&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;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;: SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A simple subroutine must be labeled; without a label it cannot be executed. You cannot use field names in the subroutine, except within a FOR loop, even if the subroutine is always called from within a record loop.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example of a simple subroutine====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following request uses two subroutines. &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; Simple subroutine statements in the following example are described more fully after this example.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The first subroutine, &amp;lt;code&amp;gt;TOTAL&amp;lt;/code&amp;gt;, accumulates a total in the %variable named &amp;lt;code&amp;gt;%TOTAL.MUSTANGS&amp;lt;/code&amp;gt;. The second subroutine, &amp;lt;code&amp;gt;PRINT.TOTAL&amp;lt;/code&amp;gt;, prints a literal that varies depending on the total accumulated. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
MUSTANGS:    FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                MODEL = MUSTANG&lt;br /&gt;
             END FIND&lt;br /&gt;
             FOR EACH RECORD IN MUSTANGS&lt;br /&gt;
                CALL TOTAL&lt;br /&gt;
             END FOR&lt;br /&gt;
             CALL PRINT.TOTAL&lt;br /&gt;
TOTAL:       SUBROUTINE&lt;br /&gt;
                %TOTAL.MUSTANGS = %TOTAL.MUSTANGS + 1&lt;br /&gt;
                RETURN&lt;br /&gt;
             END SUBROUTINE TOTAL&lt;br /&gt;
PRINT.TOTAL: SUBROUTINE&lt;br /&gt;
                IF %TOTAL.MUSTANGS LE 10 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      NOT GREATER THAN 10&#039;&lt;br /&gt;
                ELSEIF %TOTAL.MUSTANGS LE 50 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      NOT GREATER THAN 50&#039;&lt;br /&gt;
                ELSEIF %TOTAL.MUSTANGS GT 50 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      GREATER THAN 50&#039;&lt;br /&gt;
                END IF&lt;br /&gt;
                RETURN&lt;br /&gt;
             END SUBROUTINE PRINT.TOTAL&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===JUMP TO statements===&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; compiles subroutines only after they are called, regardless of where they are in your program.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you use a &amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt; statement, its destination must be within the same subroutine. You cannot jump into a subroutine from outside of a subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===RETURN statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement returns control from the subroutine to the statement following the most recent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;RETURN&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;RETURN&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement can appear only within the body of a subroutine. Use of the &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement inside of an &amp;lt;var&amp;gt;ON&amp;lt;/var&amp;gt; unit terminates compilation, the procedure cannot run, and the following message is produced: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1779 RETURN IS INVALID IN ON UNITS, USE BYPASS STATEMENT&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;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; automatically generates a return at the end of a subroutine, if you do not specify one. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For more information, see [[#ON units|ON units]] and [[#Passing control to and from ON units|Passing control to and from ON units]].&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===END SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can end a subroutine using an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement or an &amp;lt;var&amp;gt;END BLOCK&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The END SUBROUTINE statement is formatted as follows:             &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;END SUBROUTINE &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;label&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;
===CALL statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement transfers control to the subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;CALL&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;CALL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;&lt;br /&gt;
&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:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;CALL.SUB: CALL COMPUTE.PREMIUM&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
transfers control to the following statement:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;COMPUTE.PREMIUM: SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When you use a simple subroutine, no arguments are passed in subroutine calls. Instead, input and output values are implicitly passed in %variables or global variables. If you want field values as arguments, you must assign the values to %variables before the call, or the subroutine must contain its own &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; loop on the set of records to be processed.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Processing continues sequentially from that statement until another control transfer statement &amp;amp;mdash; a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;IF&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STOP&amp;lt;/var&amp;gt; statement &amp;amp;mdash; is encountered. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Complex subroutines==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Complex subroutines perform all the operations of a simple subroutine. In addition, a complex subroutine can pass parameters via parameter lists and can declare local variables. &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 format of the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement changes for a complex subroutine and the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement is also more complex.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Symbolic parameter passing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can specify positional parameters on the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a complex subroutine. These parameters are substituted for symbolic parameters used within the subroutine during execution. You can use the following elements as parameters to a complex subroutine:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar %variables&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;%variable arrays&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Lists of records&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Local variable declaration===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Labels, %variables, and other elements in a complex subroutine are local to the subroutine; they do not conflict with elements of the same name in the request or in other complex subroutines. This allows the same element to be used in different portions of a request, and for the same name to describe different elements in each portion.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
All data within the subroutine is statically allocated. When the subroutine is called, the values of all found sets, counts, noted values, and variables are as they were when the subroutine was last executed. Recursive calls to the same subroutine do not allocate separate storage for each subroutine local variable. Local variables are allocated only one time.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====OPEN statement within a complex subroutine====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A SOUL &amp;lt;var&amp;gt;OPEN&amp;lt;/var&amp;gt; statement &amp;amp;mdash; an &amp;lt;var&amp;gt;OPEN&amp;lt;/var&amp;gt; statement inside a &amp;lt;var&amp;gt;BEGIN/END&amp;lt;/var&amp;gt; &amp;amp;mdash; when used within a complex subroutine on a file that is not defined to the region produces the following counting error and the request is not compiled:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1521: &amp;lt;i&amp;gt;entity-name&amp;lt;/i&amp;gt; DOES NOT EXIST OR REQUESTED ACCESS NOT AUTHORIZED&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===SUBROUTINE statement for complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Complex subroutines begin with the following form of the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&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;formal-parameter&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;inout-option&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;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;/p&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;formal-parameter&amp;lt;/var&amp;gt; is the declaration of a symbolic parameter used within the subroutine. The parameter list is comprised of the &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;formal-parameter&amp;lt;/var&amp;gt; and subsequent input-options. The parameter list is enclosed in parentheses, and it contains declarations for each parameter separated by commas. The parameter list must be specified on one logical line. Null parameters are not allowed.&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;formal-parameter&amp;lt;/var&amp;gt; specifies the name and type of element to be used within the subroutine and can be any of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar (nonarray) %variable formatted as:&amp;lt;/li&amp;gt;&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;%variable&amp;lt;/span&amp;gt; [IS] {[STRING] [LEN] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] &lt;br /&gt;
          &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; [FIXED [DP &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; FLOAT]}&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;SUBROUTINE EXAMPLE (%W IS STRING DP *         -&lt;br /&gt;
                    %X IS STRING LEN 40,      -&lt;br /&gt;
                    %Y IS STRING LEN 10 DP 2, -&lt;br /&gt;
                    %Z IS FLOAT,              -&lt;br /&gt;
                    %A IS FIXED DP 4)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable formatted as:&amp;lt;/li&amp;gt;&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;%variable&amp;lt;/span&amp;gt; [IS] [[STRING] [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] &lt;br /&gt;
 [ARRAY(* [,*[,*]])] [NO FIELD SAVE] &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;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;FIXED [DP &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; FLOAT&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; [ARRAY(* [,*[,*]])]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The number of dimensions must be specified in the subroutine declaration, but the exact size of each dimension is not specified. An asterisk (*) is used instead of the dimension size. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;SUBROUTINE EXAMPLE(%ARR IS STRING LEN 10 - ARRAY(*,*))&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list of records formatted as:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;[LIST] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/span&amp;gt; [IN [FILE | [PERM | TEMP] GROUP]] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt; &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The context of the list is restricted to a single file or group. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;SUBROUTINE GENERAL(LIST TOTRECS IN FILE VEHICLES)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/var&amp;gt; specifies whether a formal-parameter is to be used as input to the subroutine or passed as output from the subroutine. Options are as follows:&amp;lt;/p&amp;gt;&lt;br /&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;Option&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Data can be...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;INPUT&amp;lt;br&amp;gt;&lt;br /&gt;
(the default)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Passed into, but not out of, a subroutine. In addition, data conversions are performed automatically, in the same manner as an assignment statement. All references to &amp;lt;var&amp;gt;INPUT&amp;lt;/var&amp;gt; parameters that update the parameter, for example, assignment statements, result in compiler errors.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td nowrap&amp;gt;INPUT OUTPUT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This option is equivalent to the OUTPUT option. &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;OUTPUT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Returned from a subroutine. No data conversions are performed.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The lengths of complex subroutine string OUTPUT parameters are inherited from calling parameters. If the lengths are specified in the subroutine declaration, the following message is written to the audit trail: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1981 LENGTH IGNORED FOR OUTPUT PARAMETER&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Compilation and evaluation of the procedure continues, with the inherited length.&amp;lt;/p&amp;gt;&lt;br /&gt;
&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;
===END SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Like simple subroutines, a complex subroutine ends with an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement. However, unlike simple subroutines, you must not label the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement.   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
All declarations and statements compiled after the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement become a part of the subroutine until the &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement is encountered or until the request is ended with the &amp;lt;var&amp;gt;END&amp;lt;/var&amp;gt; statement.  &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===CALL statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The execution of a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement passes control to a complex subroutine. The first time a subroutine is called, all elements in the subroutine are initialized. Subsequently, each time the subroutine is called, all elements in the subroutine remain in the same state as they were when the subroutine was last exited. You are responsible for reinitializing the elements within the subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A complex subroutine is invoked with this form of the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;CALL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/span&amp;gt; [(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;actual-parameter&amp;lt;/span&amp;gt; [, ...])]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Where:&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;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;actual-parameter&amp;lt;/var&amp;gt; specifies the actual data that replaces the symbolic formal-parameter within the subroutine. At execution time, the value of each actual-parameter is substituted, based on the order in which it appears, for a formal-parameter declared for the subroutine. The correspondence of each formal-parameter in the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement to an actual-parameter in the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement is by position rather than by name.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An actual-parameter can be any of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;%variable or expression&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Expressions can contain field names, screen items, image items, and constants.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When an entire array is passed as a parameter, the %variable name is used with the percent (%) sign, but no parenthesis or subscript expressions follow it. 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;
%A IS FLOAT ARRAY(10,10)&lt;br /&gt;
DECLARE SUBROUTINE FDO(FLOAT ARRAY(*,*))&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL FDO (%A)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE FDO (%B IS FLOAT ARRAY(*,*))&lt;br /&gt;
   PRINT %B(1,1)&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;[[$ArrSize]]&amp;lt;/var&amp;gt; function can be used to determine the number of elements in a particular dimension of an array. &amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An actual-parameter can be a list, optionally preceded by the word LIST to distinguish it from a field name. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the compiler already knows of the formal-parameter list because the subroutine is already compiled or declared, the LIST keyword is unnecessary. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the list has never been declared in the request, a compilation error results. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Additional rules for parameters====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following additional rules apply to actual-parameters and parameter passing:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The maximum number of parameters that can be passed in complex subroutines is 63.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If the formal-parameter is specified as an OUTPUT parameter, the corresponding actual-parameter must match type.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The INPUT parameters of a %variable array requires that the type of the array &amp;amp;mdash; &amp;lt;var&amp;gt;FLOAT&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;FIXED&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; &amp;amp;mdash; the &amp;lt;var&amp;gt;DP&amp;lt;/var&amp;gt; specification, and the number of dimensions match the actual-parameter. In addition, if the &amp;lt;var&amp;gt;NO FIELD SAVE&amp;lt;/var&amp;gt; (&amp;lt;var&amp;gt;NO FS&amp;lt;/var&amp;gt;) option is specified for a &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; formal-parameter, it also must be specified for the corresponding actual-parameter and vice versa. All checking of array bounds within subroutines occurs during evaluation.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The INPUT parameters of a list requires the same file or group context as the actual-parameter.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;An INPUT parameter of a scalar %variable can be called with an actual-parameter that is an expression or %variable of a differing type. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; converts the actual-parameter to the type required by the subroutine, according to the rules of the assignment statement. The converted value has a separate storage location from the original variable or expression.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Passing arguments to INPUT parameters might involve truncation where the number of decimal places is different, or conversion to 0 for non-numeric strings.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;OUTPUT parameters of lists and %variable arrays follow the same rules as INPUT parameters for lists and %variable arrays.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;OUTPUT parameters of scalar %variables require that the actual-parameter supplied in the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement be another scalar %variable (no constants or expressions) of the same type &amp;amp;mdash; &amp;lt;var&amp;gt;FLOAT&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;FIXED&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; &amp;amp;mdash; and that the number of decimal places be the same, or the following message is issued by &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1725 PARAMETER NUMBER &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; IS TYPE INCOMPATIBLE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Strings can be of any length. The length used is that of the actual input parameter. &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;
===Processing complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Checking for the validity of parameter lists occurs during compilation. When the SUBROUTINE statement is compiled, the types of parameters are saved by the compiler, and any subsequent CALL statements are verified as to whether the actual parameter is consistent with the type of formal parameter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When a CALL statement is compiled and the subroutine to which it refers has not been compiled, the compiler verifies whether the actual parameter list is compatible with other CALL statements for the subroutine that it has already compiled. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The compiler cannot verify that the actual parameters are compatible with the SUBROUTINE statement until that SUBROUTINE statement is compiled. If the compiler then detects a CALL statement that is not compatible with the SUBROUTINE statement, an error is issued at that time. Checking is done at compile time, so a statement that is not executed during evaluation can still generate an error.    &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===DECLARE SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The DECLARE statement for a complex subroutine is similar to the SUBROUTINE statement, except that the parameter names are omitted. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
The complete syntax for the DECLARE SUBROUTINE statement is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;DECLARE SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&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; &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;inout-option&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;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;/p&amp;gt;&lt;br /&gt;
Where:&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;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;type&amp;lt;/var&amp;gt; is one of the following:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar %variable of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;{STRING [LEN] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] | [FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT]}&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;{STRING [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] [ARRAY(* [,*[,*]]) [NO FIELD SAVE]]&lt;br /&gt;
 | [FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT] [ARRAY(* [,*[,*]])]}&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list of records of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;[LIST] [IN {FILE | [PERM | TEMP] GROUP} &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/var&amp;gt; specifies whether each formal parameter is to be used as input to the subroutine or passed as output from the subroutine. Options are the same as those that can be specified on the SUBROUTINE statement: INPUT, OUTPUT, or INPUT OUTPUT. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====DECLARE before CALL====&lt;br /&gt;
When a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement refers to a subroutine that has not yet been compiled, the error checking capabilities of the compiler are limited, because the number and type of formal parameters are not known to the compiler. If the first &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a particular subroutine is not correctly coded, then a large number of error messages can be generated when compiling subsequent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statements, although these statements might be correctly coded.&lt;br /&gt;
&lt;br /&gt;
You can avoid this problem in one of the following ways:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declare the formal parameter list with the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement. When the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement precedes the first &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;, the compiler generates the correct error messages, if problems are encountered. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Place the subroutine before the first &amp;lt;var&amp;gt;CALL&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;
====Specifying a list of records====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you specify a &amp;lt;var&amp;gt;LIST&amp;lt;/var&amp;gt; (of records), you must also specify &amp;lt;var&amp;gt;FILE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;GROUP&amp;lt;/var&amp;gt;. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;OPEN METADATA&lt;br /&gt;
password&lt;br /&gt;
 &lt;br /&gt;
BEGIN&lt;br /&gt;
    DECLARE LIST ORIG IN METADATA&lt;br /&gt;
    DECLARE SUBROUTINE THE.SUB(LIST IN FILE METADATA INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    CALL THE.SUB (LIST ORIG)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE THE.SUB(LIST ORIG IN METADATA INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
END SUBROUTINE THE.SUB&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you do not specify &amp;lt;var&amp;gt;FILE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;GROUP&amp;lt;/var&amp;gt; in the code, you receive the following error message:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1725: PARAMETER NUMBER n IS TYPE INCOMPATIBLE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====DECLARE parameters and CALL parameters====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, note that the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement lists the formal parameters, while the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement lists the actual parameters:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE SUBROUTINE SUB1(FLOAT, FIXED DP 2, STRING, STRING DP *)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
   CALL SUB1(%INCREASE,%WAGES,%NAME,%DEPT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
  SUBROUTINE SUB1(%A IS FLOAT,&lt;br /&gt;
                %B IS FIXED DP 2,&lt;br /&gt;
                %C IS STRING,&lt;br /&gt;
                %D IS STRING DP *)&lt;br /&gt;
  END SUBROUTINE&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Impact on CALL and SUBROUTINE statements====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statements are not overridden when a &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement is present. The &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement does not cause the compiler to use more table space, nor does it alter the way in which the compiler output is generated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Rocket Software recommends that you use a &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement before the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a subroutine or that you place the subroutine itself before the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. Error reporting will be more complete and specific to the subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Exiting the subroutine===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement returns control to the statement immediately following the most recent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. If an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;END&amp;lt;/var&amp;gt; statement is encountered without a &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement, &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; processing is implied and automatically added by the compiler. More than one &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement can be specified in a subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If a &amp;lt;var&amp;gt;JUMP&amp;lt;/var&amp;gt; statement is used within a subroutine, its destination must be within the same subroutine. You cannot jump into a subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A &amp;lt;var&amp;gt;STOP&amp;lt;/var&amp;gt; statement, when executed inside a subroutine, terminates the request in the same manner as it does when executed outside a subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Examples using complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, an employee name with regular and overtime hours is passed to the subroutine &amp;lt;code&amp;gt;CALC.WAGES&amp;lt;/code&amp;gt;. The total pay is returned and a list of records processed by the routine is updated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DECLARE SUBROUTINE CALC.WAGES(FIXED DP 2, -&lt;br /&gt;
        FIXED DP 2, STRING, FIXED DP 2 OUTPUT, -&lt;br /&gt;
        LIST IN FILE EMPLOYEE INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL CALC.WAGES(%R.HRS, %OT.HRS, %NAME, -&lt;br /&gt;
                %TOTAL.PAY, LIST EMPLST)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE CALC.WAGES(%REG IS FIXED DP 2, -&lt;br /&gt;
                %OT IS FIXED DP 2, -&lt;br /&gt;
                %E.NAME IS STRING, -&lt;br /&gt;
                %TOTAL IS FIXED DP 2 OUTPUT, -&lt;br /&gt;
                LIST EMPLIST IN FILE EMPLOYEE INOUT)&lt;br /&gt;
 &lt;br /&gt;
%TEMP IS FIXED DP 2&lt;br /&gt;
 &lt;br /&gt;
WAGES1: IN EMPLOYEE FIND ALL RECORDS FOR WHICH&lt;br /&gt;
           NAME = %E.NAME&lt;br /&gt;
        END FIND&lt;br /&gt;
        FOR EACH RECORD IN WAGES1&lt;br /&gt;
           %TEMP = (RATE * %REG)&lt;br /&gt;
           %TOTAL = %TEMP + (RATE * 1.5 * %OT)&lt;br /&gt;
        END FOR&lt;br /&gt;
        PLACE RECORDS IN WAGES1 ON LIST EMPLIST&lt;br /&gt;
        RETURN&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, an entire array is passed as a single subroutine parameter:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%NUMBERS IS FLOAT ARRAY(10,10)&lt;br /&gt;
%MAX IS FLOAT&lt;br /&gt;
   DECLARE SUBROUTINE MAXIMUM(FLOAT ARRAY(*,*), -&lt;br /&gt;
     FLOAT OUTPUT)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   CALL MAXIMUM(%NUMBERS,%MAX)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE MAXIMUM(%ARR IS FLOAT ARRAY(*,*), -&lt;br /&gt;
           %M IS FLOAT OUTPUT)&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
%J IS FIXED&lt;br /&gt;
   %M = 0&lt;br /&gt;
   FOR %I FROM 1 TO $arrsize(&#039;%ARR&#039;,1)&lt;br /&gt;
      FOR %J FROM 1 TO $arrsize(&#039;%ARR&#039;,2)&lt;br /&gt;
         IF %ARR(%I,%J) GT %M THEN&lt;br /&gt;
            %M = %ARR(%I,%J)&lt;br /&gt;
         END IF&lt;br /&gt;
      END FOR&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sharing common elements==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An element that is not passed as a parameter can be shared between complex subroutines, or between a complex subroutine and the main request, when it is declared as a common element. A common element is created by using the DECLARE statement or by using the COMMON keyword on a %variable IS declaration. For an element to be shared, it must be declared as common in every place (each separate scope) in which it is used.      &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Scope of elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The scope of an element refers to the area within a request in which an element has a particular meaning. In User Language, complex subroutines have a different scope than the remainder of the request (the elements of a complex subroutine differ from the elements outside the subroutine even when they have the same name). This concept applies to labels, lists, %variables and %variable arrays, menus, screens, and images.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The elements of the main request (the statements not enclosed by any SUBROUTINE/END SUBROUTINE statements) and the elements of all simple subroutines share the same scope. Simple subroutines share the same elements with the main request and all other simple subroutines within the request.     &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Shareable elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following elements can be shared if they are declared as common:&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====%variables and %variable arrays====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share %variables if a DECLARE %variable or a %variable IS statement that declares the %variable as common is present in each portion of the request where you use the %variable. The %variable must have the same type, length, number of decimal places, and FIELD SAVE option in each declaration. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Lists of records====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share a list if a DECLARE statement that declares the list as common is contained in each place where you use the list. The declaration of the list must precede the first reference to that list, or &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; declares the list implicitly without the common attribute.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Found sets====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share found sets if the label of the FIND statement is declared as common. To effectively share a found set, follow these steps:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add a DECLARE statement that declares the statement label as common before the actual label in the portion of the request where the FIND statement will be executed.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add a DECLARE statement that declares the label as common to any parts of the request that require access to that found set. These parts, however, cannot contain a label with the same name, or a compiler error occurs. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
After execution of the FIND statement, you can access the record set in any portion of the request that contains the proper DECLARE statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Menus and screens====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share a menu or screen as common under the following conditions: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The first reference to the menu or screen must be the complete definition of the menu or screen, with the COMMON keyword following the MENU or SCREEN statement.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Other parts of the request can reference the same menu or screen by using an abbreviated declaration of the form:&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE [MENU menuname | SCREEN screenname] COMMON&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the complete definition of the menu or screen exists, and if that definition was declared as common, the menu or screen is shared. If not, a compiler error results. Two or more complete menu or screen definitions with the COMMON keyword also result in a compiler error.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you use a menu or screen %variable (:%variable) within a complex subroutine to refer to a COMMON screen element, you must include a common declaration for each possible value of the menu or screen name. &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;
====Images====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The sharing of images follows the same rules used for the sharing of menus and screens. If multiple images are contained within the same block, then the following rules also apply:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You can use the COMMON keyword on only the first IMAGE statement of a block. All other images within the same block are automatically considered as candidates for sharing as common data.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;All other parts of the request that access common images must contain the following abbreviated form of the DECLARE statement for each image to which access is required: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE IMAGE imagename COMMON&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
===DECLARE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can use the DECLARE statement to perform the following functions:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Specify subroutine formal parameter types.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Specify variables, labels, lists, menus, screens, and images as COMMON.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Menus and screens are discussed in detail in [[Full-screen feature]]. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Images are discussed in detail in [[Images]].&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To declare lists without having to use an &amp;lt;code&amp;gt;IN filename CLEAR LIST listname&amp;lt;/code&amp;gt; clause. See [[Lists#Creating and clearing a list|Creating and clearing a list]].&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To declare %variables, see [[Using variables and values in computation]]. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the DECLARE statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;DECLARE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;declaration&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;span class=&amp;quot;term&amp;quot;&amp;gt;declaration&amp;lt;/span&amp;gt; is one of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;LABEL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
[LIST] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/span&amp;gt; [IN [FILE [PERM | TEMP] GROUP] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;]&lt;br /&gt;
                [COMMON]&lt;br /&gt;
 &lt;br /&gt;
IMAGE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;imagename&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
MENU &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;menuname&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
SCREEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;screenname&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; [IS] {FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT}&lt;br /&gt;
 [ARRAY(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d1&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d2&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d3&amp;lt;/span&amp;gt;]])] [COMMON]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; [IS] STRING [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;dn1&amp;lt;/span&amp;gt; | *}]&lt;br /&gt;
 [ARRAY(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d1&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d2&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d3&amp;lt;/span&amp;gt;]])] [NO FIELD SAVE] [COMMON]&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/span&amp;gt;[(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;type&amp;lt;/span&amp;gt; [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/span&amp;gt;] [,...]) ]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For example, the DECLARE statement declares the list RECNAMES in the following request:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DECLARE LIST RECNAMES&lt;br /&gt;
DECLARE SUBROUTINE REGION(LIST OUTPUT, STRING)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL REGION(LIST RECNAMES, &#039;NORTHEAST&#039;)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE REGION(LIST RGNLST OUTPUT, -&lt;br /&gt;
                  %REGION IS STRING)&lt;br /&gt;
 &lt;br /&gt;
R1: IN EMPLOYEE FIND ALL RECORDS FOR WHICH&lt;br /&gt;
       REGION = %REGION&lt;br /&gt;
R2: PLACE RECORDS IN R1 ON LIST RGNLIST&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Defining common variables===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can define common variables at the beginning of all programs without later redefinitions. The syntax lets you use the %VAR IS COMMON clause without duplicating the previous attributes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
However, if attributes, such as STRING or LEN, are included in the redefinition, which differ from those previously defined, a compilation error occurs. In addition, if the variable is not previously defined, it is allocated based on the current default variable definition. &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;
VARIABLES ARE STRING LEN 20 &lt;br /&gt;
%X IS STRING LEN 3 INITIAL (&#039;AAA&#039;) STATIC COMMON &lt;br /&gt;
SUBROUTINE A&lt;br /&gt;
   * full definition on next line no longer required&lt;br /&gt;
   ** %X IS STRING LEN 3 INITIAL (&#039;AAA&#039;) STATIC COMMON&lt;br /&gt;
   * new syntax on next line replaces previous line&lt;br /&gt;
   %X IS COMMON  /? defaults to previous %X definition ?/&lt;br /&gt;
   CALL B&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE B&lt;br /&gt;
   * But next line will fail compile since %X already exists&lt;br /&gt;
   %X IS STRING LEN 4 COMMON  /? compiler error ?/&lt;br /&gt;
   * And the next line will result in a default definition&lt;br /&gt;
   * since %Y is not previously defined.&lt;br /&gt;
   %Y IS COMMON&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
PRINT %X&lt;br /&gt;
CALL A&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Shared common element examples===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following examples illustrate the differences between data that is locally scoped and data that is shared using the COMMON keyword. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 1====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the variable %I assumes different values depending upon which part of the request is being executed:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   DECLARE SUBROUTINE SUBR1(STRING)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
FOR %I FROM 1 TO 10&lt;br /&gt;
   CALL SUBR1(%ARR(%I))&lt;br /&gt;
END FOR&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
SUBROUTINE SUBR1(%A IS STRING)&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   FOR %I FROM 1 TO 10&lt;br /&gt;
      PRINT %I and %A&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 2====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the screen EXAMPLE and the %A and %B variables retain the same values no matter which part of the request is being executed:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
SCREEN EXAMDEF COMMON&lt;br /&gt;
   TITLE &#039;THIS IS A COMMON SCREEN DEFINITION&#039;&lt;br /&gt;
   PROMPT &#039;ENTER VALUE&#039;&lt;br /&gt;
   INPUT FLD1 AT 10 LEN 20 PAD &#039;_&#039;&lt;br /&gt;
END SCREEN&lt;br /&gt;
%A IS STRING LEN 10 COMMON&lt;br /&gt;
%B IS FLOAT COMMON&lt;br /&gt;
DECLARE SUBROUTINE SUBR1(STRING LEN 10)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
SUBROUTINE SUBR1(%Z IS STRING LEN 10)&lt;br /&gt;
DECLARE SCREEN EXAMDEF COMMON&lt;br /&gt;
%A IS STRING LEN 10 COMMON&lt;br /&gt;
%B IS FLOAT COMMON&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 3====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the main request and the subroutine share the common data of an array and a found set:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%COM.ARRAY IS STRING LEN 10 ARRAY(10,10) COMMON&lt;br /&gt;
DECLARE LABEL ALL.RECS COMMON&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
DECLARE SUBROUTINE EXAMPLE&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
ALL.RECS: FIND ALL RECORDS&lt;br /&gt;
          END FIND&lt;br /&gt;
          %I = 0&lt;br /&gt;
          %J = 1&lt;br /&gt;
          FOR 10 RECORDS IN ALL.RECS&lt;br /&gt;
             %I = %I + 1&lt;br /&gt;
             %COM.ARRAY(%I,%J) = FLD&lt;br /&gt;
          END FOR&lt;br /&gt;
          CALL EXAMPLE&lt;br /&gt;
          STOP&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE EXAMPLE&lt;br /&gt;
   %COM.ARRAY IS STRING LEN 10 ARRAY(10,10) COMMON&lt;br /&gt;
   DECLARE LABEL ALL.RECS COMMON&lt;br /&gt;
   %I IS FIXED&lt;br /&gt;
   %I = 0&lt;br /&gt;
   %J = 2&lt;br /&gt;
   FOR 10 RECORDS IN ALL.RECS&lt;br /&gt;
      %I = %I + 1&lt;br /&gt;
      %COM.ARRAY(%I,%J) = FLD2&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the preceding example, the main request updates column 1 of the array %COMM.ARRAY with the contents of FLD. The subroutine, EXAMPLE, updates column 2 of the same array with the contents of FLD2. Both the array %COM.ARRAY and the found set ALL.RECS are shared by using the COMMON keyword. %I and %J are both local variables. %I is local because it was declared without the COMMON keyword; %J is local because it was not declared at all.                       &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;On statement&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- The two reasonable section names for ... --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==On units==  &amp;lt;!-- Be sure to keep with &amp;lt;div&amp;gt; tags preceding this --&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit lets you specify a course of action following a triggering event, such as the terminal operator pressing one of the &amp;lt;var&amp;gt;Attention&amp;lt;/var&amp;gt; identifier (AID) keys. The &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit provides an application with a way to override the normal system response. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To define an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit, use an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; block in the following format:&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;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;] On &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;unittype&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;statement&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;...&amp;lt;/span&amp;gt;&lt;br /&gt;
End On&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;unittype&amp;lt;/var&amp;gt; is one of the following:&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;unittype&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;You can specify the course of action to take if...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;ATTENTION&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The end user invokes the attention feature (for example, presses the &amp;lt;var&amp;gt;BREAK, ATTN,&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;PA1&amp;lt;/var&amp;gt; key, or enters &amp;lt;var&amp;gt;*CANCEL&amp;lt;/var&amp;gt;).     &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;ERROR&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; cancels a request. Before a request is canceled or, for transaction backout files, after the current transaction is backed out, the ON ERROR unit is processed instead of returning control to the terminal command level. For more information on transaction backout files, see [[Data recovery]].    &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td nowrap&amp;gt;FIELD CONSTRAINT&lt;br /&gt;
CONFLICT (FCC)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;There are field level constraint conflicts. Violating the UNIQUE and AT-MOST-ONE attributes causes field-level conflicts.*&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;FIND CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A conflict arises evaluating a FIND statement or a FOR EACH RECORD statement used for retrieval.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;MISSING FILE&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A remote file is no longer available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;MISSING MEMBER&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A remote optional member is no longer available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;RECORD LOCKING CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A conflict arises during a record locking attempt.&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 you have procedures written for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; V2R1.0 that use ON FCC for UNIQUE fields, and you are planning to use ON FCC for AT-MOST-ONE fields, you might need to rewrite the ON FCC unit to take the new value of $UPDSTAT (2 for AT-MOST-ONE) into account. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Several $functions provide information about conflicts. They 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&amp;gt;[[$UpdFile]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdFld]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdOval]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdRec]]&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;[[$UpdStat]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdStmt]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdVal]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UnqRec]]&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;
===Body of an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The body of the ON unit consists of statements immediately following the ON statement. Any User Language statement can appear within an ON unit except the SUBROUTINE statement.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Ending an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You must conclude an ON unit with either an END ON statement or an END BLOCK statement. The format of the END ON statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;END ON [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&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;label&amp;lt;/var&amp;gt; is the label of the statement that began the ON statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Processing an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When an ON statement is evaluated, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; remembers the location of the ON unit body (the statement after the ON statement and within the unit), but does not immediately evaluate the body. Instead, it passes control to the statement immediately following the ON unit. The ON unit body is evaluated only when the triggering event takes place.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Usage guidelines for ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Note the following considerations when using ON units:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You must define the ON unit before it is invoked (that is, you should typically place the ON unit near the beginning of your procedure). &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A subsequent definition of an ON unit of the same kind replaces the previous one. For example, if you define two ON ATTN units, the second one becomes the current one.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump to destinations within the same ON unit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump out of an ON unit only to unnested, labeled statements.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You cannot jump into an ON unit.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump outside of an ON unit only if the ON unit is part of a main routine or part of a complex subroutine. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You cannot jump out of an ON unit contained in a simple subroutine, regardless of whether the destination is within the subroutine or back in the mainline program, because ON units are part of the mainline program; hence, there is no scoping of ON units. This restriction ensures that the ON unit is executed and the control returned to the main routine.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;li&amp;gt;An ON unit definition is not preserved when a request is continued with an END MORE statement and a MORE command. Each new request continuation must define its own ON units. (See [[Large request considerations#Rules for request continuation|Rules for request continuation]].)&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;For complex subroutines, an active ON unit is temporarily disabled when a subroutine is called that contains an ON UNIT of the same type; it is restored when the subroutine returns. Any ON unit enabled during the execution of a subroutine is replaced by the active ON unit at the time of the last CALL statement as soon as the RETURN statement is evaluated.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ON units coded inside complex subroutines can contain JUMP statements that specify a destination outside the ON unit. The destination must be to an unnested labeled statement within the complex subroutine. Also, if the ON unit is to be jumped out of, the condition that causes the ON unit to be invoked must be raised in the subroutine that contains the ON unit.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This prevents a lower level subroutine from returning inadvertently by raising a condition for which there is an ON unit coded in a higher level subroutine. If the inadvertent return is attempted, the request is canceled. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ON units do not have their own local data and labels. They inherit the scope of the part of the program in which they are compiled. An ON unit that is compiled within a complex subroutine is considered part of only that subroutine. &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, if the user presses the&amp;lt;var&amp;gt; ATTN&amp;lt;/var&amp;gt; key instead of entering a response to the prompt in the GET.REC.TYPE statement, the ON ATTENTION unit sets %FLAG to 1. The FLAG.SET statement tests %FLAG. If %FLAG is set, the request branches to END.REQUEST and the FIND statement is not executed. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%FLAG=0&lt;br /&gt;
              ON ATTENTION&lt;br /&gt;
                 %FLAG=1&lt;br /&gt;
                 BYPASS&lt;br /&gt;
              END ON&lt;br /&gt;
GET.REC.TYPE: %TYPE=$READ(&#039;ENTER RECORD TYPE&#039;)&lt;br /&gt;
FLAG.SET:     IF %FLAG=1 THEN&lt;br /&gt;
                 JUMP TO END.REQUEST&lt;br /&gt;
              END IF&lt;br /&gt;
FIND.RECS:    FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                 TYPE = %TYPE&lt;br /&gt;
              END FIND&lt;br /&gt;
                 .&lt;br /&gt;
                 .&lt;br /&gt;
                 .&lt;br /&gt;
END.REQUEST:&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Only one ON unit at a time===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Only one ON unit of each kind is active at a time. For example, the processing of a second ON ERROR statement resets the current ON ERROR unit, but does not affect the current ON ATTENTION unit. Thus, you can redefine what to do in a variety of cases by having several ON statements and units within a request. An ON unit can be redefined within another ON unit.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Passing control to and from ON units===&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; passes control to an ON unit when the triggering event occurs. For example, an ON ATTENTION unit receives control when a user presses one of the ATTENTION identifier (AID) keys at the terminal during the execution of a request. Use one of the following statements to return control to the body of the request.    &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====BYPASS statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The BYPASS statement handles the various unittypes of an ON statement as follows:&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;For unittype...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;The BYPASS statement...&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;ON MISSING FILE&amp;lt;br&amp;gt;&lt;br /&gt;
ON MISSING MEMBER&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately after the END FOR statement that closes the current FOR loop. &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;ON ERROR&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ends the request.&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 nowrap&amp;gt;ON ATTENTION&amp;lt;br&amp;gt;&lt;br /&gt;
ON FIND CONFLICT&amp;lt;br&amp;gt;&lt;br /&gt;
ON RECORD LOCKING CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately after the statement that invoked the ON unit.&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;
The format of the BYPASS statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;BYPASS [PENDING STATEMENT]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where the PENDING STATEMENT keyword is optional. If the ON unit is not ended with a BYPASS statement, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; automatically generates a STOP statement at the end of the unit.   &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====CONTINUE statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The CONTINUE statement is supported only with the Parallel Query Option. If you lose access to a group member that is an optional file during FOR processing, the CONTINUE statement continues FOR processing with the next available file, and skips any other unavailable files.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====JUMP TO statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The JUMP statement, when used to jump to a labeled statement outside the ON unit, causes the request to continue at that point. There are restrictions pertaining to jumps; see [[Flow of control in User Language#Branching statements|Branching statements]] and [[#Simple subroutines|Simple subroutines]]. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====RETRY statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The RETRY statement passes control to the statement that invoked the ON unit, thereby retrying that statement. The RETRY statement is not valid in an ON ERROR unit.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the RETRY statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;RETRY [PENDING STATEMENT]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where the &amp;lt;var&amp;gt;PENDING STATEMENT&amp;lt;/var&amp;gt; keyword is optional.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====STOP statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The STOP statement is used to end the request.         &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Clearing ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can issue the following statement to clear the definition of an ON unit:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;CLEAR ON &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;unittype&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This statement clears any defined ON unit of the type specified. Clearing an ON unit produces the following results:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;After a CLEAR ON ATTENTION, pressing one of the ATTENTION identifier (AID) keys at the terminal does not invoke the ON ATTENTION unit.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;After a CLEAR ON ERROR, a request cancellation error does not invoke the ON ERROR unit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An ON unit can be defined, cleared, and then redefined. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Pausing during the request===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The PAUSE statement can be used with ON units to cause the request to wait a specified time and then to retry the statement that caused the evaluation of the ON unit. PAUSE is typically used with the other ON unit types (RECORD LOCKING CONFLICT and ON FIND CONFLICT) and is discussed in [[Record level locking and concurrency control]].   &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>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Subroutines&amp;diff=78431</id>
		<title>Subroutines</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Subroutines&amp;diff=78431"/>
		<updated>2015-07-23T03:44:45Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Defining common variables */&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;
User Language lets you treat a single set of statements as a simple or complex subroutine. You can:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Execute simple subroutines a number of times from different locations within a request.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Use complex subroutines as you would simple subroutines. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
In addition, you can:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Pass parameters via parameter lists.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declare variables locally.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Common elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An element that is not passed as a parameter can be shared between complex subroutines, or between a complex subroutine and the main request, when you declare that element as COMMON.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An ON unit specifies a response action to a triggering event: for example, the terminal operator pressing one of the ATTENTION identifier (AID) keys. ON units let an application override the normal system response.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Simple subroutines==&lt;br /&gt;
 &lt;br /&gt;
===Outlining a simple subroutine===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following statements are used in simple subroutines within a request:&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;Statement&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Purpose&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transfers control to the subroutine.&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&amp;gt;&amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Indicates the end of the subroutine.&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&amp;gt;&amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transfers control to another statement in the request.&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&amp;gt;&amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately following the CALL statement. &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&amp;gt;&amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Indicates the beginning of a subroutine. &amp;lt;/td&amp;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;
The statements are coded in the following sequence, so they are described in order of usage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statements as appropriate&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A simple subroutine consists of a sequence of SOUL statements that must begin with a &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement. The body of the subroutine is composed of the statements immediately following the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;SUBROUTINE&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;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;: SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A simple subroutine must be labeled; without a label it cannot be executed. You cannot use field names in the subroutine, except within a FOR loop, even if the subroutine is always called from within a record loop.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example of a simple subroutine====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following request uses two subroutines. &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; Simple subroutine statements in the following example are described more fully after this example.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The first subroutine, &amp;lt;code&amp;gt;TOTAL&amp;lt;/code&amp;gt;, accumulates a total in the %variable named &amp;lt;code&amp;gt;%TOTAL.MUSTANGS&amp;lt;/code&amp;gt;. The second subroutine, &amp;lt;code&amp;gt;PRINT.TOTAL&amp;lt;/code&amp;gt;, prints a literal that varies depending on the total accumulated. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
MUSTANGS:    FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                MODEL = MUSTANG&lt;br /&gt;
             END FIND&lt;br /&gt;
             FOR EACH RECORD IN MUSTANGS&lt;br /&gt;
                CALL TOTAL&lt;br /&gt;
             END FOR&lt;br /&gt;
             CALL PRINT.TOTAL&lt;br /&gt;
TOTAL:       SUBROUTINE&lt;br /&gt;
                %TOTAL.MUSTANGS = %TOTAL.MUSTANGS + 1&lt;br /&gt;
                RETURN&lt;br /&gt;
             END SUBROUTINE TOTAL&lt;br /&gt;
PRINT.TOTAL: SUBROUTINE&lt;br /&gt;
                IF %TOTAL.MUSTANGS LE 10 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      NOT GREATER THAN 10&#039;&lt;br /&gt;
                ELSEIF %TOTAL.MUSTANGS LE 50 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      NOT GREATER THAN 50&#039;&lt;br /&gt;
                ELSEIF %TOTAL.MUSTANGS GT 50 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      GREATER THAN 50&#039;&lt;br /&gt;
                END IF&lt;br /&gt;
                RETURN&lt;br /&gt;
             END SUBROUTINE PRINT.TOTAL&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===JUMP TO statements===&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; compiles subroutines only after they are called, regardless of where they are in your program.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you use a &amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt; statement, its destination must be within the same subroutine. You cannot jump into a subroutine from outside of a subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===RETURN statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement returns control from the subroutine to the statement following the most recent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;RETURN&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;RETURN&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement can appear only within the body of a subroutine. Use of the &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement inside of an &amp;lt;var&amp;gt;ON&amp;lt;/var&amp;gt; unit terminates compilation, the procedure cannot run, and the following message is produced: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1779 RETURN IS INVALID IN ON UNITS, USE BYPASS STATEMENT&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;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; automatically generates a return at the end of a subroutine, if you do not specify one. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For more information, see [[#ON units|ON units]] and [[#Passing control to and from ON units|Passing control to and from ON units]].&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===END SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can end a subroutine using an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement or an &amp;lt;var&amp;gt;END BLOCK&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The END SUBROUTINE statement is formatted as follows:             &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;END SUBROUTINE &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;label&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;
===CALL statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement transfers control to the subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;CALL&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;CALL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;&lt;br /&gt;
&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:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;CALL.SUB: CALL COMPUTE.PREMIUM&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
transfers control to the following statement:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;COMPUTE.PREMIUM: SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When you use a simple subroutine, no arguments are passed in subroutine calls. Instead, input and output values are implicitly passed in %variables or global variables. If you want field values as arguments, you must assign the values to %variables before the call, or the subroutine must contain its own &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; loop on the set of records to be processed.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Processing continues sequentially from that statement until another control transfer statement &amp;amp;mdash; a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;IF&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STOP&amp;lt;/var&amp;gt; statement &amp;amp;mdash; is encountered. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Complex subroutines==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Complex subroutines perform all the operations of a simple subroutine. In addition, a complex subroutine can pass parameters via parameter lists and can declare local variables. &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 format of the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement changes for a complex subroutine and the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement is also more complex.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Symbolic parameter passing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can specify positional parameters on the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a complex subroutine. These parameters are substituted for symbolic parameters used within the subroutine during execution. You can use the following elements as parameters to a complex subroutine:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar %variables&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;%variable arrays&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Lists of records&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Local variable declaration===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Labels, %variables, and other elements in a complex subroutine are local to the subroutine; they do not conflict with elements of the same name in the request or in other complex subroutines. This allows the same element to be used in different portions of a request, and for the same name to describe different elements in each portion.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
All data within the subroutine is statically allocated. When the subroutine is called, the values of all found sets, counts, noted values, and variables are as they were when the subroutine was last executed. Recursive calls to the same subroutine do not allocate separate storage for each subroutine local variable. Local variables are allocated only one time.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====OPEN statement within a complex subroutine====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A SOUL &amp;lt;var&amp;gt;OPEN&amp;lt;/var&amp;gt; statement &amp;amp;mdash; an &amp;lt;var&amp;gt;OPEN&amp;lt;/var&amp;gt; statement inside a &amp;lt;var&amp;gt;BEGIN/END&amp;lt;/var&amp;gt; &amp;amp;mdash; when used within a complex subroutine on a file that is not defined to the region produces the following counting error and the request is not compiled:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1521: &amp;lt;i&amp;gt;entity-name&amp;lt;/i&amp;gt; DOES NOT EXIST OR REQUESTED ACCESS NOT AUTHORIZED&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===SUBROUTINE statement for complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Complex subroutines begin with the following form of the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&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;formal-parameter&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;inout-option&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;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;/p&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;formal-parameter&amp;lt;/var&amp;gt; is the declaration of a symbolic parameter used within the subroutine. The parameter list is comprised of the &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;formal-parameter&amp;lt;/var&amp;gt; and subsequent input-options. The parameter list is enclosed in parentheses, and it contains declarations for each parameter separated by commas. The parameter list must be specified on one logical line. Null parameters are not allowed.&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;formal-parameter&amp;lt;/var&amp;gt; specifies the name and type of element to be used within the subroutine and can be any of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar (nonarray) %variable formatted as:&amp;lt;/li&amp;gt;&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;%variable&amp;lt;/span&amp;gt; [IS] {[STRING] [LEN] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] &lt;br /&gt;
          &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; [FIXED [DP &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; FLOAT]}&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;SUBROUTINE EXAMPLE (%W IS STRING DP *         -&lt;br /&gt;
                    %X IS STRING LEN 40,      -&lt;br /&gt;
                    %Y IS STRING LEN 10 DP 2, -&lt;br /&gt;
                    %Z IS FLOAT,              -&lt;br /&gt;
                    %A IS FIXED DP 4)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable formatted as:&amp;lt;/li&amp;gt;&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;%variable&amp;lt;/span&amp;gt; [IS] [[STRING] [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] &lt;br /&gt;
 [ARRAY(* [,*[,*]])] [NO FIELD SAVE] &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;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;FIXED [DP &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; FLOAT&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; [ARRAY(* [,*[,*]])]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The number of dimensions must be specified in the subroutine declaration, but the exact size of each dimension is not specified. An asterisk (*) is used instead of the dimension size. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;SUBROUTINE EXAMPLE(%ARR IS STRING LEN 10 - ARRAY(*,*))&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list of records formatted as:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;[LIST] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/span&amp;gt; [IN [FILE | [PERM | TEMP] GROUP]] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt; &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The context of the list is restricted to a single file or group. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;SUBROUTINE GENERAL(LIST TOTRECS IN FILE VEHICLES)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/var&amp;gt; specifies whether a formal-parameter is to be used as input to the subroutine or passed as output from the subroutine. Options are as follows:&amp;lt;/p&amp;gt;&lt;br /&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;Option&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Data can be...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;INPUT&amp;lt;br&amp;gt;&lt;br /&gt;
(the default)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Passed into, but not out of, a subroutine. In addition, data conversions are performed automatically, in the same manner as an assignment statement. All references to &amp;lt;var&amp;gt;INPUT&amp;lt;/var&amp;gt; parameters that update the parameter, for example, assignment statements, result in compiler errors.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td nowrap&amp;gt;INPUT OUTPUT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This option is equivalent to the OUTPUT option. &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;OUTPUT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Returned from a subroutine. No data conversions are performed.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The lengths of complex subroutine string OUTPUT parameters are inherited from calling parameters. If the lengths are specified in the subroutine declaration, the following message is written to the audit trail: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1981 LENGTH IGNORED FOR OUTPUT PARAMETER&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Compilation and evaluation of the procedure continues, with the inherited length.&amp;lt;/p&amp;gt;&lt;br /&gt;
&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;
===END SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Like simple subroutines, a complex subroutine ends with an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement. However, unlike simple subroutines, you must not label the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement.   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
All declarations and statements compiled after the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement become a part of the subroutine until the &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement is encountered or until the request is ended with the &amp;lt;var&amp;gt;END&amp;lt;/var&amp;gt; statement.  &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===CALL statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The execution of a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement passes control to a complex subroutine. The first time a subroutine is called, all elements in the subroutine are initialized. Subsequently, each time the subroutine is called, all elements in the subroutine remain in the same state as they were when the subroutine was last exited. You are responsible for reinitializing the elements within the subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A complex subroutine is invoked with this form of the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;CALL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/span&amp;gt; [(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;actual-parameter&amp;lt;/span&amp;gt; [, ...])]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Where:&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;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;actual-parameter&amp;lt;/var&amp;gt; specifies the actual data that replaces the symbolic formal-parameter within the subroutine. At execution time, the value of each actual-parameter is substituted, based on the order in which it appears, for a formal-parameter declared for the subroutine. The correspondence of each formal-parameter in the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement to an actual-parameter in the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement is by position rather than by name.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An actual-parameter can be any of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;%variable or expression&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Expressions can contain field names, screen items, image items, and constants.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When an entire array is passed as a parameter, the %variable name is used with the percent (%) sign, but no parenthesis or subscript expressions follow it. 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;
%A IS FLOAT ARRAY(10,10)&lt;br /&gt;
DECLARE SUBROUTINE FDO(FLOAT ARRAY(*,*))&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL FDO (%A)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE FDO (%B IS FLOAT ARRAY(*,*))&lt;br /&gt;
   PRINT %B(1,1)&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;[[$ArrSize]]&amp;lt;/var&amp;gt; function can be used to determine the number of elements in a particular dimension of an array. &amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An actual-parameter can be a list, optionally preceded by the word LIST to distinguish it from a field name. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the compiler already knows of the formal-parameter list because the subroutine is already compiled or declared, the LIST keyword is unnecessary. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the list has never been declared in the request, a compilation error results. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Additional rules for parameters====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following additional rules apply to actual-parameters and parameter passing:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The maximum number of parameters that can be passed in complex subroutines is 63.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If the formal-parameter is specified as an OUTPUT parameter, the corresponding actual-parameter must match type.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The INPUT parameters of a %variable array requires that the type of the array &amp;amp;mdash; &amp;lt;var&amp;gt;FLOAT&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;FIXED&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; &amp;amp;mdash; the &amp;lt;var&amp;gt;DP&amp;lt;/var&amp;gt; specification, and the number of dimensions match the actual-parameter. In addition, if the &amp;lt;var&amp;gt;NO FIELD SAVE&amp;lt;/var&amp;gt; (&amp;lt;var&amp;gt;NO FS&amp;lt;/var&amp;gt;) option is specified for a &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; formal-parameter, it also must be specified for the corresponding actual-parameter and vice versa. All checking of array bounds within subroutines occurs during evaluation.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The INPUT parameters of a list requires the same file or group context as the actual-parameter.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;An INPUT parameter of a scalar %variable can be called with an actual-parameter that is an expression or %variable of a differing type. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; converts the actual-parameter to the type required by the subroutine, according to the rules of the assignment statement. The converted value has a separate storage location from the original variable or expression.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Passing arguments to INPUT parameters might involve truncation where the number of decimal places is different, or conversion to 0 for non-numeric strings.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;OUTPUT parameters of lists and %variable arrays follow the same rules as INPUT parameters for lists and %variable arrays.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;OUTPUT parameters of scalar %variables require that the actual-parameter supplied in the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement be another scalar %variable (no constants or expressions) of the same type &amp;amp;mdash; &amp;lt;var&amp;gt;FLOAT&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;FIXED&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; &amp;amp;mdash; and that the number of decimal places be the same, or the following message is issued by &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1725 PARAMETER NUMBER &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; IS TYPE INCOMPATIBLE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Strings can be of any length. The length used is that of the actual input parameter. &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;
===Processing complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Checking for the validity of parameter lists occurs during compilation. When the SUBROUTINE statement is compiled, the types of parameters are saved by the compiler, and any subsequent CALL statements are verified as to whether the actual parameter is consistent with the type of formal parameter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When a CALL statement is compiled and the subroutine to which it refers has not been compiled, the compiler verifies whether the actual parameter list is compatible with other CALL statements for the subroutine that it has already compiled. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The compiler cannot verify that the actual parameters are compatible with the SUBROUTINE statement until that SUBROUTINE statement is compiled. If the compiler then detects a CALL statement that is not compatible with the SUBROUTINE statement, an error is issued at that time. Checking is done at compile time, so a statement that is not executed during evaluation can still generate an error.    &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===DECLARE SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The DECLARE statement for a complex subroutine is similar to the SUBROUTINE statement, except that the parameter names are omitted. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
The complete syntax for the DECLARE SUBROUTINE statement is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;DECLARE SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&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; &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;inout-option&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;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;/p&amp;gt;&lt;br /&gt;
Where:&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;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;type&amp;lt;/var&amp;gt; is one of the following:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar %variable of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;{STRING [LEN] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] | [FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT]}&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;{STRING [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] [ARRAY(* [,*[,*]]) [NO FIELD SAVE]]&lt;br /&gt;
 | [FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT] [ARRAY(* [,*[,*]])]}&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list of records of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;[LIST] [IN {FILE | [PERM | TEMP] GROUP} &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/var&amp;gt; specifies whether each formal parameter is to be used as input to the subroutine or passed as output from the subroutine. Options are the same as those that can be specified on the SUBROUTINE statement: INPUT, OUTPUT, or INPUT OUTPUT. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====DECLARE before CALL====&lt;br /&gt;
When a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement refers to a subroutine that has not yet been compiled, the error checking capabilities of the compiler are limited, because the number and type of formal parameters are not known to the compiler. If the first &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a particular subroutine is not correctly coded, then a large number of error messages can be generated when compiling subsequent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statements, although these statements might be correctly coded.&lt;br /&gt;
&lt;br /&gt;
You can avoid this problem in one of the following ways:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declare the formal parameter list with the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement. When the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement precedes the first &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;, the compiler generates the correct error messages, if problems are encountered. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Place the subroutine before the first &amp;lt;var&amp;gt;CALL&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;
====Specifying a list of records====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you specify a &amp;lt;var&amp;gt;LIST&amp;lt;/var&amp;gt; (of records), you must also specify &amp;lt;var&amp;gt;FILE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;GROUP&amp;lt;/var&amp;gt;. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;OPEN METADATA&lt;br /&gt;
password&lt;br /&gt;
 &lt;br /&gt;
BEGIN&lt;br /&gt;
    DECLARE LIST ORIG IN METADATA&lt;br /&gt;
    DECLARE SUBROUTINE THE.SUB(LIST IN FILE METADATA INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    CALL THE.SUB (LIST ORIG)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE THE.SUB(LIST ORIG IN METADATA INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
END SUBROUTINE THE.SUB&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you do not specify &amp;lt;var&amp;gt;FILE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;GROUP&amp;lt;/var&amp;gt; in the code, you receive the following error message:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1725: PARAMETER NUMBER n IS TYPE INCOMPATIBLE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====DECLARE parameters and CALL parameters====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, note that the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement lists the formal parameters, while the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement lists the actual parameters:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE SUBROUTINE SUB1(FLOAT, FIXED DP 2, STRING, STRING DP *)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
   CALL SUB1(%INCREASE,%WAGES,%NAME,%DEPT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
  SUBROUTINE SUB1(%A IS FLOAT,&lt;br /&gt;
                %B IS FIXED DP 2,&lt;br /&gt;
                %C IS STRING,&lt;br /&gt;
                %D IS STRING DP *)&lt;br /&gt;
  END SUBROUTINE&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Impact on CALL and SUBROUTINE statements====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statements are not overridden when a &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement is present. The &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement does not cause the compiler to use more table space, nor does it alter the way in which the compiler output is generated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Rocket Software recommends that you use a &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement before the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a subroutine or that you place the subroutine itself before the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. Error reporting will be more complete and specific to the subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Exiting the subroutine===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement returns control to the statement immediately following the most recent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. If an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;END&amp;lt;/var&amp;gt; statement is encountered without a &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement, &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; processing is implied and automatically added by the compiler. More than one &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement can be specified in a subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If a &amp;lt;var&amp;gt;JUMP&amp;lt;/var&amp;gt; statement is used within a subroutine, its destination must be within the same subroutine. You cannot jump into a subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A &amp;lt;var&amp;gt;STOP&amp;lt;/var&amp;gt; statement, when executed inside a subroutine, terminates the request in the same manner as it does when executed outside a subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Examples using complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, an employee name with regular and overtime hours is passed to the subroutine &amp;lt;code&amp;gt;CALC.WAGES&amp;lt;/code&amp;gt;. The total pay is returned and a list of records processed by the routine is updated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DECLARE SUBROUTINE CALC.WAGES(FIXED DP 2, -&lt;br /&gt;
        FIXED DP 2, STRING, FIXED DP 2 OUTPUT, -&lt;br /&gt;
        LIST IN FILE EMPLOYEE INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL CALC.WAGES(%R.HRS, %OT.HRS, %NAME, -&lt;br /&gt;
                %TOTAL.PAY, LIST EMPLST)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE CALC.WAGES(%REG IS FIXED DP 2, -&lt;br /&gt;
                %OT IS FIXED DP 2, -&lt;br /&gt;
                %E.NAME IS STRING, -&lt;br /&gt;
                %TOTAL IS FIXED DP 2 OUTPUT, -&lt;br /&gt;
                LIST EMPLIST IN FILE EMPLOYEE INOUT)&lt;br /&gt;
 &lt;br /&gt;
%TEMP IS FIXED DP 2&lt;br /&gt;
 &lt;br /&gt;
WAGES1: IN EMPLOYEE FIND ALL RECORDS FOR WHICH&lt;br /&gt;
           NAME = %E.NAME&lt;br /&gt;
        END FIND&lt;br /&gt;
        FOR EACH RECORD IN WAGES1&lt;br /&gt;
           %TEMP = (RATE * %REG)&lt;br /&gt;
           %TOTAL = %TEMP + (RATE * 1.5 * %OT)&lt;br /&gt;
        END FOR&lt;br /&gt;
        PLACE RECORDS IN WAGES1 ON LIST EMPLIST&lt;br /&gt;
        RETURN&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, an entire array is passed as a single subroutine parameter:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%NUMBERS IS FLOAT ARRAY(10,10)&lt;br /&gt;
%MAX IS FLOAT&lt;br /&gt;
   DECLARE SUBROUTINE MAXIMUM(FLOAT ARRAY(*,*), -&lt;br /&gt;
     FLOAT OUTPUT)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   CALL MAXIMUM(%NUMBERS,%MAX)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE MAXIMUM(%ARR IS FLOAT ARRAY(*,*), -&lt;br /&gt;
           %M IS FLOAT OUTPUT)&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
%J IS FIXED&lt;br /&gt;
   %M = 0&lt;br /&gt;
   FOR %I FROM 1 TO $arrsize(&#039;%ARR&#039;,1)&lt;br /&gt;
      FOR %J FROM 1 TO $arrsize(&#039;%ARR&#039;,2)&lt;br /&gt;
         IF %ARR(%I,%J) GT %M THEN&lt;br /&gt;
            %M = %ARR(%I,%J)&lt;br /&gt;
         END IF&lt;br /&gt;
      END FOR&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sharing common elements==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An element that is not passed as a parameter can be shared between complex subroutines, or between a complex subroutine and the main request, when it is declared as a common element. A common element is created by using the DECLARE statement or by using the COMMON keyword on a %variable IS declaration. For an element to be shared, it must be declared as common in every place (each separate scope) in which it is used.      &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Scope of elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The scope of an element refers to the area within a request in which an element has a particular meaning. In User Language, complex subroutines have a different scope than the remainder of the request (the elements of a complex subroutine differ from the elements outside the subroutine even when they have the same name). This concept applies to labels, lists, %variables and %variable arrays, menus, screens, and images.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The elements of the main request (the statements not enclosed by any SUBROUTINE/END SUBROUTINE statements) and the elements of all simple subroutines share the same scope. Simple subroutines share the same elements with the main request and all other simple subroutines within the request.     &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Shareable elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following elements can be shared if they are declared as common:&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====%variables and %variable arrays====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share %variables if a DECLARE %variable or a %variable IS statement that declares the %variable as common is present in each portion of the request where you use the %variable. The %variable must have the same type, length, number of decimal places, and FIELD SAVE option in each declaration. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Lists of records====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share a list if a DECLARE statement that declares the list as common is contained in each place where you use the list. The declaration of the list must precede the first reference to that list, or &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; declares the list implicitly without the common attribute.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Found sets====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share found sets if the label of the FIND statement is declared as common. To effectively share a found set, follow these steps:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add a DECLARE statement that declares the statement label as common before the actual label in the portion of the request where the FIND statement will be executed.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add a DECLARE statement that declares the label as common to any parts of the request that require access to that found set. These parts, however, cannot contain a label with the same name, or a compiler error occurs. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
After execution of the FIND statement, you can access the record set in any portion of the request that contains the proper DECLARE statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Menus and screens====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share a menu or screen as common under the following conditions: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The first reference to the menu or screen must be the complete definition of the menu or screen, with the COMMON keyword following the MENU or SCREEN statement.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Other parts of the request can reference the same menu or screen by using an abbreviated declaration of the form:&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE [MENU menuname | SCREEN screenname] COMMON&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the complete definition of the menu or screen exists, and if that definition was declared as common, the menu or screen is shared. If not, a compiler error results. Two or more complete menu or screen definitions with the COMMON keyword also result in a compiler error.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you use a menu or screen %variable (:%variable) within a complex subroutine to refer to a COMMON screen element, you must include a common declaration for each possible value of the menu or screen name. &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;
====Images====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The sharing of images follows the same rules used for the sharing of menus and screens. If multiple images are contained within the same block, then the following rules also apply:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You can use the COMMON keyword on only the first IMAGE statement of a block. All other images within the same block are automatically considered as candidates for sharing as common data.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;All other parts of the request that access common images must contain the following abbreviated form of the DECLARE statement for each image to which access is required: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE IMAGE imagename COMMON&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
===DECLARE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can use the DECLARE statement to perform the following functions:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Specify subroutine formal parameter types.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Specify variables, labels, lists, menus, screens, and images as COMMON.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Menus and screens are discussed in detail in [[Full-screen feature]]. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Images are discussed in detail in [[Images]].&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To declare lists without having to use an &amp;lt;code&amp;gt;IN filename CLEAR LIST listname&amp;lt;/code&amp;gt; clause. See [[Lists#Creating and clearing a list|Creating and clearing a list]].&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To declare %variables, see [[Using variables and values in computation]]. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the DECLARE statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;DECLARE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;declaration&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;span class=&amp;quot;term&amp;quot;&amp;gt;declaration&amp;lt;/span&amp;gt; is one of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;LABEL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
[LIST] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/span&amp;gt; [IN [FILE [PERM | TEMP] GROUP] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;]&lt;br /&gt;
                [COMMON]&lt;br /&gt;
 &lt;br /&gt;
IMAGE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;imagename&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
MENU &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;menuname&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
SCREEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;screenname&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; [IS] {FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT}&lt;br /&gt;
 [ARRAY(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d1&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d2&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d3&amp;lt;/span&amp;gt;]])] [COMMON]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; [IS] STRING [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;dn1&amp;lt;/span&amp;gt; | *}]&lt;br /&gt;
 [ARRAY(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d1&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d2&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d3&amp;lt;/span&amp;gt;]])] [NO FIELD SAVE] [COMMON]&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/span&amp;gt;[(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;type&amp;lt;/span&amp;gt; [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/span&amp;gt;] [,...]) ]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For example, the DECLARE statement declares the list RECNAMES in the following request:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DECLARE LIST RECNAMES&lt;br /&gt;
DECLARE SUBROUTINE REGION(LIST OUTPUT, STRING)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL REGION(LIST RECNAMES, &#039;NORTHEAST&#039;)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE REGION(LIST RGNLST OUTPUT, -&lt;br /&gt;
                  %REGION IS STRING)&lt;br /&gt;
 &lt;br /&gt;
R1: IN EMPLOYEE FIND ALL RECORDS FOR WHICH&lt;br /&gt;
       REGION = %REGION&lt;br /&gt;
R2: PLACE RECORDS IN R1 ON LIST RGNLIST&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Defining common variables===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can define common variables at the beginning of all programs without later redefinitions. The syntax lets you use the %VAR IS COMMON clause without duplicating the previous attributes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
However, if attributes, such as STRING or LEN, are included in the redefinition, which differ from those previously defined, a compilation error occurs. In addition, if the variable is not previously defined, it is allocated based on the current default variable definition. &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;
VARIABLES ARE STRING LEN 20 &lt;br /&gt;
%X IS STRING LEN 3 INITIAL (&#039;AAA&#039;) STATIC COMMON &lt;br /&gt;
SUBROUTINE A&lt;br /&gt;
   * full definition on next line no longer required&lt;br /&gt;
   ** %X IS STRING LEN 3 INITIAL (&#039;AAA&#039;) STATIC COMMON&lt;br /&gt;
   * new syntax on next line replaces previous line&lt;br /&gt;
   %X IS COMMON  /? defaults to previous %X definition ?/&lt;br /&gt;
   CALL B&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE B&lt;br /&gt;
   * But next line will fail compile since %X already exists&lt;br /&gt;
   %X IS STRING LEN 4 COMMON  /? compiler error ?/&lt;br /&gt;
   * And the next line will result in a default definition&lt;br /&gt;
   * since %Y is not previously defined.&lt;br /&gt;
   %Y IS COMMON&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
PRINT %X&lt;br /&gt;
CALL A&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Shared common element examples===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following examples illustrate the differences between data that is locally scoped and data that is shared using the COMMON keyword. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 1====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the variable %I assumes different values depending upon which part of the request is being executed:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   DECLARE SUBROUTINE SUBR1(STRING)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
FOR %I FROM 1 TO 10&lt;br /&gt;
   CALL SUBR1(%ARR(%I))&lt;br /&gt;
END FOR&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
SUBROUTINE SUBR1(%A IS STRING)&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   FOR %I FROM 1 TO 10&lt;br /&gt;
      PRINT %I and %A&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 2====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the screen EXAMPLE and the %A and %B variables retain the same values no matter which part of the request is being executed:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
SCREEN EXAMDEF COMMON&lt;br /&gt;
   TITLE &#039;THIS IS A COMMON SCREEN DEFINITION&#039;&lt;br /&gt;
   PROMPT &#039;ENTER VALUE&#039;&lt;br /&gt;
   INPUT FLD1 AT 10 LEN 20 PAD &#039;_&#039;&lt;br /&gt;
END SCREEN&lt;br /&gt;
%A IS STRING LEN 10 COMMON&lt;br /&gt;
%B IS FLOAT COMMON&lt;br /&gt;
DECLARE SUBROUTINE SUBR1(STRING LEN 10)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
SUBROUTINE SUBR1(%Z IS STRING LEN 10)&lt;br /&gt;
DECLARE SCREEN EXAMDEF COMMON&lt;br /&gt;
%A IS STRING LEN 10 COMMON&lt;br /&gt;
%B IS FLOAT COMMON&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 3====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the main request and the subroutine share the common data of an array and a found set:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%COM.ARRAY IS STRING LEN 10 ARRAY(10,10) COMMON&lt;br /&gt;
DECLARE LABEL ALL.RECS COMMON&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
DECLARE SUBROUTINE EXAMPLE&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
ALL.RECS: FIND ALL RECORDS&lt;br /&gt;
          END FIND&lt;br /&gt;
          %I = 0&lt;br /&gt;
          %J = 1&lt;br /&gt;
          FOR 10 RECORDS IN ALL.RECS&lt;br /&gt;
             %I = %I + 1&lt;br /&gt;
             %COM.ARRAY(%I,%J) = FLD&lt;br /&gt;
          END FOR&lt;br /&gt;
          CALL EXAMPLE&lt;br /&gt;
          STOP&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE EXAMPLE&lt;br /&gt;
%COM.ARRAY IS STRING LEN 10 ARRAY(10,10) COMMON&lt;br /&gt;
DECLARE LABEL ALL.RECS COMMON&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   %I = 0&lt;br /&gt;
   %J = 2&lt;br /&gt;
   FOR 10 RECORDS IN ALL.RECS&lt;br /&gt;
      %I = %I + 1&lt;br /&gt;
      %COM.ARRAY(%I,%J) = FLD2&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the preceding example, the main request updates column 1 of the array %COMM.ARRAY with the contents of FLD. The subroutine, EXAMPLE, updates column 2 of the same array with the contents of FLD2. Both the array %COM.ARRAY and the found set ALL.RECS are shared by using the COMMON keyword. %I and %J are both local variables. %I is local because it was declared without the COMMON keyword; %J is local because it was not declared at all.                       &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;On statement&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- The two reasonable section names for ... --&amp;gt;&lt;br /&gt;
==On units==  &amp;lt;!-- Be sure to keep with &amp;lt;div&amp;gt; tags preceding this --&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit lets you specify a course of action following a triggering event, such as the terminal operator pressing one of the &amp;lt;var&amp;gt;Attention&amp;lt;/var&amp;gt; identifier (AID) keys. The &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit provides an application with a way to override the normal system response. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To define an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit, use an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; block in the following format:&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;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;] On &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;unittype&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;statement&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;...&amp;lt;/span&amp;gt;&lt;br /&gt;
End On&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;unittype&amp;lt;/var&amp;gt; is one of the following:&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;unittype&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;You can specify the course of action to take if...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;ATTENTION&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The end user invokes the attention feature (for example, presses the &amp;lt;var&amp;gt;BREAK, ATTN,&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;PA1&amp;lt;/var&amp;gt; key, or enters &amp;lt;var&amp;gt;*CANCEL&amp;lt;/var&amp;gt;).     &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;ERROR&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; cancels a request. Before a request is canceled or, for transaction backout files, after the current transaction is backed out, the ON ERROR unit is processed instead of returning control to the terminal command level. For more information on transaction backout files, see [[Data recovery]].    &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td nowrap&amp;gt;FIELD CONSTRAINT&lt;br /&gt;
CONFLICT (FCC)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;There are field level constraint conflicts. Violating the UNIQUE and AT-MOST-ONE attributes causes field-level conflicts.*&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;FIND CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A conflict arises evaluating a FIND statement or a FOR EACH RECORD statement used for retrieval.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;MISSING FILE&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A remote file is no longer available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;MISSING MEMBER&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A remote optional member is no longer available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;RECORD LOCKING CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A conflict arises during a record locking attempt.&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 you have procedures written for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; V2R1.0 that use ON FCC for UNIQUE fields, and you are planning to use ON FCC for AT-MOST-ONE fields, you might need to rewrite the ON FCC unit to take the new value of $UPDSTAT (2 for AT-MOST-ONE) into account. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Several $functions provide information about conflicts. They 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&amp;gt;[[$UpdFile]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdFld]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdOval]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdRec]]&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;[[$UpdStat]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdStmt]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdVal]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UnqRec]]&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;
===Body of an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The body of the ON unit consists of statements immediately following the ON statement. Any User Language statement can appear within an ON unit except the SUBROUTINE statement.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Ending an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You must conclude an ON unit with either an END ON statement or an END BLOCK statement. The format of the END ON statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;END ON [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&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;label&amp;lt;/var&amp;gt; is the label of the statement that began the ON statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Processing an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When an ON statement is evaluated, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; remembers the location of the ON unit body (the statement after the ON statement and within the unit), but does not immediately evaluate the body. Instead, it passes control to the statement immediately following the ON unit. The ON unit body is evaluated only when the triggering event takes place.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Usage guidelines for ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Note the following considerations when using ON units:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You must define the ON unit before it is invoked (that is, you should typically place the ON unit near the beginning of your procedure). &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A subsequent definition of an ON unit of the same kind replaces the previous one. For example, if you define two ON ATTN units, the second one becomes the current one.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump to destinations within the same ON unit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump out of an ON unit only to unnested, labeled statements.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You cannot jump into an ON unit.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump outside of an ON unit only if the ON unit is part of a main routine or part of a complex subroutine. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You cannot jump out of an ON unit contained in a simple subroutine, regardless of whether the destination is within the subroutine or back in the mainline program, because ON units are part of the mainline program; hence, there is no scoping of ON units. This restriction ensures that the ON unit is executed and the control returned to the main routine.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;li&amp;gt;An ON unit definition is not preserved when a request is continued with an END MORE statement and a MORE command. Each new request continuation must define its own ON units. (See [[Large request considerations#Rules for request continuation|Rules for request continuation]].)&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;For complex subroutines, an active ON unit is temporarily disabled when a subroutine is called that contains an ON UNIT of the same type; it is restored when the subroutine returns. Any ON unit enabled during the execution of a subroutine is replaced by the active ON unit at the time of the last CALL statement as soon as the RETURN statement is evaluated.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ON units coded inside complex subroutines can contain JUMP statements that specify a destination outside the ON unit. The destination must be to an unnested labeled statement within the complex subroutine. Also, if the ON unit is to be jumped out of, the condition that causes the ON unit to be invoked must be raised in the subroutine that contains the ON unit.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This prevents a lower level subroutine from returning inadvertently by raising a condition for which there is an ON unit coded in a higher level subroutine. If the inadvertent return is attempted, the request is canceled. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ON units do not have their own local data and labels. They inherit the scope of the part of the program in which they are compiled. An ON unit that is compiled within a complex subroutine is considered part of only that subroutine. &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, if the user presses the&amp;lt;var&amp;gt; ATTN&amp;lt;/var&amp;gt; key instead of entering a response to the prompt in the GET.REC.TYPE statement, the ON ATTENTION unit sets %FLAG to 1. The FLAG.SET statement tests %FLAG. If %FLAG is set, the request branches to END.REQUEST and the FIND statement is not executed. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%FLAG=0&lt;br /&gt;
              ON ATTENTION&lt;br /&gt;
                 %FLAG=1&lt;br /&gt;
                 BYPASS&lt;br /&gt;
              END ON&lt;br /&gt;
GET.REC.TYPE: %TYPE=$READ(&#039;ENTER RECORD TYPE&#039;)&lt;br /&gt;
FLAG.SET:     IF %FLAG=1 THEN&lt;br /&gt;
                 JUMP TO END.REQUEST&lt;br /&gt;
              END IF&lt;br /&gt;
FIND.RECS:    FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                 TYPE = %TYPE&lt;br /&gt;
              END FIND&lt;br /&gt;
                 .&lt;br /&gt;
                 .&lt;br /&gt;
                 .&lt;br /&gt;
END.REQUEST:&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Only one ON unit at a time===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Only one ON unit of each kind is active at a time. For example, the processing of a second ON ERROR statement resets the current ON ERROR unit, but does not affect the current ON ATTENTION unit. Thus, you can redefine what to do in a variety of cases by having several ON statements and units within a request. An ON unit can be redefined within another ON unit.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Passing control to and from ON units===&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; passes control to an ON unit when the triggering event occurs. For example, an ON ATTENTION unit receives control when a user presses one of the ATTENTION identifier (AID) keys at the terminal during the execution of a request. Use one of the following statements to return control to the body of the request.    &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====BYPASS statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The BYPASS statement handles the various unittypes of an ON statement as follows:&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;For unittype...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;The BYPASS statement...&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;ON MISSING FILE&amp;lt;br&amp;gt;&lt;br /&gt;
ON MISSING MEMBER&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately after the END FOR statement that closes the current FOR loop. &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;ON ERROR&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ends the request.&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 nowrap&amp;gt;ON ATTENTION&amp;lt;br&amp;gt;&lt;br /&gt;
ON FIND CONFLICT&amp;lt;br&amp;gt;&lt;br /&gt;
ON RECORD LOCKING CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately after the statement that invoked the ON unit.&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;
The format of the BYPASS statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;BYPASS [PENDING STATEMENT]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where the PENDING STATEMENT keyword is optional. If the ON unit is not ended with a BYPASS statement, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; automatically generates a STOP statement at the end of the unit.   &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====CONTINUE statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The CONTINUE statement is supported only with the Parallel Query Option. If you lose access to a group member that is an optional file during FOR processing, the CONTINUE statement continues FOR processing with the next available file, and skips any other unavailable files.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====JUMP TO statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The JUMP statement, when used to jump to a labeled statement outside the ON unit, causes the request to continue at that point. There are restrictions pertaining to jumps; see [[Flow of control in User Language#Branching statements|Branching statements]] and [[#Simple subroutines|Simple subroutines]]. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====RETRY statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The RETRY statement passes control to the statement that invoked the ON unit, thereby retrying that statement. The RETRY statement is not valid in an ON ERROR unit.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the RETRY statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;RETRY [PENDING STATEMENT]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where the &amp;lt;var&amp;gt;PENDING STATEMENT&amp;lt;/var&amp;gt; keyword is optional.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====STOP statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The STOP statement is used to end the request.         &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Clearing ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can issue the following statement to clear the definition of an ON unit:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;CLEAR ON &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;unittype&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This statement clears any defined ON unit of the type specified. Clearing an ON unit produces the following results:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;After a CLEAR ON ATTENTION, pressing one of the ATTENTION identifier (AID) keys at the terminal does not invoke the ON ATTENTION unit.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;After a CLEAR ON ERROR, a request cancellation error does not invoke the ON ERROR unit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An ON unit can be defined, cleared, and then redefined. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Pausing during the request===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The PAUSE statement can be used with ON units to cause the request to wait a specified time and then to retry the statement that caused the evaluation of the ON unit. PAUSE is typically used with the other ON unit types (RECORD LOCKING CONFLICT and ON FIND CONFLICT) and is discussed in [[Record level locking and concurrency control]].   &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>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Subroutines&amp;diff=78430</id>
		<title>Subroutines</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Subroutines&amp;diff=78430"/>
		<updated>2015-07-23T03:43:32Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Defining common variables */&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;
User Language lets you treat a single set of statements as a simple or complex subroutine. You can:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Execute simple subroutines a number of times from different locations within a request.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Use complex subroutines as you would simple subroutines. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
In addition, you can:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Pass parameters via parameter lists.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declare variables locally.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Common elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An element that is not passed as a parameter can be shared between complex subroutines, or between a complex subroutine and the main request, when you declare that element as COMMON.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An ON unit specifies a response action to a triggering event: for example, the terminal operator pressing one of the ATTENTION identifier (AID) keys. ON units let an application override the normal system response.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Simple subroutines==&lt;br /&gt;
 &lt;br /&gt;
===Outlining a simple subroutine===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following statements are used in simple subroutines within a request:&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;Statement&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Purpose&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transfers control to the subroutine.&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&amp;gt;&amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Indicates the end of the subroutine.&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&amp;gt;&amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transfers control to another statement in the request.&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&amp;gt;&amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately following the CALL statement. &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&amp;gt;&amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Indicates the beginning of a subroutine. &amp;lt;/td&amp;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;
The statements are coded in the following sequence, so they are described in order of usage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statements as appropriate&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A simple subroutine consists of a sequence of SOUL statements that must begin with a &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement. The body of the subroutine is composed of the statements immediately following the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;SUBROUTINE&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;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;: SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A simple subroutine must be labeled; without a label it cannot be executed. You cannot use field names in the subroutine, except within a FOR loop, even if the subroutine is always called from within a record loop.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example of a simple subroutine====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following request uses two subroutines. &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; Simple subroutine statements in the following example are described more fully after this example.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The first subroutine, &amp;lt;code&amp;gt;TOTAL&amp;lt;/code&amp;gt;, accumulates a total in the %variable named &amp;lt;code&amp;gt;%TOTAL.MUSTANGS&amp;lt;/code&amp;gt;. The second subroutine, &amp;lt;code&amp;gt;PRINT.TOTAL&amp;lt;/code&amp;gt;, prints a literal that varies depending on the total accumulated. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
MUSTANGS:    FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                MODEL = MUSTANG&lt;br /&gt;
             END FIND&lt;br /&gt;
             FOR EACH RECORD IN MUSTANGS&lt;br /&gt;
                CALL TOTAL&lt;br /&gt;
             END FOR&lt;br /&gt;
             CALL PRINT.TOTAL&lt;br /&gt;
TOTAL:       SUBROUTINE&lt;br /&gt;
                %TOTAL.MUSTANGS = %TOTAL.MUSTANGS + 1&lt;br /&gt;
                RETURN&lt;br /&gt;
             END SUBROUTINE TOTAL&lt;br /&gt;
PRINT.TOTAL: SUBROUTINE&lt;br /&gt;
                IF %TOTAL.MUSTANGS LE 10 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      NOT GREATER THAN 10&#039;&lt;br /&gt;
                ELSEIF %TOTAL.MUSTANGS LE 50 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      NOT GREATER THAN 50&#039;&lt;br /&gt;
                ELSEIF %TOTAL.MUSTANGS GT 50 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      GREATER THAN 50&#039;&lt;br /&gt;
                END IF&lt;br /&gt;
                RETURN&lt;br /&gt;
             END SUBROUTINE PRINT.TOTAL&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===JUMP TO statements===&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; compiles subroutines only after they are called, regardless of where they are in your program.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you use a &amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt; statement, its destination must be within the same subroutine. You cannot jump into a subroutine from outside of a subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===RETURN statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement returns control from the subroutine to the statement following the most recent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;RETURN&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;RETURN&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement can appear only within the body of a subroutine. Use of the &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement inside of an &amp;lt;var&amp;gt;ON&amp;lt;/var&amp;gt; unit terminates compilation, the procedure cannot run, and the following message is produced: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1779 RETURN IS INVALID IN ON UNITS, USE BYPASS STATEMENT&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;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; automatically generates a return at the end of a subroutine, if you do not specify one. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For more information, see [[#ON units|ON units]] and [[#Passing control to and from ON units|Passing control to and from ON units]].&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===END SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can end a subroutine using an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement or an &amp;lt;var&amp;gt;END BLOCK&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The END SUBROUTINE statement is formatted as follows:             &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;END SUBROUTINE &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;label&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;
===CALL statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement transfers control to the subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;CALL&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;CALL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;&lt;br /&gt;
&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:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;CALL.SUB: CALL COMPUTE.PREMIUM&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
transfers control to the following statement:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;COMPUTE.PREMIUM: SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When you use a simple subroutine, no arguments are passed in subroutine calls. Instead, input and output values are implicitly passed in %variables or global variables. If you want field values as arguments, you must assign the values to %variables before the call, or the subroutine must contain its own &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; loop on the set of records to be processed.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Processing continues sequentially from that statement until another control transfer statement &amp;amp;mdash; a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;IF&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STOP&amp;lt;/var&amp;gt; statement &amp;amp;mdash; is encountered. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Complex subroutines==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Complex subroutines perform all the operations of a simple subroutine. In addition, a complex subroutine can pass parameters via parameter lists and can declare local variables. &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 format of the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement changes for a complex subroutine and the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement is also more complex.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Symbolic parameter passing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can specify positional parameters on the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a complex subroutine. These parameters are substituted for symbolic parameters used within the subroutine during execution. You can use the following elements as parameters to a complex subroutine:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar %variables&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;%variable arrays&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Lists of records&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Local variable declaration===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Labels, %variables, and other elements in a complex subroutine are local to the subroutine; they do not conflict with elements of the same name in the request or in other complex subroutines. This allows the same element to be used in different portions of a request, and for the same name to describe different elements in each portion.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
All data within the subroutine is statically allocated. When the subroutine is called, the values of all found sets, counts, noted values, and variables are as they were when the subroutine was last executed. Recursive calls to the same subroutine do not allocate separate storage for each subroutine local variable. Local variables are allocated only one time.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====OPEN statement within a complex subroutine====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A SOUL &amp;lt;var&amp;gt;OPEN&amp;lt;/var&amp;gt; statement &amp;amp;mdash; an &amp;lt;var&amp;gt;OPEN&amp;lt;/var&amp;gt; statement inside a &amp;lt;var&amp;gt;BEGIN/END&amp;lt;/var&amp;gt; &amp;amp;mdash; when used within a complex subroutine on a file that is not defined to the region produces the following counting error and the request is not compiled:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1521: &amp;lt;i&amp;gt;entity-name&amp;lt;/i&amp;gt; DOES NOT EXIST OR REQUESTED ACCESS NOT AUTHORIZED&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===SUBROUTINE statement for complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Complex subroutines begin with the following form of the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&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;formal-parameter&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;inout-option&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;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;/p&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;formal-parameter&amp;lt;/var&amp;gt; is the declaration of a symbolic parameter used within the subroutine. The parameter list is comprised of the &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;formal-parameter&amp;lt;/var&amp;gt; and subsequent input-options. The parameter list is enclosed in parentheses, and it contains declarations for each parameter separated by commas. The parameter list must be specified on one logical line. Null parameters are not allowed.&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;formal-parameter&amp;lt;/var&amp;gt; specifies the name and type of element to be used within the subroutine and can be any of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar (nonarray) %variable formatted as:&amp;lt;/li&amp;gt;&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;%variable&amp;lt;/span&amp;gt; [IS] {[STRING] [LEN] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] &lt;br /&gt;
          &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; [FIXED [DP &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; FLOAT]}&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;SUBROUTINE EXAMPLE (%W IS STRING DP *         -&lt;br /&gt;
                    %X IS STRING LEN 40,      -&lt;br /&gt;
                    %Y IS STRING LEN 10 DP 2, -&lt;br /&gt;
                    %Z IS FLOAT,              -&lt;br /&gt;
                    %A IS FIXED DP 4)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable formatted as:&amp;lt;/li&amp;gt;&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;%variable&amp;lt;/span&amp;gt; [IS] [[STRING] [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] &lt;br /&gt;
 [ARRAY(* [,*[,*]])] [NO FIELD SAVE] &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;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;FIXED [DP &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; FLOAT&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; [ARRAY(* [,*[,*]])]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The number of dimensions must be specified in the subroutine declaration, but the exact size of each dimension is not specified. An asterisk (*) is used instead of the dimension size. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;SUBROUTINE EXAMPLE(%ARR IS STRING LEN 10 - ARRAY(*,*))&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list of records formatted as:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;[LIST] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/span&amp;gt; [IN [FILE | [PERM | TEMP] GROUP]] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt; &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The context of the list is restricted to a single file or group. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;SUBROUTINE GENERAL(LIST TOTRECS IN FILE VEHICLES)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/var&amp;gt; specifies whether a formal-parameter is to be used as input to the subroutine or passed as output from the subroutine. Options are as follows:&amp;lt;/p&amp;gt;&lt;br /&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;Option&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Data can be...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;INPUT&amp;lt;br&amp;gt;&lt;br /&gt;
(the default)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Passed into, but not out of, a subroutine. In addition, data conversions are performed automatically, in the same manner as an assignment statement. All references to &amp;lt;var&amp;gt;INPUT&amp;lt;/var&amp;gt; parameters that update the parameter, for example, assignment statements, result in compiler errors.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td nowrap&amp;gt;INPUT OUTPUT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This option is equivalent to the OUTPUT option. &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;OUTPUT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Returned from a subroutine. No data conversions are performed.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The lengths of complex subroutine string OUTPUT parameters are inherited from calling parameters. If the lengths are specified in the subroutine declaration, the following message is written to the audit trail: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1981 LENGTH IGNORED FOR OUTPUT PARAMETER&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Compilation and evaluation of the procedure continues, with the inherited length.&amp;lt;/p&amp;gt;&lt;br /&gt;
&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;
===END SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Like simple subroutines, a complex subroutine ends with an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement. However, unlike simple subroutines, you must not label the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement.   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
All declarations and statements compiled after the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement become a part of the subroutine until the &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement is encountered or until the request is ended with the &amp;lt;var&amp;gt;END&amp;lt;/var&amp;gt; statement.  &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===CALL statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The execution of a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement passes control to a complex subroutine. The first time a subroutine is called, all elements in the subroutine are initialized. Subsequently, each time the subroutine is called, all elements in the subroutine remain in the same state as they were when the subroutine was last exited. You are responsible for reinitializing the elements within the subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A complex subroutine is invoked with this form of the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;CALL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/span&amp;gt; [(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;actual-parameter&amp;lt;/span&amp;gt; [, ...])]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Where:&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;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;actual-parameter&amp;lt;/var&amp;gt; specifies the actual data that replaces the symbolic formal-parameter within the subroutine. At execution time, the value of each actual-parameter is substituted, based on the order in which it appears, for a formal-parameter declared for the subroutine. The correspondence of each formal-parameter in the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement to an actual-parameter in the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement is by position rather than by name.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An actual-parameter can be any of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;%variable or expression&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Expressions can contain field names, screen items, image items, and constants.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When an entire array is passed as a parameter, the %variable name is used with the percent (%) sign, but no parenthesis or subscript expressions follow it. 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;
%A IS FLOAT ARRAY(10,10)&lt;br /&gt;
DECLARE SUBROUTINE FDO(FLOAT ARRAY(*,*))&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL FDO (%A)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE FDO (%B IS FLOAT ARRAY(*,*))&lt;br /&gt;
   PRINT %B(1,1)&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;[[$ArrSize]]&amp;lt;/var&amp;gt; function can be used to determine the number of elements in a particular dimension of an array. &amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An actual-parameter can be a list, optionally preceded by the word LIST to distinguish it from a field name. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the compiler already knows of the formal-parameter list because the subroutine is already compiled or declared, the LIST keyword is unnecessary. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the list has never been declared in the request, a compilation error results. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Additional rules for parameters====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following additional rules apply to actual-parameters and parameter passing:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The maximum number of parameters that can be passed in complex subroutines is 63.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If the formal-parameter is specified as an OUTPUT parameter, the corresponding actual-parameter must match type.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The INPUT parameters of a %variable array requires that the type of the array &amp;amp;mdash; &amp;lt;var&amp;gt;FLOAT&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;FIXED&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; &amp;amp;mdash; the &amp;lt;var&amp;gt;DP&amp;lt;/var&amp;gt; specification, and the number of dimensions match the actual-parameter. In addition, if the &amp;lt;var&amp;gt;NO FIELD SAVE&amp;lt;/var&amp;gt; (&amp;lt;var&amp;gt;NO FS&amp;lt;/var&amp;gt;) option is specified for a &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; formal-parameter, it also must be specified for the corresponding actual-parameter and vice versa. All checking of array bounds within subroutines occurs during evaluation.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The INPUT parameters of a list requires the same file or group context as the actual-parameter.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;An INPUT parameter of a scalar %variable can be called with an actual-parameter that is an expression or %variable of a differing type. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; converts the actual-parameter to the type required by the subroutine, according to the rules of the assignment statement. The converted value has a separate storage location from the original variable or expression.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Passing arguments to INPUT parameters might involve truncation where the number of decimal places is different, or conversion to 0 for non-numeric strings.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;OUTPUT parameters of lists and %variable arrays follow the same rules as INPUT parameters for lists and %variable arrays.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;OUTPUT parameters of scalar %variables require that the actual-parameter supplied in the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement be another scalar %variable (no constants or expressions) of the same type &amp;amp;mdash; &amp;lt;var&amp;gt;FLOAT&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;FIXED&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; &amp;amp;mdash; and that the number of decimal places be the same, or the following message is issued by &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1725 PARAMETER NUMBER &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; IS TYPE INCOMPATIBLE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Strings can be of any length. The length used is that of the actual input parameter. &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;
===Processing complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Checking for the validity of parameter lists occurs during compilation. When the SUBROUTINE statement is compiled, the types of parameters are saved by the compiler, and any subsequent CALL statements are verified as to whether the actual parameter is consistent with the type of formal parameter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When a CALL statement is compiled and the subroutine to which it refers has not been compiled, the compiler verifies whether the actual parameter list is compatible with other CALL statements for the subroutine that it has already compiled. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The compiler cannot verify that the actual parameters are compatible with the SUBROUTINE statement until that SUBROUTINE statement is compiled. If the compiler then detects a CALL statement that is not compatible with the SUBROUTINE statement, an error is issued at that time. Checking is done at compile time, so a statement that is not executed during evaluation can still generate an error.    &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===DECLARE SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The DECLARE statement for a complex subroutine is similar to the SUBROUTINE statement, except that the parameter names are omitted. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
The complete syntax for the DECLARE SUBROUTINE statement is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;DECLARE SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&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; &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;inout-option&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;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;/p&amp;gt;&lt;br /&gt;
Where:&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;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;type&amp;lt;/var&amp;gt; is one of the following:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar %variable of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;{STRING [LEN] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] | [FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT]}&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;{STRING [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] [ARRAY(* [,*[,*]]) [NO FIELD SAVE]]&lt;br /&gt;
 | [FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT] [ARRAY(* [,*[,*]])]}&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list of records of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;[LIST] [IN {FILE | [PERM | TEMP] GROUP} &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/var&amp;gt; specifies whether each formal parameter is to be used as input to the subroutine or passed as output from the subroutine. Options are the same as those that can be specified on the SUBROUTINE statement: INPUT, OUTPUT, or INPUT OUTPUT. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====DECLARE before CALL====&lt;br /&gt;
When a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement refers to a subroutine that has not yet been compiled, the error checking capabilities of the compiler are limited, because the number and type of formal parameters are not known to the compiler. If the first &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a particular subroutine is not correctly coded, then a large number of error messages can be generated when compiling subsequent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statements, although these statements might be correctly coded.&lt;br /&gt;
&lt;br /&gt;
You can avoid this problem in one of the following ways:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declare the formal parameter list with the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement. When the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement precedes the first &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;, the compiler generates the correct error messages, if problems are encountered. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Place the subroutine before the first &amp;lt;var&amp;gt;CALL&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;
====Specifying a list of records====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you specify a &amp;lt;var&amp;gt;LIST&amp;lt;/var&amp;gt; (of records), you must also specify &amp;lt;var&amp;gt;FILE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;GROUP&amp;lt;/var&amp;gt;. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;OPEN METADATA&lt;br /&gt;
password&lt;br /&gt;
 &lt;br /&gt;
BEGIN&lt;br /&gt;
    DECLARE LIST ORIG IN METADATA&lt;br /&gt;
    DECLARE SUBROUTINE THE.SUB(LIST IN FILE METADATA INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    CALL THE.SUB (LIST ORIG)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE THE.SUB(LIST ORIG IN METADATA INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
END SUBROUTINE THE.SUB&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you do not specify &amp;lt;var&amp;gt;FILE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;GROUP&amp;lt;/var&amp;gt; in the code, you receive the following error message:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1725: PARAMETER NUMBER n IS TYPE INCOMPATIBLE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====DECLARE parameters and CALL parameters====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, note that the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement lists the formal parameters, while the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement lists the actual parameters:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE SUBROUTINE SUB1(FLOAT, FIXED DP 2, STRING, STRING DP *)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
   CALL SUB1(%INCREASE,%WAGES,%NAME,%DEPT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
  SUBROUTINE SUB1(%A IS FLOAT,&lt;br /&gt;
                %B IS FIXED DP 2,&lt;br /&gt;
                %C IS STRING,&lt;br /&gt;
                %D IS STRING DP *)&lt;br /&gt;
  END SUBROUTINE&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Impact on CALL and SUBROUTINE statements====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statements are not overridden when a &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement is present. The &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement does not cause the compiler to use more table space, nor does it alter the way in which the compiler output is generated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Rocket Software recommends that you use a &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement before the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a subroutine or that you place the subroutine itself before the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. Error reporting will be more complete and specific to the subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Exiting the subroutine===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement returns control to the statement immediately following the most recent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. If an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;END&amp;lt;/var&amp;gt; statement is encountered without a &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement, &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; processing is implied and automatically added by the compiler. More than one &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement can be specified in a subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If a &amp;lt;var&amp;gt;JUMP&amp;lt;/var&amp;gt; statement is used within a subroutine, its destination must be within the same subroutine. You cannot jump into a subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A &amp;lt;var&amp;gt;STOP&amp;lt;/var&amp;gt; statement, when executed inside a subroutine, terminates the request in the same manner as it does when executed outside a subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Examples using complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, an employee name with regular and overtime hours is passed to the subroutine &amp;lt;code&amp;gt;CALC.WAGES&amp;lt;/code&amp;gt;. The total pay is returned and a list of records processed by the routine is updated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DECLARE SUBROUTINE CALC.WAGES(FIXED DP 2, -&lt;br /&gt;
        FIXED DP 2, STRING, FIXED DP 2 OUTPUT, -&lt;br /&gt;
        LIST IN FILE EMPLOYEE INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL CALC.WAGES(%R.HRS, %OT.HRS, %NAME, -&lt;br /&gt;
                %TOTAL.PAY, LIST EMPLST)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE CALC.WAGES(%REG IS FIXED DP 2, -&lt;br /&gt;
                %OT IS FIXED DP 2, -&lt;br /&gt;
                %E.NAME IS STRING, -&lt;br /&gt;
                %TOTAL IS FIXED DP 2 OUTPUT, -&lt;br /&gt;
                LIST EMPLIST IN FILE EMPLOYEE INOUT)&lt;br /&gt;
 &lt;br /&gt;
%TEMP IS FIXED DP 2&lt;br /&gt;
 &lt;br /&gt;
WAGES1: IN EMPLOYEE FIND ALL RECORDS FOR WHICH&lt;br /&gt;
           NAME = %E.NAME&lt;br /&gt;
        END FIND&lt;br /&gt;
        FOR EACH RECORD IN WAGES1&lt;br /&gt;
           %TEMP = (RATE * %REG)&lt;br /&gt;
           %TOTAL = %TEMP + (RATE * 1.5 * %OT)&lt;br /&gt;
        END FOR&lt;br /&gt;
        PLACE RECORDS IN WAGES1 ON LIST EMPLIST&lt;br /&gt;
        RETURN&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, an entire array is passed as a single subroutine parameter:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%NUMBERS IS FLOAT ARRAY(10,10)&lt;br /&gt;
%MAX IS FLOAT&lt;br /&gt;
   DECLARE SUBROUTINE MAXIMUM(FLOAT ARRAY(*,*), -&lt;br /&gt;
     FLOAT OUTPUT)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   CALL MAXIMUM(%NUMBERS,%MAX)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE MAXIMUM(%ARR IS FLOAT ARRAY(*,*), -&lt;br /&gt;
           %M IS FLOAT OUTPUT)&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
%J IS FIXED&lt;br /&gt;
   %M = 0&lt;br /&gt;
   FOR %I FROM 1 TO $arrsize(&#039;%ARR&#039;,1)&lt;br /&gt;
      FOR %J FROM 1 TO $arrsize(&#039;%ARR&#039;,2)&lt;br /&gt;
         IF %ARR(%I,%J) GT %M THEN&lt;br /&gt;
            %M = %ARR(%I,%J)&lt;br /&gt;
         END IF&lt;br /&gt;
      END FOR&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sharing common elements==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An element that is not passed as a parameter can be shared between complex subroutines, or between a complex subroutine and the main request, when it is declared as a common element. A common element is created by using the DECLARE statement or by using the COMMON keyword on a %variable IS declaration. For an element to be shared, it must be declared as common in every place (each separate scope) in which it is used.      &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Scope of elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The scope of an element refers to the area within a request in which an element has a particular meaning. In User Language, complex subroutines have a different scope than the remainder of the request (the elements of a complex subroutine differ from the elements outside the subroutine even when they have the same name). This concept applies to labels, lists, %variables and %variable arrays, menus, screens, and images.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The elements of the main request (the statements not enclosed by any SUBROUTINE/END SUBROUTINE statements) and the elements of all simple subroutines share the same scope. Simple subroutines share the same elements with the main request and all other simple subroutines within the request.     &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Shareable elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following elements can be shared if they are declared as common:&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====%variables and %variable arrays====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share %variables if a DECLARE %variable or a %variable IS statement that declares the %variable as common is present in each portion of the request where you use the %variable. The %variable must have the same type, length, number of decimal places, and FIELD SAVE option in each declaration. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Lists of records====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share a list if a DECLARE statement that declares the list as common is contained in each place where you use the list. The declaration of the list must precede the first reference to that list, or &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; declares the list implicitly without the common attribute.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Found sets====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share found sets if the label of the FIND statement is declared as common. To effectively share a found set, follow these steps:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add a DECLARE statement that declares the statement label as common before the actual label in the portion of the request where the FIND statement will be executed.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add a DECLARE statement that declares the label as common to any parts of the request that require access to that found set. These parts, however, cannot contain a label with the same name, or a compiler error occurs. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
After execution of the FIND statement, you can access the record set in any portion of the request that contains the proper DECLARE statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Menus and screens====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share a menu or screen as common under the following conditions: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The first reference to the menu or screen must be the complete definition of the menu or screen, with the COMMON keyword following the MENU or SCREEN statement.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Other parts of the request can reference the same menu or screen by using an abbreviated declaration of the form:&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE [MENU menuname | SCREEN screenname] COMMON&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the complete definition of the menu or screen exists, and if that definition was declared as common, the menu or screen is shared. If not, a compiler error results. Two or more complete menu or screen definitions with the COMMON keyword also result in a compiler error.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you use a menu or screen %variable (:%variable) within a complex subroutine to refer to a COMMON screen element, you must include a common declaration for each possible value of the menu or screen name. &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;
====Images====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The sharing of images follows the same rules used for the sharing of menus and screens. If multiple images are contained within the same block, then the following rules also apply:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You can use the COMMON keyword on only the first IMAGE statement of a block. All other images within the same block are automatically considered as candidates for sharing as common data.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;All other parts of the request that access common images must contain the following abbreviated form of the DECLARE statement for each image to which access is required: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE IMAGE imagename COMMON&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
===DECLARE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can use the DECLARE statement to perform the following functions:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Specify subroutine formal parameter types.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Specify variables, labels, lists, menus, screens, and images as COMMON.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Menus and screens are discussed in detail in [[Full-screen feature]]. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Images are discussed in detail in [[Images]].&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To declare lists without having to use an &amp;lt;code&amp;gt;IN filename CLEAR LIST listname&amp;lt;/code&amp;gt; clause. See [[Lists#Creating and clearing a list|Creating and clearing a list]].&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To declare %variables, see [[Using variables and values in computation]]. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the DECLARE statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;DECLARE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;declaration&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;span class=&amp;quot;term&amp;quot;&amp;gt;declaration&amp;lt;/span&amp;gt; is one of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;LABEL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
[LIST] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/span&amp;gt; [IN [FILE [PERM | TEMP] GROUP] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;]&lt;br /&gt;
                [COMMON]&lt;br /&gt;
 &lt;br /&gt;
IMAGE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;imagename&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
MENU &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;menuname&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
SCREEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;screenname&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; [IS] {FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT}&lt;br /&gt;
 [ARRAY(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d1&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d2&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d3&amp;lt;/span&amp;gt;]])] [COMMON]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; [IS] STRING [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;dn1&amp;lt;/span&amp;gt; | *}]&lt;br /&gt;
 [ARRAY(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d1&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d2&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d3&amp;lt;/span&amp;gt;]])] [NO FIELD SAVE] [COMMON]&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/span&amp;gt;[(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;type&amp;lt;/span&amp;gt; [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/span&amp;gt;] [,...]) ]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For example, the DECLARE statement declares the list RECNAMES in the following request:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DECLARE LIST RECNAMES&lt;br /&gt;
DECLARE SUBROUTINE REGION(LIST OUTPUT, STRING)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL REGION(LIST RECNAMES, &#039;NORTHEAST&#039;)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE REGION(LIST RGNLST OUTPUT, -&lt;br /&gt;
                  %REGION IS STRING)&lt;br /&gt;
 &lt;br /&gt;
R1: IN EMPLOYEE FIND ALL RECORDS FOR WHICH&lt;br /&gt;
       REGION = %REGION&lt;br /&gt;
R2: PLACE RECORDS IN R1 ON LIST RGNLIST&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Defining common variables===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can define common variables at the beginning of all programs without later redefinitions. The syntax lets you use the %VAR IS COMMON clause without duplicating the previous attributes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
However, if attributes, such as STRING or LEN, are included in the redefinition, which differ from those previously defined, a compilation error occurs. In addition, if the variable is not previously defined, it is allocated based on the current default variable definition. &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;
VARIABLES ARE STRING LEN 20 &lt;br /&gt;
%X IS STRING LEN 3 INITIAL (&#039;AAA&#039;) STATIC COMMON &lt;br /&gt;
SUBROUTINE A&lt;br /&gt;
  * full definition on next line no longer required&lt;br /&gt;
  ** %X IS STRING LEN 3 INITIAL (&#039;AAA&#039;) STATIC COMMON&lt;br /&gt;
  * new syntax on next line replaces previous line&lt;br /&gt;
  %X IS COMMON  /? defaults to previous %X definition ?/&lt;br /&gt;
  CALL B&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE B&lt;br /&gt;
  * But next line will fail compile since %X already exists&lt;br /&gt;
  %X IS STRING LEN 4 COMMON  /? compiler error ?/&lt;br /&gt;
  * And the next line will result in a default definition&lt;br /&gt;
  * since %Y is not previously defined.&lt;br /&gt;
  %Y IS COMMON&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
PRINT %X&lt;br /&gt;
CALL A&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Shared common element examples===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following examples illustrate the differences between data that is locally scoped and data that is shared using the COMMON keyword. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 1====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the variable %I assumes different values depending upon which part of the request is being executed:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   DECLARE SUBROUTINE SUBR1(STRING)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
FOR %I FROM 1 TO 10&lt;br /&gt;
   CALL SUBR1(%ARR(%I))&lt;br /&gt;
END FOR&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
SUBROUTINE SUBR1(%A IS STRING)&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   FOR %I FROM 1 TO 10&lt;br /&gt;
      PRINT %I and %A&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 2====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the screen EXAMPLE and the %A and %B variables retain the same values no matter which part of the request is being executed:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
SCREEN EXAMDEF COMMON&lt;br /&gt;
   TITLE &#039;THIS IS A COMMON SCREEN DEFINITION&#039;&lt;br /&gt;
   PROMPT &#039;ENTER VALUE&#039;&lt;br /&gt;
   INPUT FLD1 AT 10 LEN 20 PAD &#039;_&#039;&lt;br /&gt;
END SCREEN&lt;br /&gt;
%A IS STRING LEN 10 COMMON&lt;br /&gt;
%B IS FLOAT COMMON&lt;br /&gt;
DECLARE SUBROUTINE SUBR1(STRING LEN 10)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
SUBROUTINE SUBR1(%Z IS STRING LEN 10)&lt;br /&gt;
DECLARE SCREEN EXAMDEF COMMON&lt;br /&gt;
%A IS STRING LEN 10 COMMON&lt;br /&gt;
%B IS FLOAT COMMON&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 3====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the main request and the subroutine share the common data of an array and a found set:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%COM.ARRAY IS STRING LEN 10 ARRAY(10,10) COMMON&lt;br /&gt;
DECLARE LABEL ALL.RECS COMMON&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
DECLARE SUBROUTINE EXAMPLE&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
ALL.RECS: FIND ALL RECORDS&lt;br /&gt;
          END FIND&lt;br /&gt;
          %I = 0&lt;br /&gt;
          %J = 1&lt;br /&gt;
          FOR 10 RECORDS IN ALL.RECS&lt;br /&gt;
             %I = %I + 1&lt;br /&gt;
             %COM.ARRAY(%I,%J) = FLD&lt;br /&gt;
          END FOR&lt;br /&gt;
          CALL EXAMPLE&lt;br /&gt;
          STOP&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE EXAMPLE&lt;br /&gt;
%COM.ARRAY IS STRING LEN 10 ARRAY(10,10) COMMON&lt;br /&gt;
DECLARE LABEL ALL.RECS COMMON&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   %I = 0&lt;br /&gt;
   %J = 2&lt;br /&gt;
   FOR 10 RECORDS IN ALL.RECS&lt;br /&gt;
      %I = %I + 1&lt;br /&gt;
      %COM.ARRAY(%I,%J) = FLD2&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the preceding example, the main request updates column 1 of the array %COMM.ARRAY with the contents of FLD. The subroutine, EXAMPLE, updates column 2 of the same array with the contents of FLD2. Both the array %COM.ARRAY and the found set ALL.RECS are shared by using the COMMON keyword. %I and %J are both local variables. %I is local because it was declared without the COMMON keyword; %J is local because it was not declared at all.                       &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;On statement&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- The two reasonable section names for ... --&amp;gt;&lt;br /&gt;
==On units==  &amp;lt;!-- Be sure to keep with &amp;lt;div&amp;gt; tags preceding this --&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit lets you specify a course of action following a triggering event, such as the terminal operator pressing one of the &amp;lt;var&amp;gt;Attention&amp;lt;/var&amp;gt; identifier (AID) keys. The &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit provides an application with a way to override the normal system response. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To define an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit, use an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; block in the following format:&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;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;] On &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;unittype&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;statement&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;...&amp;lt;/span&amp;gt;&lt;br /&gt;
End On&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;unittype&amp;lt;/var&amp;gt; is one of the following:&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;unittype&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;You can specify the course of action to take if...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;ATTENTION&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The end user invokes the attention feature (for example, presses the &amp;lt;var&amp;gt;BREAK, ATTN,&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;PA1&amp;lt;/var&amp;gt; key, or enters &amp;lt;var&amp;gt;*CANCEL&amp;lt;/var&amp;gt;).     &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;ERROR&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; cancels a request. Before a request is canceled or, for transaction backout files, after the current transaction is backed out, the ON ERROR unit is processed instead of returning control to the terminal command level. For more information on transaction backout files, see [[Data recovery]].    &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td nowrap&amp;gt;FIELD CONSTRAINT&lt;br /&gt;
CONFLICT (FCC)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;There are field level constraint conflicts. Violating the UNIQUE and AT-MOST-ONE attributes causes field-level conflicts.*&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;FIND CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A conflict arises evaluating a FIND statement or a FOR EACH RECORD statement used for retrieval.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;MISSING FILE&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A remote file is no longer available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;MISSING MEMBER&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A remote optional member is no longer available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;RECORD LOCKING CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A conflict arises during a record locking attempt.&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 you have procedures written for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; V2R1.0 that use ON FCC for UNIQUE fields, and you are planning to use ON FCC for AT-MOST-ONE fields, you might need to rewrite the ON FCC unit to take the new value of $UPDSTAT (2 for AT-MOST-ONE) into account. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Several $functions provide information about conflicts. They 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&amp;gt;[[$UpdFile]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdFld]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdOval]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdRec]]&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;[[$UpdStat]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdStmt]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdVal]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UnqRec]]&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;
===Body of an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The body of the ON unit consists of statements immediately following the ON statement. Any User Language statement can appear within an ON unit except the SUBROUTINE statement.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Ending an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You must conclude an ON unit with either an END ON statement or an END BLOCK statement. The format of the END ON statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;END ON [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&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;label&amp;lt;/var&amp;gt; is the label of the statement that began the ON statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Processing an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When an ON statement is evaluated, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; remembers the location of the ON unit body (the statement after the ON statement and within the unit), but does not immediately evaluate the body. Instead, it passes control to the statement immediately following the ON unit. The ON unit body is evaluated only when the triggering event takes place.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Usage guidelines for ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Note the following considerations when using ON units:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You must define the ON unit before it is invoked (that is, you should typically place the ON unit near the beginning of your procedure). &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A subsequent definition of an ON unit of the same kind replaces the previous one. For example, if you define two ON ATTN units, the second one becomes the current one.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump to destinations within the same ON unit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump out of an ON unit only to unnested, labeled statements.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You cannot jump into an ON unit.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump outside of an ON unit only if the ON unit is part of a main routine or part of a complex subroutine. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You cannot jump out of an ON unit contained in a simple subroutine, regardless of whether the destination is within the subroutine or back in the mainline program, because ON units are part of the mainline program; hence, there is no scoping of ON units. This restriction ensures that the ON unit is executed and the control returned to the main routine.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;li&amp;gt;An ON unit definition is not preserved when a request is continued with an END MORE statement and a MORE command. Each new request continuation must define its own ON units. (See [[Large request considerations#Rules for request continuation|Rules for request continuation]].)&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;For complex subroutines, an active ON unit is temporarily disabled when a subroutine is called that contains an ON UNIT of the same type; it is restored when the subroutine returns. Any ON unit enabled during the execution of a subroutine is replaced by the active ON unit at the time of the last CALL statement as soon as the RETURN statement is evaluated.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ON units coded inside complex subroutines can contain JUMP statements that specify a destination outside the ON unit. The destination must be to an unnested labeled statement within the complex subroutine. Also, if the ON unit is to be jumped out of, the condition that causes the ON unit to be invoked must be raised in the subroutine that contains the ON unit.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This prevents a lower level subroutine from returning inadvertently by raising a condition for which there is an ON unit coded in a higher level subroutine. If the inadvertent return is attempted, the request is canceled. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ON units do not have their own local data and labels. They inherit the scope of the part of the program in which they are compiled. An ON unit that is compiled within a complex subroutine is considered part of only that subroutine. &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, if the user presses the&amp;lt;var&amp;gt; ATTN&amp;lt;/var&amp;gt; key instead of entering a response to the prompt in the GET.REC.TYPE statement, the ON ATTENTION unit sets %FLAG to 1. The FLAG.SET statement tests %FLAG. If %FLAG is set, the request branches to END.REQUEST and the FIND statement is not executed. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%FLAG=0&lt;br /&gt;
              ON ATTENTION&lt;br /&gt;
                 %FLAG=1&lt;br /&gt;
                 BYPASS&lt;br /&gt;
              END ON&lt;br /&gt;
GET.REC.TYPE: %TYPE=$READ(&#039;ENTER RECORD TYPE&#039;)&lt;br /&gt;
FLAG.SET:     IF %FLAG=1 THEN&lt;br /&gt;
                 JUMP TO END.REQUEST&lt;br /&gt;
              END IF&lt;br /&gt;
FIND.RECS:    FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                 TYPE = %TYPE&lt;br /&gt;
              END FIND&lt;br /&gt;
                 .&lt;br /&gt;
                 .&lt;br /&gt;
                 .&lt;br /&gt;
END.REQUEST:&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Only one ON unit at a time===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Only one ON unit of each kind is active at a time. For example, the processing of a second ON ERROR statement resets the current ON ERROR unit, but does not affect the current ON ATTENTION unit. Thus, you can redefine what to do in a variety of cases by having several ON statements and units within a request. An ON unit can be redefined within another ON unit.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Passing control to and from ON units===&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; passes control to an ON unit when the triggering event occurs. For example, an ON ATTENTION unit receives control when a user presses one of the ATTENTION identifier (AID) keys at the terminal during the execution of a request. Use one of the following statements to return control to the body of the request.    &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====BYPASS statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The BYPASS statement handles the various unittypes of an ON statement as follows:&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;For unittype...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;The BYPASS statement...&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;ON MISSING FILE&amp;lt;br&amp;gt;&lt;br /&gt;
ON MISSING MEMBER&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately after the END FOR statement that closes the current FOR loop. &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;ON ERROR&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ends the request.&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 nowrap&amp;gt;ON ATTENTION&amp;lt;br&amp;gt;&lt;br /&gt;
ON FIND CONFLICT&amp;lt;br&amp;gt;&lt;br /&gt;
ON RECORD LOCKING CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately after the statement that invoked the ON unit.&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;
The format of the BYPASS statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;BYPASS [PENDING STATEMENT]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where the PENDING STATEMENT keyword is optional. If the ON unit is not ended with a BYPASS statement, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; automatically generates a STOP statement at the end of the unit.   &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====CONTINUE statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The CONTINUE statement is supported only with the Parallel Query Option. If you lose access to a group member that is an optional file during FOR processing, the CONTINUE statement continues FOR processing with the next available file, and skips any other unavailable files.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====JUMP TO statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The JUMP statement, when used to jump to a labeled statement outside the ON unit, causes the request to continue at that point. There are restrictions pertaining to jumps; see [[Flow of control in User Language#Branching statements|Branching statements]] and [[#Simple subroutines|Simple subroutines]]. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====RETRY statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The RETRY statement passes control to the statement that invoked the ON unit, thereby retrying that statement. The RETRY statement is not valid in an ON ERROR unit.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the RETRY statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;RETRY [PENDING STATEMENT]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where the &amp;lt;var&amp;gt;PENDING STATEMENT&amp;lt;/var&amp;gt; keyword is optional.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====STOP statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The STOP statement is used to end the request.         &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Clearing ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can issue the following statement to clear the definition of an ON unit:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;CLEAR ON &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;unittype&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This statement clears any defined ON unit of the type specified. Clearing an ON unit produces the following results:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;After a CLEAR ON ATTENTION, pressing one of the ATTENTION identifier (AID) keys at the terminal does not invoke the ON ATTENTION unit.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;After a CLEAR ON ERROR, a request cancellation error does not invoke the ON ERROR unit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An ON unit can be defined, cleared, and then redefined. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Pausing during the request===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The PAUSE statement can be used with ON units to cause the request to wait a specified time and then to retry the statement that caused the evaluation of the ON unit. PAUSE is typically used with the other ON unit types (RECORD LOCKING CONFLICT and ON FIND CONFLICT) and is discussed in [[Record level locking and concurrency control]].   &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>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Subroutines&amp;diff=78429</id>
		<title>Subroutines</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Subroutines&amp;diff=78429"/>
		<updated>2015-07-23T03:40:47Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Defining common variables */&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;
User Language lets you treat a single set of statements as a simple or complex subroutine. You can:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Execute simple subroutines a number of times from different locations within a request.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Use complex subroutines as you would simple subroutines. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
In addition, you can:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Pass parameters via parameter lists.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declare variables locally.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Common elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An element that is not passed as a parameter can be shared between complex subroutines, or between a complex subroutine and the main request, when you declare that element as COMMON.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An ON unit specifies a response action to a triggering event: for example, the terminal operator pressing one of the ATTENTION identifier (AID) keys. ON units let an application override the normal system response.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Simple subroutines==&lt;br /&gt;
 &lt;br /&gt;
===Outlining a simple subroutine===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following statements are used in simple subroutines within a request:&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;Statement&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Purpose&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transfers control to the subroutine.&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&amp;gt;&amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Indicates the end of the subroutine.&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&amp;gt;&amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transfers control to another statement in the request.&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&amp;gt;&amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately following the CALL statement. &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&amp;gt;&amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Indicates the beginning of a subroutine. &amp;lt;/td&amp;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;
The statements are coded in the following sequence, so they are described in order of usage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statements as appropriate&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A simple subroutine consists of a sequence of SOUL statements that must begin with a &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement. The body of the subroutine is composed of the statements immediately following the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;SUBROUTINE&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;&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;: SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A simple subroutine must be labeled; without a label it cannot be executed. You cannot use field names in the subroutine, except within a FOR loop, even if the subroutine is always called from within a record loop.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example of a simple subroutine====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following request uses two subroutines. &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; Simple subroutine statements in the following example are described more fully after this example.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The first subroutine, &amp;lt;code&amp;gt;TOTAL&amp;lt;/code&amp;gt;, accumulates a total in the %variable named &amp;lt;code&amp;gt;%TOTAL.MUSTANGS&amp;lt;/code&amp;gt;. The second subroutine, &amp;lt;code&amp;gt;PRINT.TOTAL&amp;lt;/code&amp;gt;, prints a literal that varies depending on the total accumulated. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
MUSTANGS:    FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                MODEL = MUSTANG&lt;br /&gt;
             END FIND&lt;br /&gt;
             FOR EACH RECORD IN MUSTANGS&lt;br /&gt;
                CALL TOTAL&lt;br /&gt;
             END FOR&lt;br /&gt;
             CALL PRINT.TOTAL&lt;br /&gt;
TOTAL:       SUBROUTINE&lt;br /&gt;
                %TOTAL.MUSTANGS = %TOTAL.MUSTANGS + 1&lt;br /&gt;
                RETURN&lt;br /&gt;
             END SUBROUTINE TOTAL&lt;br /&gt;
PRINT.TOTAL: SUBROUTINE&lt;br /&gt;
                IF %TOTAL.MUSTANGS LE 10 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      NOT GREATER THAN 10&#039;&lt;br /&gt;
                ELSEIF %TOTAL.MUSTANGS LE 50 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      NOT GREATER THAN 50&#039;&lt;br /&gt;
                ELSEIF %TOTAL.MUSTANGS GT 50 THEN&lt;br /&gt;
                   PRINT &#039;TOTAL MUSTANG POLICIES -&lt;br /&gt;
                      GREATER THAN 50&#039;&lt;br /&gt;
                END IF&lt;br /&gt;
                RETURN&lt;br /&gt;
             END SUBROUTINE PRINT.TOTAL&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===JUMP TO statements===&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; compiles subroutines only after they are called, regardless of where they are in your program.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you use a &amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt; statement, its destination must be within the same subroutine. You cannot jump into a subroutine from outside of a subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===RETURN statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement returns control from the subroutine to the statement following the most recent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;RETURN&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;RETURN&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement can appear only within the body of a subroutine. Use of the &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement inside of an &amp;lt;var&amp;gt;ON&amp;lt;/var&amp;gt; unit terminates compilation, the procedure cannot run, and the following message is produced: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1779 RETURN IS INVALID IN ON UNITS, USE BYPASS STATEMENT&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;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; automatically generates a return at the end of a subroutine, if you do not specify one. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For more information, see [[#ON units|ON units]] and [[#Passing control to and from ON units|Passing control to and from ON units]].&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===END SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can end a subroutine using an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement or an &amp;lt;var&amp;gt;END BLOCK&amp;lt;/var&amp;gt; statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The END SUBROUTINE statement is formatted as follows:             &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;END SUBROUTINE &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;label&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;
===CALL statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement transfers control to the subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the &amp;lt;var&amp;gt;CALL&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;CALL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;&lt;br /&gt;
&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:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;CALL.SUB: CALL COMPUTE.PREMIUM&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
transfers control to the following statement:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;COMPUTE.PREMIUM: SUBROUTINE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When you use a simple subroutine, no arguments are passed in subroutine calls. Instead, input and output values are implicitly passed in %variables or global variables. If you want field values as arguments, you must assign the values to %variables before the call, or the subroutine must contain its own &amp;lt;var&amp;gt;FOR EACH RECORD&amp;lt;/var&amp;gt; loop on the set of records to be processed.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Processing continues sequentially from that statement until another control transfer statement &amp;amp;mdash; a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;IF&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;JUMP TO&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STOP&amp;lt;/var&amp;gt; statement &amp;amp;mdash; is encountered. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Complex subroutines==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Complex subroutines perform all the operations of a simple subroutine. In addition, a complex subroutine can pass parameters via parameter lists and can declare local variables. &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 format of the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement changes for a complex subroutine and the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement is also more complex.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Symbolic parameter passing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can specify positional parameters on the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a complex subroutine. These parameters are substituted for symbolic parameters used within the subroutine during execution. You can use the following elements as parameters to a complex subroutine:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar %variables&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;%variable arrays&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Lists of records&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Local variable declaration===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Labels, %variables, and other elements in a complex subroutine are local to the subroutine; they do not conflict with elements of the same name in the request or in other complex subroutines. This allows the same element to be used in different portions of a request, and for the same name to describe different elements in each portion.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Processing===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
All data within the subroutine is statically allocated. When the subroutine is called, the values of all found sets, counts, noted values, and variables are as they were when the subroutine was last executed. Recursive calls to the same subroutine do not allocate separate storage for each subroutine local variable. Local variables are allocated only one time.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====OPEN statement within a complex subroutine====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A SOUL &amp;lt;var&amp;gt;OPEN&amp;lt;/var&amp;gt; statement &amp;amp;mdash; an &amp;lt;var&amp;gt;OPEN&amp;lt;/var&amp;gt; statement inside a &amp;lt;var&amp;gt;BEGIN/END&amp;lt;/var&amp;gt; &amp;amp;mdash; when used within a complex subroutine on a file that is not defined to the region produces the following counting error and the request is not compiled:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1521: &amp;lt;i&amp;gt;entity-name&amp;lt;/i&amp;gt; DOES NOT EXIST OR REQUESTED ACCESS NOT AUTHORIZED&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===SUBROUTINE statement for complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Complex subroutines begin with the following form of the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&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;formal-parameter&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;inout-option&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;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;/p&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;formal-parameter&amp;lt;/var&amp;gt; is the declaration of a symbolic parameter used within the subroutine. The parameter list is comprised of the &amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;formal-parameter&amp;lt;/var&amp;gt; and subsequent input-options. The parameter list is enclosed in parentheses, and it contains declarations for each parameter separated by commas. The parameter list must be specified on one logical line. Null parameters are not allowed.&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;formal-parameter&amp;lt;/var&amp;gt; specifies the name and type of element to be used within the subroutine and can be any of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar (nonarray) %variable formatted as:&amp;lt;/li&amp;gt;&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;%variable&amp;lt;/span&amp;gt; [IS] {[STRING] [LEN] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] &lt;br /&gt;
          &amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt; [FIXED [DP &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; FLOAT]}&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;SUBROUTINE EXAMPLE (%W IS STRING DP *         -&lt;br /&gt;
                    %X IS STRING LEN 40,      -&lt;br /&gt;
                    %Y IS STRING LEN 10 DP 2, -&lt;br /&gt;
                    %Z IS FLOAT,              -&lt;br /&gt;
                    %A IS FIXED DP 4)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable formatted as:&amp;lt;/li&amp;gt;&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;%variable&amp;lt;/span&amp;gt; [IS] [[STRING] [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] &lt;br /&gt;
 [ARRAY(* [,*[,*]])] [NO FIELD SAVE] &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;squareb&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;FIXED [DP &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; FLOAT&amp;lt;span class=&amp;quot;squareb&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; [ARRAY(* [,*[,*]])]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The number of dimensions must be specified in the subroutine declaration, but the exact size of each dimension is not specified. An asterisk (*) is used instead of the dimension size. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;SUBROUTINE EXAMPLE(%ARR IS STRING LEN 10 - ARRAY(*,*))&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list of records formatted as:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;[LIST] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/span&amp;gt; [IN [FILE | [PERM | TEMP] GROUP]] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt; &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The context of the list is restricted to a single file or group. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;SUBROUTINE GENERAL(LIST TOTRECS IN FILE VEHICLES)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/var&amp;gt; specifies whether a formal-parameter is to be used as input to the subroutine or passed as output from the subroutine. Options are as follows:&amp;lt;/p&amp;gt;&lt;br /&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;Option&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Data can be...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;INPUT&amp;lt;br&amp;gt;&lt;br /&gt;
(the default)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Passed into, but not out of, a subroutine. In addition, data conversions are performed automatically, in the same manner as an assignment statement. All references to &amp;lt;var&amp;gt;INPUT&amp;lt;/var&amp;gt; parameters that update the parameter, for example, assignment statements, result in compiler errors.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td nowrap&amp;gt;INPUT OUTPUT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;This option is equivalent to the OUTPUT option. &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;OUTPUT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Returned from a subroutine. No data conversions are performed.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The lengths of complex subroutine string OUTPUT parameters are inherited from calling parameters. If the lengths are specified in the subroutine declaration, the following message is written to the audit trail: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1981 LENGTH IGNORED FOR OUTPUT PARAMETER&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Compilation and evaluation of the procedure continues, with the inherited length.&amp;lt;/p&amp;gt;&lt;br /&gt;
&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;
===END SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Like simple subroutines, a complex subroutine ends with an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement. However, unlike simple subroutines, you must not label the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement.   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
All declarations and statements compiled after the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement become a part of the subroutine until the &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; statement is encountered or until the request is ended with the &amp;lt;var&amp;gt;END&amp;lt;/var&amp;gt; statement.  &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===CALL statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The execution of a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement passes control to a complex subroutine. The first time a subroutine is called, all elements in the subroutine are initialized. Subsequently, each time the subroutine is called, all elements in the subroutine remain in the same state as they were when the subroutine was last exited. You are responsible for reinitializing the elements within the subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A complex subroutine is invoked with this form of the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;CALL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/span&amp;gt; [(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;actual-parameter&amp;lt;/span&amp;gt; [, ...])]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Where:&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;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;actual-parameter&amp;lt;/var&amp;gt; specifies the actual data that replaces the symbolic formal-parameter within the subroutine. At execution time, the value of each actual-parameter is substituted, based on the order in which it appears, for a formal-parameter declared for the subroutine. The correspondence of each formal-parameter in the &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statement to an actual-parameter in the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement is by position rather than by name.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An actual-parameter can be any of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;%variable or expression&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Expressions can contain field names, screen items, image items, and constants.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When an entire array is passed as a parameter, the %variable name is used with the percent (%) sign, but no parenthesis or subscript expressions follow it. 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;
%A IS FLOAT ARRAY(10,10)&lt;br /&gt;
DECLARE SUBROUTINE FDO(FLOAT ARRAY(*,*))&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL FDO (%A)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE FDO (%B IS FLOAT ARRAY(*,*))&lt;br /&gt;
   PRINT %B(1,1)&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;[[$ArrSize]]&amp;lt;/var&amp;gt; function can be used to determine the number of elements in a particular dimension of an array. &amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An actual-parameter can be a list, optionally preceded by the word LIST to distinguish it from a field name. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the compiler already knows of the formal-parameter list because the subroutine is already compiled or declared, the LIST keyword is unnecessary. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the list has never been declared in the request, a compilation error results. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Additional rules for parameters====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following additional rules apply to actual-parameters and parameter passing:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The maximum number of parameters that can be passed in complex subroutines is 63.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If the formal-parameter is specified as an OUTPUT parameter, the corresponding actual-parameter must match type.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The INPUT parameters of a %variable array requires that the type of the array &amp;amp;mdash; &amp;lt;var&amp;gt;FLOAT&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;FIXED&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; &amp;amp;mdash; the &amp;lt;var&amp;gt;DP&amp;lt;/var&amp;gt; specification, and the number of dimensions match the actual-parameter. In addition, if the &amp;lt;var&amp;gt;NO FIELD SAVE&amp;lt;/var&amp;gt; (&amp;lt;var&amp;gt;NO FS&amp;lt;/var&amp;gt;) option is specified for a &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; formal-parameter, it also must be specified for the corresponding actual-parameter and vice versa. All checking of array bounds within subroutines occurs during evaluation.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The INPUT parameters of a list requires the same file or group context as the actual-parameter.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;An INPUT parameter of a scalar %variable can be called with an actual-parameter that is an expression or %variable of a differing type. &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; converts the actual-parameter to the type required by the subroutine, according to the rules of the assignment statement. The converted value has a separate storage location from the original variable or expression.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Passing arguments to INPUT parameters might involve truncation where the number of decimal places is different, or conversion to 0 for non-numeric strings.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;OUTPUT parameters of lists and %variable arrays follow the same rules as INPUT parameters for lists and %variable arrays.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;OUTPUT parameters of scalar %variables require that the actual-parameter supplied in the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement be another scalar %variable (no constants or expressions) of the same type &amp;amp;mdash; &amp;lt;var&amp;gt;FLOAT&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;FIXED&amp;lt;/var&amp;gt;, or &amp;lt;var&amp;gt;STRING&amp;lt;/var&amp;gt; &amp;amp;mdash; and that the number of decimal places be the same, or the following message is issued by &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt;:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1725 PARAMETER NUMBER &amp;lt;i&amp;gt;n&amp;lt;/i&amp;gt; IS TYPE INCOMPATIBLE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Strings can be of any length. The length used is that of the actual input parameter. &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;
===Processing complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Checking for the validity of parameter lists occurs during compilation. When the SUBROUTINE statement is compiled, the types of parameters are saved by the compiler, and any subsequent CALL statements are verified as to whether the actual parameter is consistent with the type of formal parameter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When a CALL statement is compiled and the subroutine to which it refers has not been compiled, the compiler verifies whether the actual parameter list is compatible with other CALL statements for the subroutine that it has already compiled. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The compiler cannot verify that the actual parameters are compatible with the SUBROUTINE statement until that SUBROUTINE statement is compiled. If the compiler then detects a CALL statement that is not compatible with the SUBROUTINE statement, an error is issued at that time. Checking is done at compile time, so a statement that is not executed during evaluation can still generate an error.    &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===DECLARE SUBROUTINE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The DECLARE statement for a complex subroutine is similar to the SUBROUTINE statement, except that the parameter names are omitted. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
The complete syntax for the DECLARE SUBROUTINE statement is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;DECLARE SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&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; &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;inout-option&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;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;/p&amp;gt;&lt;br /&gt;
Where:&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;subname&amp;lt;/var&amp;gt; is the name of the subroutine.&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;type&amp;lt;/var&amp;gt; is one of the following:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scalar %variable of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;{STRING [LEN] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] | [FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT]}&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Array %variable of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;{STRING [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt; | *}] [ARRAY(* [,*[,*]]) [NO FIELD SAVE]]&lt;br /&gt;
 | [FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT] [ARRAY(* [,*[,*]])]}&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A list of records of the following format:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;[LIST] [IN {FILE | [PERM | TEMP] GROUP} &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;var class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/var&amp;gt; specifies whether each formal parameter is to be used as input to the subroutine or passed as output from the subroutine. Options are the same as those that can be specified on the SUBROUTINE statement: INPUT, OUTPUT, or INPUT OUTPUT. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====DECLARE before CALL====&lt;br /&gt;
When a &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement refers to a subroutine that has not yet been compiled, the error checking capabilities of the compiler are limited, because the number and type of formal parameters are not known to the compiler. If the first &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a particular subroutine is not correctly coded, then a large number of error messages can be generated when compiling subsequent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statements, although these statements might be correctly coded.&lt;br /&gt;
&lt;br /&gt;
You can avoid this problem in one of the following ways:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declare the formal parameter list with the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement. When the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement precedes the first &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt;, the compiler generates the correct error messages, if problems are encountered. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Place the subroutine before the first &amp;lt;var&amp;gt;CALL&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;
====Specifying a list of records====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you specify a &amp;lt;var&amp;gt;LIST&amp;lt;/var&amp;gt; (of records), you must also specify &amp;lt;var&amp;gt;FILE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;GROUP&amp;lt;/var&amp;gt;. For example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;OPEN METADATA&lt;br /&gt;
password&lt;br /&gt;
 &lt;br /&gt;
BEGIN&lt;br /&gt;
    DECLARE LIST ORIG IN METADATA&lt;br /&gt;
    DECLARE SUBROUTINE THE.SUB(LIST IN FILE METADATA INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    CALL THE.SUB (LIST ORIG)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE THE.SUB(LIST ORIG IN METADATA INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
END SUBROUTINE THE.SUB&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you do not specify &amp;lt;var&amp;gt;FILE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;GROUP&amp;lt;/var&amp;gt; in the code, you receive the following error message:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;M204.1725: PARAMETER NUMBER n IS TYPE INCOMPATIBLE&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====DECLARE parameters and CALL parameters====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, note that the &amp;lt;var&amp;gt;DECLARE&amp;lt;/var&amp;gt; statement lists the formal parameters, while the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement lists the actual parameters:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE SUBROUTINE SUB1(FLOAT, FIXED DP 2, STRING, STRING DP *)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
   CALL SUB1(%INCREASE,%WAGES,%NAME,%DEPT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
  SUBROUTINE SUB1(%A IS FLOAT,&lt;br /&gt;
                %B IS FIXED DP 2,&lt;br /&gt;
                %C IS STRING,&lt;br /&gt;
                %D IS STRING DP *)&lt;br /&gt;
  END SUBROUTINE&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Impact on CALL and SUBROUTINE statements====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; and &amp;lt;var&amp;gt;SUBROUTINE&amp;lt;/var&amp;gt; statements are not overridden when a &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement is present. The &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement does not cause the compiler to use more table space, nor does it alter the way in which the compiler output is generated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Rocket Software recommends that you use a &amp;lt;var&amp;gt;DECLARE SUBROUTINE&amp;lt;/var&amp;gt; statement before the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement for a subroutine or that you place the subroutine itself before the &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. Error reporting will be more complete and specific to the subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Exiting the subroutine===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement returns control to the statement immediately following the most recent &amp;lt;var&amp;gt;CALL&amp;lt;/var&amp;gt; statement. If an &amp;lt;var&amp;gt;END SUBROUTINE&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;END&amp;lt;/var&amp;gt; statement is encountered without a &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement, &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; processing is implied and automatically added by the compiler. More than one &amp;lt;var&amp;gt;RETURN&amp;lt;/var&amp;gt; statement can be specified in a subroutine.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If a &amp;lt;var&amp;gt;JUMP&amp;lt;/var&amp;gt; statement is used within a subroutine, its destination must be within the same subroutine. You cannot jump into a subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
A &amp;lt;var&amp;gt;STOP&amp;lt;/var&amp;gt; statement, when executed inside a subroutine, terminates the request in the same manner as it does when executed outside a subroutine. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Examples using complex subroutines===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, an employee name with regular and overtime hours is passed to the subroutine &amp;lt;code&amp;gt;CALC.WAGES&amp;lt;/code&amp;gt;. The total pay is returned and a list of records processed by the routine is updated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DECLARE SUBROUTINE CALC.WAGES(FIXED DP 2, -&lt;br /&gt;
        FIXED DP 2, STRING, FIXED DP 2 OUTPUT, -&lt;br /&gt;
        LIST IN FILE EMPLOYEE INOUT)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL CALC.WAGES(%R.HRS, %OT.HRS, %NAME, -&lt;br /&gt;
                %TOTAL.PAY, LIST EMPLST)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE CALC.WAGES(%REG IS FIXED DP 2, -&lt;br /&gt;
                %OT IS FIXED DP 2, -&lt;br /&gt;
                %E.NAME IS STRING, -&lt;br /&gt;
                %TOTAL IS FIXED DP 2 OUTPUT, -&lt;br /&gt;
                LIST EMPLIST IN FILE EMPLOYEE INOUT)&lt;br /&gt;
 &lt;br /&gt;
%TEMP IS FIXED DP 2&lt;br /&gt;
 &lt;br /&gt;
WAGES1: IN EMPLOYEE FIND ALL RECORDS FOR WHICH&lt;br /&gt;
           NAME = %E.NAME&lt;br /&gt;
        END FIND&lt;br /&gt;
        FOR EACH RECORD IN WAGES1&lt;br /&gt;
           %TEMP = (RATE * %REG)&lt;br /&gt;
           %TOTAL = %TEMP + (RATE * 1.5 * %OT)&lt;br /&gt;
        END FOR&lt;br /&gt;
        PLACE RECORDS IN WAGES1 ON LIST EMPLIST&lt;br /&gt;
        RETURN&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the following example, an entire array is passed as a single subroutine parameter:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%NUMBERS IS FLOAT ARRAY(10,10)&lt;br /&gt;
%MAX IS FLOAT&lt;br /&gt;
   DECLARE SUBROUTINE MAXIMUM(FLOAT ARRAY(*,*), -&lt;br /&gt;
     FLOAT OUTPUT)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   CALL MAXIMUM(%NUMBERS,%MAX)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE MAXIMUM(%ARR IS FLOAT ARRAY(*,*), -&lt;br /&gt;
           %M IS FLOAT OUTPUT)&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
%J IS FIXED&lt;br /&gt;
   %M = 0&lt;br /&gt;
   FOR %I FROM 1 TO $arrsize(&#039;%ARR&#039;,1)&lt;br /&gt;
      FOR %J FROM 1 TO $arrsize(&#039;%ARR&#039;,2)&lt;br /&gt;
         IF %ARR(%I,%J) GT %M THEN&lt;br /&gt;
            %M = %ARR(%I,%J)&lt;br /&gt;
         END IF&lt;br /&gt;
      END FOR&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sharing common elements==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An element that is not passed as a parameter can be shared between complex subroutines, or between a complex subroutine and the main request, when it is declared as a common element. A common element is created by using the DECLARE statement or by using the COMMON keyword on a %variable IS declaration. For an element to be shared, it must be declared as common in every place (each separate scope) in which it is used.      &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Scope of elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The scope of an element refers to the area within a request in which an element has a particular meaning. In User Language, complex subroutines have a different scope than the remainder of the request (the elements of a complex subroutine differ from the elements outside the subroutine even when they have the same name). This concept applies to labels, lists, %variables and %variable arrays, menus, screens, and images.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The elements of the main request (the statements not enclosed by any SUBROUTINE/END SUBROUTINE statements) and the elements of all simple subroutines share the same scope. Simple subroutines share the same elements with the main request and all other simple subroutines within the request.     &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Shareable elements===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following elements can be shared if they are declared as common:&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====%variables and %variable arrays====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share %variables if a DECLARE %variable or a %variable IS statement that declares the %variable as common is present in each portion of the request where you use the %variable. The %variable must have the same type, length, number of decimal places, and FIELD SAVE option in each declaration. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Lists of records====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share a list if a DECLARE statement that declares the list as common is contained in each place where you use the list. The declaration of the list must precede the first reference to that list, or &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; declares the list implicitly without the common attribute.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Found sets====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share found sets if the label of the FIND statement is declared as common. To effectively share a found set, follow these steps:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add a DECLARE statement that declares the statement label as common before the actual label in the portion of the request where the FIND statement will be executed.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add a DECLARE statement that declares the label as common to any parts of the request that require access to that found set. These parts, however, cannot contain a label with the same name, or a compiler error occurs. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
After execution of the FIND statement, you can access the record set in any portion of the request that contains the proper DECLARE statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Menus and screens====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can share a menu or screen as common under the following conditions: &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The first reference to the menu or screen must be the complete definition of the menu or screen, with the COMMON keyword following the MENU or SCREEN statement.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Other parts of the request can reference the same menu or screen by using an abbreviated declaration of the form:&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE [MENU menuname | SCREEN screenname] COMMON&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If the complete definition of the menu or screen exists, and if that definition was declared as common, the menu or screen is shared. If not, a compiler error results. Two or more complete menu or screen definitions with the COMMON keyword also result in a compiler error.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
If you use a menu or screen %variable (:%variable) within a complex subroutine to refer to a COMMON screen element, you must include a common declaration for each possible value of the menu or screen name. &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;
====Images====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The sharing of images follows the same rules used for the sharing of menus and screens. If multiple images are contained within the same block, then the following rules also apply:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You can use the COMMON keyword on only the first IMAGE statement of a block. All other images within the same block are automatically considered as candidates for sharing as common data.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;All other parts of the request that access common images must contain the following abbreviated form of the DECLARE statement for each image to which access is required: &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;DECLARE IMAGE imagename COMMON&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
===DECLARE statement===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can use the DECLARE statement to perform the following functions:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Specify subroutine formal parameter types.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Specify variables, labels, lists, menus, screens, and images as COMMON.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Menus and screens are discussed in detail in [[Full-screen feature]]. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Images are discussed in detail in [[Images]].&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To declare lists without having to use an &amp;lt;code&amp;gt;IN filename CLEAR LIST listname&amp;lt;/code&amp;gt; clause. See [[Lists#Creating and clearing a list|Creating and clearing a list]].&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To declare %variables, see [[Using variables and values in computation]]. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the DECLARE statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;DECLARE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;declaration&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;span class=&amp;quot;term&amp;quot;&amp;gt;declaration&amp;lt;/span&amp;gt; is one of the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;LABEL &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
[LIST] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;listname&amp;lt;/span&amp;gt; [IN [FILE [PERM | TEMP] GROUP] &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;]&lt;br /&gt;
                [COMMON]&lt;br /&gt;
 &lt;br /&gt;
IMAGE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;imagename&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
MENU &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;menuname&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
SCREEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;screenname&amp;lt;/span&amp;gt; COMMON&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; [IS] {FIXED [DP &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] | FLOAT}&lt;br /&gt;
 [ARRAY(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d1&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d2&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d3&amp;lt;/span&amp;gt;]])] [COMMON]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;%variable&amp;lt;/span&amp;gt; [IS] STRING [LEN &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;] [DP {&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;dn1&amp;lt;/span&amp;gt; | *}]&lt;br /&gt;
 [ARRAY(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d1&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d2&amp;lt;/span&amp;gt; [,&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;d3&amp;lt;/span&amp;gt;]])] [NO FIELD SAVE] [COMMON]&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;subname&amp;lt;/span&amp;gt;[(&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;type&amp;lt;/span&amp;gt; [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;inout-option&amp;lt;/span&amp;gt;] [,...]) ]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
For example, the DECLARE statement declares the list RECNAMES in the following request:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
DECLARE LIST RECNAMES&lt;br /&gt;
DECLARE SUBROUTINE REGION(LIST OUTPUT, STRING)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
CALL REGION(LIST RECNAMES, &#039;NORTHEAST&#039;)&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
SUBROUTINE REGION(LIST RGNLST OUTPUT, -&lt;br /&gt;
                  %REGION IS STRING)&lt;br /&gt;
 &lt;br /&gt;
R1: IN EMPLOYEE FIND ALL RECORDS FOR WHICH&lt;br /&gt;
       REGION = %REGION&lt;br /&gt;
R2: PLACE RECORDS IN R1 ON LIST RGNLIST&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Defining common variables===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can define common variables at the beginning of all programs without later redefinitions. The syntax lets you use the %VAR IS COMMON clause without duplicating the previous attributes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
However, if attributes, such as STRING or LEN, are included in the redefinition, which differ from those previously defined, a compilation error occurs. In addition, if the variable is not previously defined, it is allocated based on the current default variable definition. &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;
 VARIABLES ARE STRING LEN 20 &lt;br /&gt;
 %X IS STRING LEN 3 INITIAL (&#039;AAA&#039;) STATIC COMMON &lt;br /&gt;
 SUBROUTINE A&lt;br /&gt;
   * full definition on next line no longer required&lt;br /&gt;
   ** %X IS STRING LEN 3 INITIAL (&#039;AAA&#039;) STATIC COMMON&lt;br /&gt;
   * new syntax on next line replaces previous line&lt;br /&gt;
   %X IS COMMON  /? defaults to previous %X definition ?/&lt;br /&gt;
   CALL B&lt;br /&gt;
 END SUBROUTINE&lt;br /&gt;
 &lt;br /&gt;
 SUBROUTINE B&lt;br /&gt;
   * But next line will fail compile since %X already exists&lt;br /&gt;
   %X IS STRING LEN 4 COMMON  /? compiler error ?/&lt;br /&gt;
   * And the next line will result in a default definition&lt;br /&gt;
   * since %Y is not previously defined.&lt;br /&gt;
   %Y IS COMMON&lt;br /&gt;
 END SUBROUTINE&lt;br /&gt;
 PRINT %X&lt;br /&gt;
 CALL A&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Shared common element examples===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The following examples illustrate the differences between data that is locally scoped and data that is shared using the COMMON keyword. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 1====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the variable %I assumes different values depending upon which part of the request is being executed:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   DECLARE SUBROUTINE SUBR1(STRING)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
FOR %I FROM 1 TO 10&lt;br /&gt;
   CALL SUBR1(%ARR(%I))&lt;br /&gt;
END FOR&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
SUBROUTINE SUBR1(%A IS STRING)&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   FOR %I FROM 1 TO 10&lt;br /&gt;
      PRINT %I and %A&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 2====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the screen EXAMPLE and the %A and %B variables retain the same values no matter which part of the request is being executed:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
SCREEN EXAMDEF COMMON&lt;br /&gt;
   TITLE &#039;THIS IS A COMMON SCREEN DEFINITION&#039;&lt;br /&gt;
   PROMPT &#039;ENTER VALUE&#039;&lt;br /&gt;
   INPUT FLD1 AT 10 LEN 20 PAD &#039;_&#039;&lt;br /&gt;
END SCREEN&lt;br /&gt;
%A IS STRING LEN 10 COMMON&lt;br /&gt;
%B IS FLOAT COMMON&lt;br /&gt;
DECLARE SUBROUTINE SUBR1(STRING LEN 10)&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
SUBROUTINE SUBR1(%Z IS STRING LEN 10)&lt;br /&gt;
DECLARE SCREEN EXAMDEF COMMON&lt;br /&gt;
%A IS STRING LEN 10 COMMON&lt;br /&gt;
%B IS FLOAT COMMON&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Example 3====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In this example, the main request and the subroutine share the common data of an array and a found set:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
%COM.ARRAY IS STRING LEN 10 ARRAY(10,10) COMMON&lt;br /&gt;
DECLARE LABEL ALL.RECS COMMON&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
DECLARE SUBROUTINE EXAMPLE&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
ALL.RECS: FIND ALL RECORDS&lt;br /&gt;
          END FIND&lt;br /&gt;
          %I = 0&lt;br /&gt;
          %J = 1&lt;br /&gt;
          FOR 10 RECORDS IN ALL.RECS&lt;br /&gt;
             %I = %I + 1&lt;br /&gt;
             %COM.ARRAY(%I,%J) = FLD&lt;br /&gt;
          END FOR&lt;br /&gt;
          CALL EXAMPLE&lt;br /&gt;
          STOP&lt;br /&gt;
 &lt;br /&gt;
SUBROUTINE EXAMPLE&lt;br /&gt;
%COM.ARRAY IS STRING LEN 10 ARRAY(10,10) COMMON&lt;br /&gt;
DECLARE LABEL ALL.RECS COMMON&lt;br /&gt;
%I IS FIXED&lt;br /&gt;
   %I = 0&lt;br /&gt;
   %J = 2&lt;br /&gt;
   FOR 10 RECORDS IN ALL.RECS&lt;br /&gt;
      %I = %I + 1&lt;br /&gt;
      %COM.ARRAY(%I,%J) = FLD2&lt;br /&gt;
   END FOR&lt;br /&gt;
END SUBROUTINE&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
In the preceding example, the main request updates column 1 of the array %COMM.ARRAY with the contents of FLD. The subroutine, EXAMPLE, updates column 2 of the same array with the contents of FLD2. Both the array %COM.ARRAY and the found set ALL.RECS are shared by using the COMMON keyword. %I and %J are both local variables. %I is local because it was declared without the COMMON keyword; %J is local because it was not declared at all.                       &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;On statement&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- The two reasonable section names for ... --&amp;gt;&lt;br /&gt;
==On units==  &amp;lt;!-- Be sure to keep with &amp;lt;div&amp;gt; tags preceding this --&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit lets you specify a course of action following a triggering event, such as the terminal operator pressing one of the &amp;lt;var&amp;gt;Attention&amp;lt;/var&amp;gt; identifier (AID) keys. The &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit provides an application with a way to override the normal system response. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====Syntax====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To define an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; unit, use an &amp;lt;var&amp;gt;On&amp;lt;/var&amp;gt; block in the following format:&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;term&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt;] On &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;unittype&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;statement&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;literal&amp;quot;&amp;gt;...&amp;lt;/span&amp;gt;&lt;br /&gt;
End On&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;unittype&amp;lt;/var&amp;gt; is one of the following:&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;unittype&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;You can specify the course of action to take if...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;ATTENTION&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;The end user invokes the attention feature (for example, presses the &amp;lt;var&amp;gt;BREAK, ATTN,&amp;lt;/var&amp;gt; or &amp;lt;var&amp;gt;PA1&amp;lt;/var&amp;gt; key, or enters &amp;lt;var&amp;gt;*CANCEL&amp;lt;/var&amp;gt;).     &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;ERROR&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; cancels a request. Before a request is canceled or, for transaction backout files, after the current transaction is backed out, the ON ERROR unit is processed instead of returning control to the terminal command level. For more information on transaction backout files, see [[Data recovery]].    &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td nowrap&amp;gt;FIELD CONSTRAINT&lt;br /&gt;
CONFLICT (FCC)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;There are field level constraint conflicts. Violating the UNIQUE and AT-MOST-ONE attributes causes field-level conflicts.*&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;FIND CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A conflict arises evaluating a FIND statement or a FOR EACH RECORD statement used for retrieval.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;MISSING FILE&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A remote file is no longer available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;MISSING MEMBER&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A remote optional member is no longer available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;RECORD LOCKING CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;A conflict arises during a record locking attempt.&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 you have procedures written for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; V2R1.0 that use ON FCC for UNIQUE fields, and you are planning to use ON FCC for AT-MOST-ONE fields, you might need to rewrite the ON FCC unit to take the new value of $UPDSTAT (2 for AT-MOST-ONE) into account. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Several $functions provide information about conflicts. They 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&amp;gt;[[$UpdFile]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdFld]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdOval]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdRec]]&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;[[$UpdStat]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdStmt]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UpdVal]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[$UnqRec]]&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;
===Body of an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The body of the ON unit consists of statements immediately following the ON statement. Any User Language statement can appear within an ON unit except the SUBROUTINE statement.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Ending an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You must conclude an ON unit with either an END ON statement or an END BLOCK statement. The format of the END ON statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;END ON [&amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;label&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;label&amp;lt;/var&amp;gt; is the label of the statement that began the ON statement. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Processing an ON unit===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
When an ON statement is evaluated, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; remembers the location of the ON unit body (the statement after the ON statement and within the unit), but does not immediately evaluate the body. Instead, it passes control to the statement immediately following the ON unit. The ON unit body is evaluated only when the triggering event takes place.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Usage guidelines for ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Note the following considerations when using ON units:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You must define the ON unit before it is invoked (that is, you should typically place the ON unit near the beginning of your procedure). &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A subsequent definition of an ON unit of the same kind replaces the previous one. For example, if you define two ON ATTN units, the second one becomes the current one.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump to destinations within the same ON unit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump out of an ON unit only to unnested, labeled statements.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You cannot jump into an ON unit.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can jump outside of an ON unit only if the ON unit is part of a main routine or part of a complex subroutine. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You cannot jump out of an ON unit contained in a simple subroutine, regardless of whether the destination is within the subroutine or back in the mainline program, because ON units are part of the mainline program; hence, there is no scoping of ON units. This restriction ensures that the ON unit is executed and the control returned to the main routine.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;li&amp;gt;An ON unit definition is not preserved when a request is continued with an END MORE statement and a MORE command. Each new request continuation must define its own ON units. (See [[Large request considerations#Rules for request continuation|Rules for request continuation]].)&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;For complex subroutines, an active ON unit is temporarily disabled when a subroutine is called that contains an ON UNIT of the same type; it is restored when the subroutine returns. Any ON unit enabled during the execution of a subroutine is replaced by the active ON unit at the time of the last CALL statement as soon as the RETURN statement is evaluated.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ON units coded inside complex subroutines can contain JUMP statements that specify a destination outside the ON unit. The destination must be to an unnested labeled statement within the complex subroutine. Also, if the ON unit is to be jumped out of, the condition that causes the ON unit to be invoked must be raised in the subroutine that contains the ON unit.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This prevents a lower level subroutine from returning inadvertently by raising a condition for which there is an ON unit coded in a higher level subroutine. If the inadvertent return is attempted, the request is canceled. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ON units do not have their own local data and labels. They inherit the scope of the part of the program in which they are compiled. An ON unit that is compiled within a complex subroutine is considered part of only that subroutine. &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, if the user presses the&amp;lt;var&amp;gt; ATTN&amp;lt;/var&amp;gt; key instead of entering a response to the prompt in the GET.REC.TYPE statement, the ON ATTENTION unit sets %FLAG to 1. The FLAG.SET statement tests %FLAG. If %FLAG is set, the request branches to END.REQUEST and the FIND statement is not executed. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;%FLAG=0&lt;br /&gt;
              ON ATTENTION&lt;br /&gt;
                 %FLAG=1&lt;br /&gt;
                 BYPASS&lt;br /&gt;
              END ON&lt;br /&gt;
GET.REC.TYPE: %TYPE=$READ(&#039;ENTER RECORD TYPE&#039;)&lt;br /&gt;
FLAG.SET:     IF %FLAG=1 THEN&lt;br /&gt;
                 JUMP TO END.REQUEST&lt;br /&gt;
              END IF&lt;br /&gt;
FIND.RECS:    FIND ALL RECORDS FOR WHICH&lt;br /&gt;
                 TYPE = %TYPE&lt;br /&gt;
              END FIND&lt;br /&gt;
                 .&lt;br /&gt;
                 .&lt;br /&gt;
                 .&lt;br /&gt;
END.REQUEST:&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Only one ON unit at a time===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Only one ON unit of each kind is active at a time. For example, the processing of a second ON ERROR statement resets the current ON ERROR unit, but does not affect the current ON ATTENTION unit. Thus, you can redefine what to do in a variety of cases by having several ON statements and units within a request. An ON unit can be redefined within another ON unit.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Passing control to and from ON units===&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; passes control to an ON unit when the triggering event occurs. For example, an ON ATTENTION unit receives control when a user presses one of the ATTENTION identifier (AID) keys at the terminal during the execution of a request. Use one of the following statements to return control to the body of the request.    &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====BYPASS statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The BYPASS statement handles the various unittypes of an ON statement as follows:&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;For unittype...&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;The BYPASS statement...&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;ON MISSING FILE&amp;lt;br&amp;gt;&lt;br /&gt;
ON MISSING MEMBER&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately after the END FOR statement that closes the current FOR loop. &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;ON ERROR&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ends the request.&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 nowrap&amp;gt;ON ATTENTION&amp;lt;br&amp;gt;&lt;br /&gt;
ON FIND CONFLICT&amp;lt;br&amp;gt;&lt;br /&gt;
ON RECORD LOCKING CONFLICT&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Returns control to the statement immediately after the statement that invoked the ON unit.&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;
The format of the BYPASS statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;BYPASS [PENDING STATEMENT]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where the PENDING STATEMENT keyword is optional. If the ON unit is not ended with a BYPASS statement, &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model&amp;amp;nbsp;204&amp;lt;/var&amp;gt; automatically generates a STOP statement at the end of the unit.   &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====CONTINUE statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The CONTINUE statement is supported only with the Parallel Query Option. If you lose access to a group member that is an optional file during FOR processing, the CONTINUE statement continues FOR processing with the next available file, and skips any other unavailable files.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====JUMP TO statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The JUMP statement, when used to jump to a labeled statement outside the ON unit, causes the request to continue at that point. There are restrictions pertaining to jumps; see [[Flow of control in User Language#Branching statements|Branching statements]] and [[#Simple subroutines|Simple subroutines]]. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====RETRY statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The RETRY statement passes control to the statement that invoked the ON unit, thereby retrying that statement. The RETRY statement is not valid in an ON ERROR unit.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The format of the RETRY statement is as follows:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;RETRY [PENDING STATEMENT]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
where the &amp;lt;var&amp;gt;PENDING STATEMENT&amp;lt;/var&amp;gt; keyword is optional.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
====STOP statement====&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The STOP statement is used to end the request.         &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Clearing ON units===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can issue the following statement to clear the definition of an ON unit:   &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;syntax&amp;quot;&amp;gt;CLEAR ON &amp;lt;span class=&amp;quot;term&amp;quot;&amp;gt;unittype&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
This statement clears any defined ON unit of the type specified. Clearing an ON unit produces the following results:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;After a CLEAR ON ATTENTION, pressing one of the ATTENTION identifier (AID) keys at the terminal does not invoke the ON ATTENTION unit.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;After a CLEAR ON ERROR, a request cancellation error does not invoke the ON ERROR unit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
An ON unit can be defined, cleared, and then redefined. &amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Pausing during the request===&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The PAUSE statement can be used with ON units to cause the request to wait a specified time and then to retry the statement that caused the evaluation of the ON unit. PAUSE is typically used with the other ON unit types (RECORD LOCKING CONFLICT and ON FIND CONFLICT) and is discussed in [[Record level locking and concurrency control]].   &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>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78428</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78428"/>
		<updated>2015-07-23T02:43:37Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* New PL subsystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (ProcSearch/PS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
&lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has been increased to ??.&lt;br /&gt;
&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
&lt;br /&gt;
===Other features===&lt;br /&gt;
====Enhanced Procedure Name search====&lt;br /&gt;
If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So take caution when combining AND and OR selections.&lt;br /&gt;
====Field error tagging====&lt;br /&gt;
(in progress) If  field is in error, e.g. the Context field is&lt;br /&gt;
invalid, the field is tagged red.&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (ProcList/PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
 FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
If a command is in error it will now leave the command on the screen so it can be amended.&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;PROCS&amp;amp;nbsp;|&amp;amp;nbsp;A&amp;amp;nbsp;[xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;CREATEPROC | CREATE | CP [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&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;Description&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;U (Undo)&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
May only be executed against a change deck.  This command&lt;br /&gt;
performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
procedure and a sequenced copy of that procedure being created&lt;br /&gt;
in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
command specifically includes the change deck against which it is&lt;br /&gt;
executed in the code for the working procedure, but NOT in the&lt;br /&gt;
code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
the state of the development procedures that created the change&lt;br /&gt;
deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
Typically, the U command is used to recreate the state of development&lt;br /&gt;
when the programmer has accidentally deleted the procedures she&lt;br /&gt;
was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
The U command is a special-use feature, and there are a number&lt;br /&gt;
of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
selected change deck is somewhere in the middle of a series of&lt;br /&gt;
changes and, by excluding it from procedure creation, some code&lt;br /&gt;
dependency is missing.  However, for its primary function --&lt;br /&gt;
recovering from a mistake that was made very recently, typically&lt;br /&gt;
as the most recent change to a procedure, it should always work.&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;Y&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
This change-control prefix command provides a special check-out&lt;br /&gt;
ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
of a procedure with changes that have been checked in by other&lt;br /&gt;
programmers since the working copy was originally taken from&lt;br /&gt;
the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
procedure, a screen is presented, and the result is a new&lt;br /&gt;
working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
but it is done while changes are in progress, and it slips&lt;br /&gt;
into place other changes that have occurred since the original&lt;br /&gt;
procedure check-out.&lt;br /&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;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
A new command PL allows direct entry to the Procedure List screen in SirPro. The format is:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;PL [&amp;lt;procedurePattern&amp;gt;] [FILE &amp;lt;fileName&amp;gt;|GROUP &amp;lt;groupName&amp;gt;]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
If FILE or GROUP is not supplied then the current open context will be used. The context is obtained using $view(&#039;APDFCNTX&#039;) (see [[APDFCNTX_parameter]]).&lt;br /&gt;
&lt;br /&gt;
Note - If a procedure search is required for the words &#039;FILE&#039; or &#039;GROUP&#039;, then it must be entered as:&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;PL file FILE &amp;lt;filename&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
where the first &#039;file&#039; is for procedures containing the word &#039;file&#039;.  The second &#039;FILE&#039; is required as the context is not automatically added if searching for the words &#039;FILE&#039; or &#039;GROUP&#039;.&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirLib_V7.5&amp;diff=78378</id>
		<title>Release notes for SirLib V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirLib_V7.5&amp;diff=78378"/>
		<updated>2015-07-21T11:13:48Z</updated>

		<summary type="html">&lt;p&gt;Heikki: Created page with &amp;quot;(placeholder page - Adrian to provide content)&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(placeholder page - Adrian to provide content)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_RKTools_V7.5&amp;diff=78374</id>
		<title>Release notes for RKTools V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_RKTools_V7.5&amp;diff=78374"/>
		<updated>2015-07-21T10:45:49Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following are the release notes for the components of ULSPF that have been updated for version S7.5.  Please note that the version numbering has changed and is now linked to the Model 204 release version number. Hence ULSPF S7.5 can only run on Model 204 release 7.5 or higher.  The ULSPF version prior to S7.5 was 801. &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirPro version S7.6 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirLib version S7.5 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirScan version S7.5 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;New TN3270 editor [[SoulEdit]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
==Common ULSPF enhancements==&lt;br /&gt;
&lt;br /&gt;
===Enhanced fast-path===&lt;br /&gt;
Fast-pathing between ULSPF components is supported by typing the component name in the command line. For instance, typing SIRMON from anywhere inside SIRPRO or SIRSCAN will take you to the SirMon System Overview screen. Typing SIRPRO 8 from inside SirMon will take you to the SirPro Group Definition page.&lt;br /&gt;
&lt;br /&gt;
===Enhanced help===&lt;br /&gt;
(in progress)&lt;br /&gt;
The help will be extended to include field help.  When PF1 is pressed and the cursor is located on a field the help will be positioned to the help text for that field.  Otherwise it will be positioned at the start. The user can then choose to scroll up or down to see the rest of the help text.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78371</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78371"/>
		<updated>2015-07-21T08:21:05Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (ProcSearch/PS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
&lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has been increased to ??.&lt;br /&gt;
&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
&lt;br /&gt;
===Other features===&lt;br /&gt;
====Enhanced Procedure Name search====&lt;br /&gt;
If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So take caution when combining AND and OR selections.&lt;br /&gt;
====Field error tagging====&lt;br /&gt;
(in progress) If  field is in error, e.g. the Context field is&lt;br /&gt;
invalid, the field is tagged red.&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (ProcList/PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
 FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
If a command is in error it will now leave the command on the screen so it can be amended.&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;PROCS&amp;amp;nbsp;|&amp;amp;nbsp;A&amp;amp;nbsp;[xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;CREATEPROC | CREATE | CP [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&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;Description&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;U (Undo)&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
May only be executed against a change deck.  This command&lt;br /&gt;
performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
procedure and a sequenced copy of that procedure being created&lt;br /&gt;
in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
command specifically includes the change deck against which it is&lt;br /&gt;
executed in the code for the working procedure, but NOT in the&lt;br /&gt;
code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
the state of the development procedures that created the change&lt;br /&gt;
deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
Typically, the U command is used to recreate the state of development&lt;br /&gt;
when the programmer has accidentally deleted the procedures she&lt;br /&gt;
was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
The U command is a special-use feature, and there are a number&lt;br /&gt;
of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
selected change deck is somewhere in the middle of a series of&lt;br /&gt;
changes and, by excluding it from procedure creation, some code&lt;br /&gt;
dependency is missing.  However, for its primary function --&lt;br /&gt;
recovering from a mistake that was made very recently, typically&lt;br /&gt;
as the most recent change to a procedure, it should always work.&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;Y&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
This change-control prefix command provides a special check-out&lt;br /&gt;
ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
of a procedure with changes that have been checked in by other&lt;br /&gt;
programmers since the working copy was originally taken from&lt;br /&gt;
the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
procedure, a screen is presented, and the result is a new&lt;br /&gt;
working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
but it is done while changes are in progress, and it slips&lt;br /&gt;
into place other changes that have occurred since the original&lt;br /&gt;
procedure check-out.&lt;br /&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;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78370</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78370"/>
		<updated>2015-07-21T08:12:35Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
&lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has been increased to ??.&lt;br /&gt;
&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
&lt;br /&gt;
===Other features===&lt;br /&gt;
====Enhanced Procedure Name search====&lt;br /&gt;
If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So take caution when combining AND and OR selections.&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
 FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
If a command is in error it will now leave the command on the screen so it can be amended.&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;PROCS&amp;amp;nbsp;|&amp;amp;nbsp;A&amp;amp;nbsp;[xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;CREATEPROC | CREATE | CP [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&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;Description&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;U (Undo)&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
May only be executed against a change deck.  This command&lt;br /&gt;
performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
procedure and a sequenced copy of that procedure being created&lt;br /&gt;
in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
command specifically includes the change deck against which it is&lt;br /&gt;
executed in the code for the working procedure, but NOT in the&lt;br /&gt;
code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
the state of the development procedures that created the change&lt;br /&gt;
deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
Typically, the U command is used to recreate the state of development&lt;br /&gt;
when the programmer has accidentally deleted the procedures she&lt;br /&gt;
was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
The U command is a special-use feature, and there are a number&lt;br /&gt;
of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
selected change deck is somewhere in the middle of a series of&lt;br /&gt;
changes and, by excluding it from procedure creation, some code&lt;br /&gt;
dependency is missing.  However, for its primary function --&lt;br /&gt;
recovering from a mistake that was made very recently, typically&lt;br /&gt;
as the most recent change to a procedure, it should always work.&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;Y&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
This change-control prefix command provides a special check-out&lt;br /&gt;
ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
of a procedure with changes that have been checked in by other&lt;br /&gt;
programmers since the working copy was originally taken from&lt;br /&gt;
the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
procedure, a screen is presented, and the result is a new&lt;br /&gt;
working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
but it is done while changes are in progress, and it slips&lt;br /&gt;
into place other changes that have occurred since the original&lt;br /&gt;
procedure check-out.&lt;br /&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;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78369</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78369"/>
		<updated>2015-07-21T08:08:37Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Search strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Enhanced Procedure name search====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.&lt;br /&gt;
&lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has been increased to ??.&lt;br /&gt;
&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
 FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
If a command is in error it will now leave the command on the screen so it can be amended.&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;PROCS&amp;amp;nbsp;|&amp;amp;nbsp;A&amp;amp;nbsp;[xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;CREATEPROC | CREATE | CP [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&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;Description&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;U (Undo)&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
May only be executed against a change deck.  This command&lt;br /&gt;
performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
procedure and a sequenced copy of that procedure being created&lt;br /&gt;
in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
command specifically includes the change deck against which it is&lt;br /&gt;
executed in the code for the working procedure, but NOT in the&lt;br /&gt;
code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
the state of the development procedures that created the change&lt;br /&gt;
deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
Typically, the U command is used to recreate the state of development&lt;br /&gt;
when the programmer has accidentally deleted the procedures she&lt;br /&gt;
was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
The U command is a special-use feature, and there are a number&lt;br /&gt;
of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
selected change deck is somewhere in the middle of a series of&lt;br /&gt;
changes and, by excluding it from procedure creation, some code&lt;br /&gt;
dependency is missing.  However, for its primary function --&lt;br /&gt;
recovering from a mistake that was made very recently, typically&lt;br /&gt;
as the most recent change to a procedure, it should always work.&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;Y&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
This change-control prefix command provides a special check-out&lt;br /&gt;
ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
of a procedure with changes that have been checked in by other&lt;br /&gt;
programmers since the working copy was originally taken from&lt;br /&gt;
the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
procedure, a screen is presented, and the result is a new&lt;br /&gt;
working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
but it is done while changes are in progress, and it slips&lt;br /&gt;
into place other changes that have occurred since the original&lt;br /&gt;
procedure check-out.&lt;br /&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;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78368</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78368"/>
		<updated>2015-07-21T08:06:29Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Procedure name */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Enhanced Procedure name search====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.&lt;br /&gt;
&lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
 FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
If a command is in error it will now leave the command on the screen so it can be amended.&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;PROCS&amp;amp;nbsp;|&amp;amp;nbsp;A&amp;amp;nbsp;[xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;CREATEPROC | CREATE | CP [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&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;Description&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;U (Undo)&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
May only be executed against a change deck.  This command&lt;br /&gt;
performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
procedure and a sequenced copy of that procedure being created&lt;br /&gt;
in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
command specifically includes the change deck against which it is&lt;br /&gt;
executed in the code for the working procedure, but NOT in the&lt;br /&gt;
code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
the state of the development procedures that created the change&lt;br /&gt;
deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
Typically, the U command is used to recreate the state of development&lt;br /&gt;
when the programmer has accidentally deleted the procedures she&lt;br /&gt;
was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
The U command is a special-use feature, and there are a number&lt;br /&gt;
of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
selected change deck is somewhere in the middle of a series of&lt;br /&gt;
changes and, by excluding it from procedure creation, some code&lt;br /&gt;
dependency is missing.  However, for its primary function --&lt;br /&gt;
recovering from a mistake that was made very recently, typically&lt;br /&gt;
as the most recent change to a procedure, it should always work.&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;Y&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
This change-control prefix command provides a special check-out&lt;br /&gt;
ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
of a procedure with changes that have been checked in by other&lt;br /&gt;
programmers since the working copy was originally taken from&lt;br /&gt;
the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
procedure, a screen is presented, and the result is a new&lt;br /&gt;
working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
but it is done while changes are in progress, and it slips&lt;br /&gt;
into place other changes that have occurred since the original&lt;br /&gt;
procedure check-out.&lt;br /&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;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78367</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78367"/>
		<updated>2015-07-21T08:05:34Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Selection field */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
 FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
If a command is in error it will now leave the command on the screen so it can be amended.&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;PROCS&amp;amp;nbsp;|&amp;amp;nbsp;A&amp;amp;nbsp;[xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;CREATEPROC | CREATE | CP [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&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;Description&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;U (Undo)&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
May only be executed against a change deck.  This command&lt;br /&gt;
performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
procedure and a sequenced copy of that procedure being created&lt;br /&gt;
in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
command specifically includes the change deck against which it is&lt;br /&gt;
executed in the code for the working procedure, but NOT in the&lt;br /&gt;
code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
the state of the development procedures that created the change&lt;br /&gt;
deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
Typically, the U command is used to recreate the state of development&lt;br /&gt;
when the programmer has accidentally deleted the procedures she&lt;br /&gt;
was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
The U command is a special-use feature, and there are a number&lt;br /&gt;
of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
selected change deck is somewhere in the middle of a series of&lt;br /&gt;
changes and, by excluding it from procedure creation, some code&lt;br /&gt;
dependency is missing.  However, for its primary function --&lt;br /&gt;
recovering from a mistake that was made very recently, typically&lt;br /&gt;
as the most recent change to a procedure, it should always work.&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;Y&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
This change-control prefix command provides a special check-out&lt;br /&gt;
ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
of a procedure with changes that have been checked in by other&lt;br /&gt;
programmers since the working copy was originally taken from&lt;br /&gt;
the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
procedure, a screen is presented, and the result is a new&lt;br /&gt;
working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
but it is done while changes are in progress, and it slips&lt;br /&gt;
into place other changes that have occurred since the original&lt;br /&gt;
procedure check-out.&lt;br /&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;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78366</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78366"/>
		<updated>2015-07-21T07:59:59Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Command Line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
 FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
If a command is in error it will now leave the command on the screen so it can be amended.&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;PROCS&amp;amp;nbsp;|&amp;amp;nbsp;A&amp;amp;nbsp;[xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;CREATEPROC | CREATE | CP [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78365</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78365"/>
		<updated>2015-07-21T07:57:14Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Command Line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
 FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
If a command is in error it will now leave the command on the screen so it can be amended.&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;PROCS | A [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;CREATEPROC | CREATE | CP [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78364</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78364"/>
		<updated>2015-07-21T07:55:31Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Command Line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;PROCS | A [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;CREATEPROC | CREATE | CP [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78363</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78363"/>
		<updated>2015-07-21T07:50:46Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Command Line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;PROCS | A [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD | PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;CREATEPROC | CREATE | CP [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &lt;br /&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;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78362</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78362"/>
		<updated>2015-07-21T07:50:13Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Command Line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;DISPLAY&amp;amp;nbsp;|&amp;amp;nbsp; CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;PROCS | A [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &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;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD/PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;CREATEPROC | CREATE | CP [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &lt;br /&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;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78361</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78361"/>
		<updated>2015-07-21T07:47:27Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Command Line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;DISPLAY | CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;PROCS | A [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
&amp;lt;tr&amp;lt;th&amp;gt;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD/PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;CREATEPROC | CREATE | CP [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &lt;br /&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;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78360</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78360"/>
		<updated>2015-07-21T07:44:22Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;DISPLAY | CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;PROCS | A [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;FILE | FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP xxx &amp;lt;/tr&amp;gt;0&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP | GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
&amp;lt;tr&amp;lt;th&amp;gt;GPP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD/PWD&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;OCC [nnn]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;nnn&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;nnn&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Ignore Comment lines&#039;.&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;CREATEPROC | CREATE | CP [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &lt;br /&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;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78359</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78359"/>
		<updated>2015-07-21T07:40:28Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;DISPLAY | CODE | SHOW | CL [n]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;n&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;n&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;HAS | HA | H [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
If the string &#039;xxx&#039; is omitted the search string is cleared.&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;PROCS | A [xxxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&lt;br /&gt;
If the filter name &#039;xxxx&#039; is omitted then all procedures&lt;br /&gt;
are displayed.&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;AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
Hence this filters the current display listing to show&lt;br /&gt;
only those that also meet the new criteria.&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;+AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter by combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;. Hence this &lt;br /&gt;
adds additional procedures to the display listing.               &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;FILE/FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP  &amp;lt;/tr&amp;gt;0&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP/GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
&amp;lt;tr&amp;lt;th&amp;gt;GPP&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD/PWD&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;OCC [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;xxx&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;xxx&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Igonre Comment lines&#039;.&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;CREATEPROC|CREATE|CP [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &lt;br /&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;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78358</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78358"/>
		<updated>2015-07-21T07:31:35Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;DISPLAY [x]&amp;lt;br/&amp;gt;CODE [x]&amp;lt;br/&amp;gt;SHOW [x]&amp;lt;br/&amp;gt;CL [x]&amp;lt;br/&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;x&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;x&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;HAS/HA/H xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&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;PROCS xxx A xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&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;AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&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;+AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &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;OR xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;.               &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;FILE/FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP  &amp;lt;/tr&amp;gt;0&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP/GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
&amp;lt;tr&amp;lt;th&amp;gt;GPP&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD/PWD&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;OCC [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;xxx&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;xxx&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&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;HS [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Hide SEQs/BASEs&#039;. &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;IC [x]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
&#039;Igonre Comment lines&#039;.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;CREATEPROC|CREATE|CP [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
procedure will be created.  &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;LASTID | LID [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
blank.               &lt;br /&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;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78357</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78357"/>
		<updated>2015-07-21T07:24:16Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;DISPLAY [x]&amp;lt;br/&amp;gt;CODE [x]&amp;lt;br/&amp;gt;SHOW [x]&amp;lt;br/&amp;gt;CL [x]&amp;lt;br/&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;x&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;x&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;HAS/HA/H xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&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;PROCS xxx A xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&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;AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&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;+AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;OR xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;.               &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;FILE/FL xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context using the existing privileges to &lt;br /&gt;
the file.&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;FLP  &amp;lt;/tr&amp;gt;0&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the file context with prompt for password.&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;GROUP/GP xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context using the existing privileges to &lt;br /&gt;
the group.   &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
&amp;lt;tr&amp;lt;th&amp;gt;GPP&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the group context with prompt for password.&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;PASSWORD/PWD&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Reopens the current file or group with prompt for password.  &lt;br /&gt;
It implies a switch of privileges associated with the &lt;br /&gt;
password to the current file or group.&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;OCC [xxx]&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
value for the optional &#039;xxx&#039; is either a number between 1  &lt;br /&gt;
and 999 or &#039;ALL&#039;. If there is no &#039;xxx&#039; specified, it will &lt;br /&gt;
give a default value of 1 to the &#039;# of occurrences to find&#039;.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
               &lt;br /&gt;
  HS [x]       Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
               the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
               specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
               &#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
               &lt;br /&gt;
  IC [x]       Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
               for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
               specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
               &#039;Igonre Comment lines&#039;.&lt;br /&gt;
               &lt;br /&gt;
  CREATEPROC/  Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
  CREATE/      context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
  CP [xxx]     procedure will be created.  &lt;br /&gt;
&lt;br /&gt;
  LASTID/      Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
  LID [xxx]    The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
               blank.               &lt;br /&gt;
               &lt;br /&gt;
  EXIT/QUIT/   Return to previous screen without processing any prefix&lt;br /&gt;
  END          commands.&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78356</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78356"/>
		<updated>2015-07-21T07:18:27Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Command Line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&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;DISPLAY [x]&amp;lt;br/&amp;gt;CODE [x]&amp;lt;br/&amp;gt;SHOW [x]&amp;lt;br/&amp;gt;CL [x]&amp;lt;br/&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;x&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;x&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&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;HAS/HA/H xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the selection to procedures containing the specified&lt;br /&gt;
string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&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;PROCS xxx A xxxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter to &#039;xxx&#039;.  Wildcarding&lt;br /&gt;
is assumed and fully supported, so for instance, the&lt;br /&gt;
command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
characters are used, the search is done for the&lt;br /&gt;
specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
to procedures beginning with &#039;I.&#039;&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;AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
  (A|B) C -&amp;gt; A C|B C.&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;+AND xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
&#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
existing procedure name filter. For instance, if the current&lt;br /&gt;
value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
command will change it to &#039;A|B C&#039;.   &lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;OR xxx&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
the existing value with OR logic. For instance, if the &lt;br /&gt;
current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
&#039;OR C&#039; command will change it to &#039;A|B|C&#039;.               &lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
               &lt;br /&gt;
  FILE/FL xxx  Changes the file context using the existing privileges to &lt;br /&gt;
               the file.&lt;br /&gt;
               &lt;br /&gt;
  FLP          Changes the file context with prompt for password.&lt;br /&gt;
  &lt;br /&gt;
  GROUP/GP xxx Changes the group context using the existing privileges to &lt;br /&gt;
               the group.   &lt;br /&gt;
               &lt;br /&gt;
  GPP          Changes the group context with prompt for password.&lt;br /&gt;
  &lt;br /&gt;
  PASSWORD/PWD Reopens the current file or group with prompt for password.  &lt;br /&gt;
               It implies a switch of privileges associated with the &lt;br /&gt;
               password to the current file or group.&lt;br /&gt;
               &lt;br /&gt;
  OCC [xxx]    Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
               value for the optional &#039;xxx&#039; is either a number between 1  &lt;br /&gt;
               and 999 or &#039;ALL&#039;. If there is no &#039;xxx&#039; specified, it will &lt;br /&gt;
               give a default value of 1 to the &#039;# of occurrences to find&#039;.&lt;br /&gt;
               &lt;br /&gt;
  HS [x]       Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
               the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
               specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
               &#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
               &lt;br /&gt;
  IC [x]       Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
               for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
               specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
               &#039;Igonre Comment lines&#039;.&lt;br /&gt;
               &lt;br /&gt;
  CREATEPROC/  Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
  CREATE/      context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
  CP [xxx]     procedure will be created.  &lt;br /&gt;
&lt;br /&gt;
  LASTID/      Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
  LID [xxx]    The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
               blank.               &lt;br /&gt;
               &lt;br /&gt;
  EXIT/QUIT/   Return to previous screen without processing any prefix&lt;br /&gt;
  END          commands.&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78355</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78355"/>
		<updated>2015-07-21T07:10:27Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Command Line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&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;Description&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
DISPLAY [x]&amp;lt;br/&amp;gt;&lt;br /&gt;
CODE [x]&amp;lt;br/&amp;gt;&lt;br /&gt;
SHOW [x]&amp;lt;br/&amp;gt;&lt;br /&gt;
CL [x]&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
With these commands you can alter the number of lines of&lt;br /&gt;
code to be displayed beginning with the first of any found&lt;br /&gt;
search string.  Obviously, if no search string was&lt;br /&gt;
specified on the previous screen, this command has no&lt;br /&gt;
effect.  Valid values for &#039;x&#039; are 0 through 9. If there  &lt;br /&gt;
is no &#039;x&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
the &#039;# of context lines&#039;&lt;br /&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;
  HAS/HA/H xxx Changes the selection to procedures containing the specified&lt;br /&gt;
               string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
               containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
               search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
&lt;br /&gt;
  PROCS xxx    Changes the procedure name filter to &#039;xxx&#039;.  Wildcarding&lt;br /&gt;
  A xxxx       is assumed and fully supported, so for instance, the&lt;br /&gt;
               command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
               the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
               characters are used, the search is done for the&lt;br /&gt;
               specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
               to procedures beginning with &#039;I.&#039;&lt;br /&gt;
               &lt;br /&gt;
  AND xxx      Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
               the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
               law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
               procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
               change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
               (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
               &lt;br /&gt;
  +AND xxx     Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
               the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
               &#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
               existing procedure name filter. For instance, if the current&lt;br /&gt;
               value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
               command will change it to &#039;A|B C&#039;.   &lt;br /&gt;
               &lt;br /&gt;
  OR xxx       Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
               the existing value with OR logic. For instance, if the &lt;br /&gt;
               current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
               &#039;OR C&#039; command will change it to &#039;A|B|C&#039;.               &lt;br /&gt;
               &lt;br /&gt;
  FILE/FL xxx  Changes the file context using the existing privileges to &lt;br /&gt;
               the file.&lt;br /&gt;
               &lt;br /&gt;
  FLP          Changes the file context with prompt for password.&lt;br /&gt;
  &lt;br /&gt;
  GROUP/GP xxx Changes the group context using the existing privileges to &lt;br /&gt;
               the group.   &lt;br /&gt;
               &lt;br /&gt;
  GPP          Changes the group context with prompt for password.&lt;br /&gt;
  &lt;br /&gt;
  PASSWORD/PWD Reopens the current file or group with prompt for password.  &lt;br /&gt;
               It implies a switch of privileges associated with the &lt;br /&gt;
               password to the current file or group.&lt;br /&gt;
               &lt;br /&gt;
  OCC [xxx]    Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
               value for the optional &#039;xxx&#039; is either a number between 1  &lt;br /&gt;
               and 999 or &#039;ALL&#039;. If there is no &#039;xxx&#039; specified, it will &lt;br /&gt;
               give a default value of 1 to the &#039;# of occurrences to find&#039;.&lt;br /&gt;
               &lt;br /&gt;
  HS [x]       Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
               the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
               specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
               &#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
               &lt;br /&gt;
  IC [x]       Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
               for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
               specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
               &#039;Igonre Comment lines&#039;.&lt;br /&gt;
               &lt;br /&gt;
  CREATEPROC/  Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
  CREATE/      context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
  CP [xxx]     procedure will be created.  &lt;br /&gt;
&lt;br /&gt;
  LASTID/      Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
  LID [xxx]    The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
               blank.               &lt;br /&gt;
               &lt;br /&gt;
  EXIT/QUIT/   Return to previous screen without processing any prefix&lt;br /&gt;
  END          commands.&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78354</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78354"/>
		<updated>2015-07-21T06:04:29Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Set Colors screen (SetColors/SC) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (ScanSel/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by using [[#PF6 - SetColors|PF6 - SetColors]].  This navigates to the [[#Set Colors screen (SetColors/SC)|Set Colors screen]]. (did this exist before?)&lt;br /&gt;
&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New Bookmarks option====&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the ScanList page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the ScanSel screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
===Function key changes===&lt;br /&gt;
====PF4 - Reset Time====&lt;br /&gt;
Reset the date and time to the selected journal&#039;s initialization &lt;br /&gt;
date and time.    &lt;br /&gt;
====PF5 - Daemon only help====&lt;br /&gt;
Help for free sdaemon-only SirScan that is provided with Janus Web.                                               &lt;br /&gt;
====PF6 - SetColors====&lt;br /&gt;
This function key navigates to the SetColors page which can be used to change the colors for Entry Types.&lt;br /&gt;
&lt;br /&gt;
==Set Colors screen (SetColors/SC)==&lt;br /&gt;
This is a new screen to set the colors for the various Entry Types. The screen looks like:&lt;br /&gt;
 ..............&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (ScanList/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the ScanSel screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=PF5|PF6=&amp;gt; latest bookmark &amp;lt;=PF5|PF6=&amp;gt; refresh page (i.e. new bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78353</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78353"/>
		<updated>2015-07-21T06:03:52Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* New scan line color option */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (ScanSel/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by using [[#PF6 - SetColors|PF6 - SetColors]].  This navigates to the [[#Set Colors screen (SetColors/SC)|Set Colors screen]]. (did this exist before?)&lt;br /&gt;
&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New Bookmarks option====&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the ScanList page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the ScanSel screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
===Function key changes===&lt;br /&gt;
====PF4 - Reset Time====&lt;br /&gt;
Reset the date and time to the selected journal&#039;s initialization &lt;br /&gt;
date and time.    &lt;br /&gt;
====PF5 - Daemon only help====&lt;br /&gt;
Help for free sdaemon-only SirScan that is provided with Janus Web.                                               &lt;br /&gt;
====PF6 - SetColors====&lt;br /&gt;
This function key navigates to the SetColors page which can be used to change the colors for Entry Types.&lt;br /&gt;
&lt;br /&gt;
==Set Colors screen (SetColors/SC)==&lt;br /&gt;
This is a new screen to set the colors for the various Entry Types. The screen looks line:&lt;br /&gt;
 ..............&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (ScanList/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the ScanSel screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=PF5|PF6=&amp;gt; latest bookmark &amp;lt;=PF5|PF6=&amp;gt; refresh page (i.e. new bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78351</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78351"/>
		<updated>2015-07-21T05:57:02Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* PF5/PF6 - Previous/Next Bookmark (or refresh) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (ScanSel/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by using [[#PF6 - SetColors|PF6 - SetColors]].  This navaites to the [[#Set Colors screen (SetColors/SC)|Set Colors screen]]. (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New Bookmarks option====&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the ScanList page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the ScanSel screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
===Function key changes===&lt;br /&gt;
====PF4 - Reset Time====&lt;br /&gt;
Reset the date and time to the selected journal&#039;s initialization &lt;br /&gt;
date and time.    &lt;br /&gt;
====PF5 - Daemon only help====&lt;br /&gt;
Help for free sdaemon-only SirScan that is provided with Janus Web.                                               &lt;br /&gt;
====PF6 - SetColors====&lt;br /&gt;
This function key navigates to the SetColors page which can be used to change the colors for Entry Types.&lt;br /&gt;
&lt;br /&gt;
==Set Colors screen (SetColors/SC)==&lt;br /&gt;
This is a new screen to set the colors for the various Entry Types. The screen looks line:&lt;br /&gt;
 ..............&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (ScanList/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the ScanSel screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=PF5|PF6=&amp;gt; latest bookmark &amp;lt;=PF5|PF6=&amp;gt; refresh page (i.e. new bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78350</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78350"/>
		<updated>2015-07-21T05:56:07Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (ScanSel/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by using [[#PF6 - SetColors|PF6 - SetColors]].  This navaites to the [[#Set Colors screen (SetColors/SC)|Set Colors screen]]. (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New Bookmarks option====&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the ScanList page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the ScanSel screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
===Function key changes===&lt;br /&gt;
====PF4 - Reset Time====&lt;br /&gt;
Reset the date and time to the selected journal&#039;s initialization &lt;br /&gt;
date and time.    &lt;br /&gt;
====PF5 - Daemon only help====&lt;br /&gt;
Help for free sdaemon-only SirScan that is provided with Janus Web.                                               &lt;br /&gt;
====PF6 - SetColors====&lt;br /&gt;
This function key navigates to the SetColors page which can be used to change the colors for Entry Types.&lt;br /&gt;
&lt;br /&gt;
==Set Colors screen (SetColors/SC)==&lt;br /&gt;
This is a new screen to set the colors for the various Entry Types. The screen looks line:&lt;br /&gt;
 ..............&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (ScanList/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=PF5|PF6=&amp;gt; latest bookmark &amp;lt;=PF5|PF6=&amp;gt; refresh page (i.e. new bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78348</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78348"/>
		<updated>2015-07-21T05:51:26Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (ScanSel/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by using [[#PF6 - SetColors|PF6 - SetColors]].  This navaites to the [[#Set Colors screen (SetColors/SC)|Set Colors screen]]. (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New Bookmarks option====&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the ScanList page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the ScanSel screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
===Function key changes===&lt;br /&gt;
====PF6 - SetColors====&lt;br /&gt;
This function key navigates to the SetColors page which can be used to change the colors for Entry Types.&lt;br /&gt;
&lt;br /&gt;
==Set Colors screen (SetColors/SC)==&lt;br /&gt;
This is a new screen to set the colors for the various Entry Types. The screen looks line:&lt;br /&gt;
 ..............&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (ScanList/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=PF5|PF6=&amp;gt; latest bookmark &amp;lt;=PF5|PF6=&amp;gt; refresh page (i.e. new bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78347</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78347"/>
		<updated>2015-07-21T05:49:12Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Scan Select Screen (SCANSEL/SS) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (ScanSel/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by using [[#PF6 - SetColors|PF6]].  This navaites to the [[#Set Colors screen (SETCOLORS/SC)|Set Colors screen]]. (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New Bookmarks option====&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the ScanList page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
===Function key changes===&lt;br /&gt;
====PF6 - SetColors====&lt;br /&gt;
This function key navigates to the SetColors page which can be used to change the colors for Entry Types.&lt;br /&gt;
&lt;br /&gt;
==Set Colors screen (SETCOLORS/SC)==&lt;br /&gt;
This is a new screen to set the colors for the various Entry Types. The screen looks line:&lt;br /&gt;
 ..............&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=PF5|PF6=&amp;gt; latest bookmark &amp;lt;=PF5|PF6=&amp;gt; refresh page (i.e. new bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78346</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78346"/>
		<updated>2015-07-21T05:48:43Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* =PF6 - SetColors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by using [[#PF6 - SetColors|PF6]].  This navaites to the [[#Set Colors screen (SETCOLORS/SC)|Set Colors screen]]. (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New Bookmarks option====&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the ScanList page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
===Function key changes===&lt;br /&gt;
====PF6 - SetColors====&lt;br /&gt;
This function key navigates to the SetColors page which can be used to change the colors for Entry Types.&lt;br /&gt;
&lt;br /&gt;
==Set Colors screen (SETCOLORS/SC)==&lt;br /&gt;
This is a new screen to set the colors for the various Entry Types. The screen looks line:&lt;br /&gt;
 ..............&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=PF5|PF6=&amp;gt; latest bookmark &amp;lt;=PF5|PF6=&amp;gt; refresh page (i.e. new bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78345</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78345"/>
		<updated>2015-07-21T05:48:11Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by using [[#PF6 - SetColors|PF6]].  This navaites to the [[#Set Colors screen (SETCOLORS/SC)|Set Colors screen]]. (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New Bookmarks option====&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the ScanList page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
===Function key changes===&lt;br /&gt;
====PF6 - SetColors===&lt;br /&gt;
This function key navigates to the SetColors page which can be used to change the colors for Entry Types.&lt;br /&gt;
==Set Colors screen (SETCOLORS/SC)==&lt;br /&gt;
This is a new screen to set the colors for the various Entry Types. The screen looks line:&lt;br /&gt;
 ..............&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=PF5|PF6=&amp;gt; latest bookmark &amp;lt;=PF5|PF6=&amp;gt; refresh page (i.e. new bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78344</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78344"/>
		<updated>2015-07-21T05:40:22Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by ???  (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New Bookmarks option====&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the ScanList page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=PF5|PF6=&amp;gt; latest bookmark &amp;lt;=PF5|PF6=&amp;gt; refresh page (i.e. new bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78343</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78343"/>
		<updated>2015-07-21T05:34:39Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by ???  (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command without the BookmarkId (i.e. just &amp;quot;.&amp;quot;) will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78342</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78342"/>
		<updated>2015-07-21T05:31:51Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by ???  (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark Lines|Bookmark Lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark option on the ScanSel screen is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78341</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78341"/>
		<updated>2015-07-21T05:30:08Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by ???  (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark lines|Bookmark lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark setting is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78340</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78340"/>
		<updated>2015-07-21T05:27:39Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by ???  (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[#Bookmark lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
If the Bookmark setting is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78339</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78339"/>
		<updated>2015-07-21T05:24:39Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by ???  (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
&lt;br /&gt;
See [[Bookmark lines]] below for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
&lt;br /&gt;
If the Bookmark setting is set to &amp;quot;Y&amp;quot;, an additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
The bookmark line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78337</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78337"/>
		<updated>2015-07-21T05:20:52Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by ???  (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
The line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
See xxx for more details.&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
Also the size of Max records has increased to 7 digits.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
&lt;br /&gt;
As notes in xxx if the Bookmark setting is turn on &amp;quot;Y&amp;quot;, and additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78336</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78336"/>
		<updated>2015-07-21T05:17:30Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* New QT scan option */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====Increase size of Max records====&lt;br /&gt;
This has been increased to 7 digits.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by ???  (did this exist before?)&lt;br /&gt;
====New QT scan line option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
The line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
See xxx for more details.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
&lt;br /&gt;
As notes in xxx if the Bookmark setting is turn on &amp;quot;Y&amp;quot;, and additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78335</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78335"/>
		<updated>2015-07-21T05:16:06Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
The screen layout has changed with the Users field first. The field prompts label now consistently use &#039;:&#039; rather than the more verbose &#039;==&amp;gt;&#039;.&lt;br /&gt;
====Increase size of Max records====&lt;br /&gt;
This has been increased to 7 digits.&lt;br /&gt;
====New scan line color option====&lt;br /&gt;
By setting Use Color to &#039;Y&#039; the scan lines are colored based on the entry types.  The colors can be changed by ???  (did this exist before?)&lt;br /&gt;
====New QT scan option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
&lt;br /&gt;
====Start Time changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
====Max I/O and Max Record changes====&lt;br /&gt;
The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
The line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
See xxx for more details.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
&lt;br /&gt;
As notes in xxx if the Bookmark setting is turn on &amp;quot;Y&amp;quot;, and additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_RKTools_V7.5&amp;diff=78334</id>
		<title>Release notes for RKTools V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_RKTools_V7.5&amp;diff=78334"/>
		<updated>2015-07-21T05:08:45Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following are the release notes for the components of ULSPF that have been updated for version S7.5.  Please note that the version numbering has changed and is now linked to the Model 204 release version number. Hence ULSPF S7.5 can only run on Model 204 release 7.5 or higher.  The ULSPF version prior to S7.5 was 801. &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirPro version S7.6 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirLib version S7.5 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirScan version S7.5 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;New TN3270 editor [[SoulEdit]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
==Common ULSPF enhancenments==&lt;br /&gt;
&lt;br /&gt;
===Enhanced fast-path===&lt;br /&gt;
Fast-pathing between ULSPF components is supported by typing the component name in the command line. For instance, typing SIRMON from anywhere inside SIRPRO or SIRSCAN will take you to the SirMon System Overview screen. Typing SIRPRO 8 from inside SirMon will take you to the SirPro Group Definition page.&lt;br /&gt;
&lt;br /&gt;
===Enhanced help===&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78333</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78333"/>
		<updated>2015-07-21T04:53:41Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
Prompts &#039;==&amp;gt;&#039; replaced by &#039;:&#039; &lt;br /&gt;
====Increase size of Max records===&lt;br /&gt;
This has been increased to 7 digits.&lt;br /&gt;
====New QT scan option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====Functionality changes====&lt;br /&gt;
&lt;br /&gt;
*  The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
&lt;br /&gt;
*  The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
The line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
See xxx for more details.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
&lt;br /&gt;
As notes in xxx if the Bookmark setting is turn on &amp;quot;Y&amp;quot;, and additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78332</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78332"/>
		<updated>2015-07-21T04:39:22Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
Prompts &#039;==&amp;gt;&#039; replaced by &#039;:&#039; &lt;br /&gt;
====New QT scan option====&lt;br /&gt;
(project M204CMDS - Alan)&lt;br /&gt;
====Functionality changes====&lt;br /&gt;
&lt;br /&gt;
*  The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
&lt;br /&gt;
*  The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
The line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
See xxx for more details.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New .[BookmarkId] command====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
&lt;br /&gt;
===Screen display changes===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
&lt;br /&gt;
As notes in xxx if the Bookmark setting is turn on &amp;quot;Y&amp;quot;, and additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - cursor sensitive scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_RKTools_V7.5&amp;diff=78331</id>
		<title>Release notes for RKTools V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_RKTools_V7.5&amp;diff=78331"/>
		<updated>2015-07-21T04:36:07Z</updated>

		<summary type="html">&lt;p&gt;Heikki: /* Enhanced fast-path */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following are the release notes for the components of ULSPF that have been updated for version S7.5. Please note that the version numbering has changed and is now linked to the Model 204 release version number.  Hence ULSPF S7.5 can only run on Model 204 release 7.5 or higher.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirPro version S7.6 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirLib version S7.5 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirScan version S7.5 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;New TN3270 editor [[SoulEdit]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
==Common ULSPF enhancenments==&lt;br /&gt;
&lt;br /&gt;
===Enhanced fast-path===&lt;br /&gt;
Fast-pathing between ULSPF components is supported by typing the component name in the command line. For instance, typing SIRMON from anywhere inside SIRPRO or SIRSCAN will take you to the SirMon System Overview screen. Typing SIRPRO 8 from inside SirMon will take you to the SirPro Group Definition page.&lt;br /&gt;
&lt;br /&gt;
===Enhanced help===&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78330</id>
		<title>Release notes for SirScan V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirScan_V7.5&amp;diff=78330"/>
		<updated>2015-07-21T03:21:12Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirScan&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Scan Select Screen (SCANSEL/SS)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
&lt;br /&gt;
====Layout changes====&lt;br /&gt;
Prompts &#039;==&amp;gt;&#039; replaced by &#039;:&#039; &lt;br /&gt;
&lt;br /&gt;
====Functionality changes====&lt;br /&gt;
&lt;br /&gt;
*  The &amp;lt;b&amp;gt;Start time (HH:MM:SS)&amp;lt;/b&amp;gt; field will now accept periods(.) as seperators (which means that the valid formats for this field are HH:MM:SS, HH.MM.SS or HHMMSS)&lt;br /&gt;
&lt;br /&gt;
*  The &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields have been changed to recognize, reset and report the situation where the values entered are greater than the maximum allowable.  The maximum allowable values, for the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; fields, can be viewed and/or set using the SirAdmin apsy (within the &amp;lt;b&amp;gt;SirScan SCLASS settings&amp;lt;/b&amp;gt; option).  If the &amp;lt;b&amp;gt;Max I/O&#039;s.:&amp;lt;/b&amp;gt; and/or &amp;lt;b&amp;gt;Max records:&amp;lt;/b&amp;gt; values, entered on the SCANSEL screen, exceed those recorded in SirAdmin, then the values will be automatically reset to the maximum allowable and an informational message will be displayed on the &#039;message line&#039; (2nd bottom line of the screen).&lt;br /&gt;
&lt;br /&gt;
====New field Bookmarks====&lt;br /&gt;
&lt;br /&gt;
Bookmarks are a new feature.  When turned on (value &amp;quot;Y&amp;quot;), a bookmark line will&lt;br /&gt;
be created in the display on the SCANLIST page for each successive scan request. &lt;br /&gt;
Note that bookmarks are only active if the Interval (Minutes) field is left blank.&lt;br /&gt;
The line looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;______________________________________________________ BookMark 4: 19:59:37.23 - 19:59:58.90&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It shows the bookmark number and the time range for that scan.  The bookmarks &lt;br /&gt;
are sequentially numbered and the message line at the bottom of the screen shows&lt;br /&gt;
the lasted bookmark id, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;--------------------------------------------------------------------- -- Latest Bookmark: 4&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bookmarks are saved for the session. Hence if SirScan is exited and re-entered&lt;br /&gt;
during the same session, the previous bookmarks are retained and can be&lt;br /&gt;
re-displayed.  The new bookmark id&#039;s will follow on from the last one previously&lt;br /&gt;
created.  This provides an alternative to noting down the time of a scan in&lt;br /&gt;
cases where the information needs to be re-displayed. Also it is possible to&lt;br /&gt;
change the Display and Format Entry Types on this screen and re-display the&lt;br /&gt;
journal lines for a previous bookmark period.&lt;br /&gt;
&lt;br /&gt;
See xxx for more details.&lt;br /&gt;
&lt;br /&gt;
==Scan List Screen (SCANLIST/SL)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
====New command .[BookmarkId]====&lt;br /&gt;
A command in format .[BookmarkId] will navigate direct to that bookmark, e.g. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;code&amp;quot;&amp;gt;.22&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A command with the BookmarkID will navigate to the latest bookmark.&lt;br /&gt;
====Fix Left/Right command====&lt;br /&gt;
(project LFTRTLFT - Alan)&lt;br /&gt;
====Fix ALL command====&lt;br /&gt;
(project ALLON - Alan) &lt;br /&gt;
===Screen display changes===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Bookmark Lines====&lt;br /&gt;
&lt;br /&gt;
As notes in xxx if the Bookmark setting is turn on &amp;quot;Y&amp;quot;, and additional line&lt;br /&gt;
is displayed separating each bookmark scan period.  The current (active) bookmark&lt;br /&gt;
is shown in green whilst old bookmarks are shown in red.&lt;br /&gt;
&lt;br /&gt;
===Function Keys===&lt;br /&gt;
&lt;br /&gt;
====PF5/PF6 - Previous/Next Bookmark (or refresh)==== &lt;br /&gt;
If the Interval (Minutes) field in the SCANSEL screen is left blank, then PF5 will&lt;br /&gt;
navigate to the previous bookmark and PF6 to the next bookmark, or create a new one &lt;br /&gt;
if already on the last bookmark. Hence the sequence is:&lt;br /&gt;
&lt;br /&gt;
 old bookmarks &amp;lt;=&amp;gt; latest bookmark &amp;lt;=&amp;gt; refresh page (i.e. the next bookmark).  &lt;br /&gt;
&lt;br /&gt;
The scan listing for the old bookmarks is “frozen”, e.g. pressing enter or “bottom”&lt;br /&gt;
will not add to the listing and only the scan lines for that bookmark are shown.&lt;br /&gt;
&lt;br /&gt;
However the latest bookmark listing can be added to with fresh scans.  Bookmarks on this page listing are shown in green.  If you return to the latest bookmark, only the lines for that bookmark are shown – any others previously on the listing become old bookmarks that you can use PF5 to display.  Note that pressing PF5 from the latest bookmark page will take you to the bookmark one less than the latest bookmark, even if the display has a number of earlier bookmarks that have accumulated on the page.&lt;br /&gt;
&lt;br /&gt;
Note that PF6 can be used to refresh the listing page so it is ready for new journal lines (if already on the latest bookmark). This is equivalent to pressing PF3, keying Start Time -0 and then Enter.&lt;br /&gt;
&lt;br /&gt;
====PF7/PF8 - line scrolling====&lt;br /&gt;
The scrolling has been enhanced to scroll based on the position of the&lt;br /&gt;
cursor when the cursor is in the listing area.  If PF8 is pressed then the page scrolls&lt;br /&gt;
so the line under the cursor becomes the top line. If PF7 is pressed the the line under&lt;br /&gt;
the cursor becomes the bottom line.  The cursor is reset to the Command field so &lt;br /&gt;
subsequent scrolling will be for full pages.&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_RKTools_V7.5&amp;diff=78329</id>
		<title>Release notes for RKTools V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_RKTools_V7.5&amp;diff=78329"/>
		<updated>2015-07-21T03:13:33Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following are the release notes for the components of ULSPF that have been updated for version S7.5. Please note that the version numbering has changed and is now linked to the Model 204 release version number.  Hence ULSPF S7.5 can only run on Model 204 release 7.5 or higher.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirPro version S7.6 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirLib version S7.5 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Release notes for SirScan version S7.5 -- DRAFT]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;New TN3270 editor [[SoulEdit]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
==Common ULSPF enhancenments==&lt;br /&gt;
&lt;br /&gt;
===Enhanced fast-path===&lt;br /&gt;
Fast-pathing between ULSPF components is supported by typing the component name in the command line. For instance, typing SIRMON ! from anywhere inside SIRPRO or SIRSCAN will take you to the SirMon System Overview screen. Typing SIRPRO 8 from inside SirMon will take you to the SirPro Group Definition page.&lt;br /&gt;
===Enhanced help===&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
	<entry>
		<id>https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78294</id>
		<title>Release notes for SirPro V7.5</title>
		<link rel="alternate" type="text/html" href="https://m204wiki.rocketsoftware.com/index.php?title=Release_notes_for_SirPro_V7.5&amp;diff=78294"/>
		<updated>2015-07-20T12:07:02Z</updated>

		<summary type="html">&lt;p&gt;Heikki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document lists the changes that have been made for &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;SirPro&amp;lt;/var&amp;gt; version S7.5. It requires &amp;lt;var class=&amp;quot;product&amp;quot;&amp;gt;Model 204&amp;lt;/var&amp;gt; release 7.5 or higher.&lt;br /&gt;
&lt;br /&gt;
==Procedure Search screen (SEARCH)==&lt;br /&gt;
&lt;br /&gt;
===Field changes===&lt;br /&gt;
The searching capabilities have been enhanced to provide better impact analysis. The following fields has been changed or added.&lt;br /&gt;
====Procedure name====&lt;br /&gt;
Enter a procedure name or search mask.  If a procedure  &lt;br /&gt;
name is entered and any matching procedures are found,  &lt;br /&gt;
a procedure list is presented.                          &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcard strings are valid in this field, using &amp;quot;*&amp;quot; as  &lt;br /&gt;
a substitution character for any number of characters in&lt;br /&gt;
the procedure name.  For example: *XYZ will find all    &lt;br /&gt;
procedure names ending in the string XYZ, and XYZ* will &lt;br /&gt;
find all procedure names beginning with XYZ.            &lt;br /&gt;
                                                        &lt;br /&gt;
A space indicates &amp;quot;AND&amp;quot;, so entering &amp;quot;PU END&amp;quot; would     &lt;br /&gt;
return only those procedures whose names contain both   &lt;br /&gt;
the character sets &amp;quot;PU&amp;quot; and &amp;quot;ND&amp;quot;, so, PUNP-END or       &lt;br /&gt;
PUMPKIN.SPENDER.                                        &lt;br /&gt;
                                                        &lt;br /&gt;
The &amp;quot;or&amp;quot; bar indicates &amp;quot;OR&amp;quot;, so &amp;quot;PU|ND&amp;quot; would find any  &lt;br /&gt;
procedures containing the strings &amp;quot;PU&amp;quot; or &amp;quot;ND&amp;quot;.  This   &lt;br /&gt;
might include &amp;quot;PUMP&amp;quot;, &amp;quot;COLORPURPLE&amp;quot; and &amp;quot;NINTENDO&amp;quot;.     &lt;br /&gt;
                                                        &lt;br /&gt;
Wildcards can be used in conjuntion with the AND/OR     &lt;br /&gt;
selections, so &amp;quot;PUPR*|SCPR*|MOPR*&amp;quot; would find all       &lt;br /&gt;
procedures starting with any of the above strings.   &lt;br /&gt;
                                                     &lt;br /&gt;
The routine currently has a bias in favor of &amp;quot;OR&amp;quot;    &lt;br /&gt;
selections, so a selection like &amp;quot;PUPR*|SCPR AND&amp;quot;     &lt;br /&gt;
won&#039;t work.  It will return all procedures beginning &lt;br /&gt;
with PUPR, then will attempt to add to the list      &lt;br /&gt;
any procedure with the characters &amp;quot;SCPR AND&amp;quot;, which  &lt;br /&gt;
will find nothing, because of the embedded space.    &lt;br /&gt;
So do not combine AND and OR selections.             &lt;br /&gt;
====Search strings====&lt;br /&gt;
The maximum length has bene increased to nn.&lt;br /&gt;
====# of context lines====&lt;br /&gt;
Numeric indicator (0 through 9) of number of lines of code &lt;br /&gt;
to display before and after the line containing the   &lt;br /&gt;
search string.                                                       &lt;br /&gt;
====# occurrences to find====&lt;br /&gt;
The number (from 1 to 999) that specifies the number of occurrences within a procedure that will &lt;br /&gt;
be displayed.&lt;br /&gt;
====Hide SEQa/BASEs====&lt;br /&gt;
SirLib users will see a prompt and entry area that allows      &lt;br /&gt;
the display or hiding of SEQ. and BASE. procedures, which      &lt;br /&gt;
are used in code management functions but are not intended     &lt;br /&gt;
to be edited directly.  Enter &amp;quot;Y&amp;quot; to prevent this procedures   &lt;br /&gt;
from being displayed, and &amp;quot;N&amp;quot; to display them.                 &lt;br /&gt;
====Ignore Comment Lines====&lt;br /&gt;
If set to Y it will ignore any Soul formatted comment lines. If set to N all found lines will be included.&lt;br /&gt;
&lt;br /&gt;
===New Function Keys===&lt;br /&gt;
====PF5 - Toggle between case sensitive/insensitive====&lt;br /&gt;
In Case Sensitive mode, a search for &amp;quot;html&amp;quot; would only find the       &lt;br /&gt;
lower-case version of that string.  In Case-Insensitive mode  &lt;br /&gt;
the same search would find procedures containing either       &lt;br /&gt;
&amp;quot;html&amp;quot; or &amp;quot;HTML&amp;quot;.                                             &lt;br /&gt;
====PF6 - Create Proc====&lt;br /&gt;
===Other features===&lt;br /&gt;
====Longer proc names====&lt;br /&gt;
====Better subsystem transfer====&lt;br /&gt;
====Save profile for each change====&lt;br /&gt;
&lt;br /&gt;
==Procedure List screen (PL)==&lt;br /&gt;
===Field changes===&lt;br /&gt;
====Command Line====&lt;br /&gt;
Most of the functions able to be performed on the Search screen may now be done as commands in the Command Line field. In addition commands can be strung together using the semicolon as a delimiter. For example to switch to a new field and display those procedures that have HELP in their name can be done as:&lt;br /&gt;
FL SIRIUS;A HELP&lt;br /&gt;
&lt;br /&gt;
Most commands have a full name and an abbreviation.&lt;br /&gt;
&lt;br /&gt;
  DISPLAY [x]  Changes the value of &#039;# of context lines&#039;.&lt;br /&gt;
  CODE [x]     With these commands you can alter the number of lines of&lt;br /&gt;
  SHOW [x]     code to be displayed beginning with the first of any found&lt;br /&gt;
  CL [x]       search string.  Obviously, if no search string was&lt;br /&gt;
               specified on the previous screen, this command has no&lt;br /&gt;
               effect.  Valid values for &#039;x&#039; are 0 through 9. If there  &lt;br /&gt;
               is no &#039;x&#039; specified,it will give a default value of 0 to  &lt;br /&gt;
               the &#039;# of context lines&#039;. &lt;br /&gt;
&lt;br /&gt;
  HAS/HA/H xxx Changes the selection to procedures containing the specified&lt;br /&gt;
               string &#039;xxx&#039;. &#039;HAS $GETG&#039; restricts procedures to those&lt;br /&gt;
               containing $GETG. HAS does not support wildcards, so a&lt;br /&gt;
               search for &#039;locate*&#039; will look for the string &#039;locate*&#039;.&lt;br /&gt;
&lt;br /&gt;
  PROCS xxx    Changes the procedure name filter to &#039;xxx&#039;.  Wildcarding&lt;br /&gt;
  A xxxx       is assumed and fully supported, so for instance, the&lt;br /&gt;
               command &#039;PROCS CADDIE&#039; will find all procedures with&lt;br /&gt;
               the string &#039;CADDIE&#039; in its name.  If specific wildcard&lt;br /&gt;
               characters are used, the search is done for the&lt;br /&gt;
               specified pattern, so &#039;PROCS I.*&#039; restricts the display&lt;br /&gt;
               to procedures beginning with &#039;I.&#039;&lt;br /&gt;
               &lt;br /&gt;
  AND xxx      Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
               the existing value with AND logic, applying &#039;distributive  &lt;br /&gt;
               law&#039; if necessary. For instance, if the current value of the &lt;br /&gt;
               procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; command will &lt;br /&gt;
               change it to &#039;A C|B C&#039; by applying &#039;distributive law&#039;:  &lt;br /&gt;
               (A|B) C -&amp;gt; A C|B C.&lt;br /&gt;
               &lt;br /&gt;
  +AND xxx     Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
               the existing value with AND logic, but WITHOUT applying &lt;br /&gt;
               &#039;distributive law&#039;. It just simply appends &#039;xxx&#039; to the &lt;br /&gt;
               existing procedure name filter. For instance, if the current&lt;br /&gt;
               value of the procedure name filter is &#039;A|B&#039;, an &#039;AND C&#039; &lt;br /&gt;
               command will change it to &#039;A|B C&#039;.   &lt;br /&gt;
               &lt;br /&gt;
  OR xxx       Changes the procedure name filter bying combining &#039;xxx&#039; with &lt;br /&gt;
               the existing value with OR logic. For instance, if the &lt;br /&gt;
               current value of the procedure name filter is &#039;A|B&#039;, an  &lt;br /&gt;
               &#039;OR C&#039; command will change it to &#039;A|B|C&#039;.               &lt;br /&gt;
               &lt;br /&gt;
  FILE/FL xxx  Changes the file context using the existing privileges to &lt;br /&gt;
               the file.&lt;br /&gt;
               &lt;br /&gt;
  FLP          Changes the file context with prompt for password.&lt;br /&gt;
  &lt;br /&gt;
  GROUP/GP xxx Changes the group context using the existing privileges to &lt;br /&gt;
               the group.   &lt;br /&gt;
               &lt;br /&gt;
  GPP          Changes the group context with prompt for password.&lt;br /&gt;
  &lt;br /&gt;
  PASSWORD/PWD Reopens the current file or group with prompt for password.  &lt;br /&gt;
               It implies a switch of privileges associated with the &lt;br /&gt;
               password to the current file or group.&lt;br /&gt;
               &lt;br /&gt;
  OCC [xxx]    Changes the value of &#039;# of occurrences to find&#039;. The valid  &lt;br /&gt;
               value for the optional &#039;xxx&#039; is either a number between 1  &lt;br /&gt;
               and 999 or &#039;ALL&#039;. If there is no &#039;xxx&#039; specified, it will &lt;br /&gt;
               give a default value of 1 to the &#039;# of occurrences to find&#039;.&lt;br /&gt;
               &lt;br /&gt;
  HS [x]       Changes the value of &#039;Hide SEQs/BASEs&#039;. The valid value for   &lt;br /&gt;
               the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
               specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
               &#039;Hide SEQs/BASEs&#039;. &lt;br /&gt;
               &lt;br /&gt;
  IC [x]       Changes the value of &#039;Ignore Comment lines&#039;. The valid value    &lt;br /&gt;
               for the optional &#039;x&#039; is &#039;Y&#039; or &#039;N&#039;. If there is no &#039;x&#039; &lt;br /&gt;
               specified, it will give a default value of &#039;Y&#039; to the &lt;br /&gt;
               &#039;Igonre Comment lines&#039;.&lt;br /&gt;
               &lt;br /&gt;
  CREATEPROC/  Creates a new procedure named &#039;xxx&#039; in the current file/group    &lt;br /&gt;
  CREATE/      context. If there is no &#039;xxx&#039; specified, an unnamed     &lt;br /&gt;
  CP [xxx]     procedure will be created.  &lt;br /&gt;
&lt;br /&gt;
  LASTID/      Changes the value of &#039;Last Updater ID&#039;.     &lt;br /&gt;
  LID [xxx]    The valid value for &#039;xxx&#039; is a string not longer than 10, or      &lt;br /&gt;
               blank.               &lt;br /&gt;
               &lt;br /&gt;
  EXIT/QUIT/   Return to previous screen without processing any prefix&lt;br /&gt;
  END          commands.&lt;br /&gt;
&lt;br /&gt;
====Selection field====&lt;br /&gt;
The following procedure selection option has been added:&lt;br /&gt;
&lt;br /&gt;
  E  (Edit):  Invokes the [[soulEdit|SoulEditor]]. &lt;br /&gt;
&lt;br /&gt;
The following new selection options a part of the&lt;br /&gt;
Sirius Configuration and Change Control System (SirLib).  If SirLib is&lt;br /&gt;
not installed then these commands are not valid.  Further information&lt;br /&gt;
on managed updates and the Configuration Management system is in the&lt;br /&gt;
SirLib User&#039;s Guide.&lt;br /&gt;
&lt;br /&gt;
  U (Undo): May only be executed against a change deck.  This command&lt;br /&gt;
     performes the same operation as a Q, resulting in a &amp;quot;working&amp;quot;&lt;br /&gt;
     procedure and a sequenced copy of that procedure being created&lt;br /&gt;
     in the user&#039;s selected development procfile.  However, the U&lt;br /&gt;
     command specifically includes the change deck against which it is&lt;br /&gt;
     executed in the code for the working procedure, but NOT in the&lt;br /&gt;
     code from the sequenced copy.  In other words, it recreates&lt;br /&gt;
     the state of the development procedures that created the change&lt;br /&gt;
     deck against which the U command is executed.&lt;br /&gt;
&lt;br /&gt;
     Typically, the U command is used to recreate the state of development&lt;br /&gt;
     when the programmer has accidentally deleted the procedures she&lt;br /&gt;
     was working on, either manually, or via the &amp;quot;Clean-up&amp;quot; switch on&lt;br /&gt;
     the Xcompare screen.&lt;br /&gt;
&lt;br /&gt;
     The U command is a special-use feature, and there are a number&lt;br /&gt;
     of ways in which it will fail to work -- most notably, if the&lt;br /&gt;
     selected change deck is somewhere in the middle of a series of&lt;br /&gt;
     changes and, by excluding it from procedure creation, some code&lt;br /&gt;
     dependency is missing.  However, for its primary function --&lt;br /&gt;
     recovering from a mistake that was made very recently, typically&lt;br /&gt;
     as the most recent change to a procedure, it should always work.&lt;br /&gt;
&lt;br /&gt;
  Y  This change-control prefix command provides a special check-out&lt;br /&gt;
     ability in which the user can &amp;quot;refresh&amp;quot; their local working copy&lt;br /&gt;
     of a procedure with changes that have been checked in by other&lt;br /&gt;
     programmers since the working copy was originally taken from&lt;br /&gt;
     the source procedure file.  &amp;quot;Y&amp;quot; is applied against the working&lt;br /&gt;
     procedure, a screen is presented, and the result is a new&lt;br /&gt;
     working procedure with all updates applied AND the user&#039;s current&lt;br /&gt;
     changes still in place, and a sequenced copy that has all updates&lt;br /&gt;
     applied, but the user&#039;s current changes not in place.&lt;br /&gt;
&lt;br /&gt;
     In other words, the &amp;quot;Y&amp;quot; command is very much like a &amp;quot;Q&amp;quot; command,&lt;br /&gt;
     but it is done while changes are in progress, and it slips&lt;br /&gt;
     into place other changes that have occurred since the original&lt;br /&gt;
     procedure check-out.&lt;br /&gt;
&lt;br /&gt;
== New PL subsystem==&lt;br /&gt;
(Adrian to complete)&lt;br /&gt;
&lt;br /&gt;
==Enhanced Help==&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Heikki</name></author>
	</entry>
</feed>