view test/resources/sysman_handbook.html @ 11:8f23347884c0

Deal with double dashes surrounded by words. ReplaceTransformer can now replace specific group.
author smith@nwoca.org
date Fri, 28 Jan 2011 13:57:25 -0500
parents 22ed6d93442c
children
line wrap: on
line source
<html>
<a name="first_page"></a>

<!-- This file created using DECdocument  Version V3.3h on 25-JAN-2011 20:18:10.51 -->
<!-- TAG definitions version: V3.3h -->
<!-- The SDML doctype is: SOFTWARE.REFERENCE -->
<!-- The output destination was: HTML -->
<!-- SDML file is: NWB:[SMITH.DEV.SDML]OECN10_SYSMAN_HANDBOOK.SDML -->

<body>
<head>
<title>Ohio Educational Computer Network System (OECN)</title>
<style>
A:hover {color: green}
A:active {color: red; background-color: white}
</style>
</head>
<h1 align="center">Ohio Educational Computer Network System (OECN)</h1>
<h1 align="center">System Manager Manual</h1>
As Developed by: Ohio Department of Education, State Software 
Development Team
<p align=center>
<strong>Revision/Update Information: </strong>
May, 2001

<p>
<hr size=5>
<h4>Copyright &copy;1992, 1995 Ohio Department of Education</h4>

<p>
Permission to reproduce this document is hereby granted, provided that 
all such reproductions include all of this document (including this 
copyright notice), and are not distributed for profit or resale.
<p>
<table border=5>
  <tr>
    <td width=120 align=center>
<a href="oecn10_sysman_handbook_full_contents.html"><font size=+2>Contents</font></a>
    </td>
  </tr>
</table>
<a name="post_contents"></a>

<p>
<hr size=5>
<a name="menu_processor"><h1>Menu Processor Theory and Implementation</h1></a>
<br>
<br>

<p>
This section contains 6 chapters which describe the OECN Menu Processor 
for the system manager. It includes a complete description of the 
theory and implementation of the menu processor on a VAX/VMS system. 
The 6 chapters are:

<p>
 Introduction
<br>
        Theory
<br>
 Implementation
<br>
 Invoking the Menu Processor
<br>
 Modifying and Creating Menu Systems
<br>
 Customizing Menus from the Distribution

<p>
<hr size=5>
<a name="menu_intro"><h1>Introduction</h1></a>

<p>
 The OECN Menu processor provides a flexible user menu interface to 
 State Software programs. It also can be used to create menus for DCL 
 commands, and other layered products. Menu definitions will be provided 
 for all state software programs. Individual A-sites will be able to add 
 customized menus to the default menu system provided.

<a name="menu_features_head"><h1>Features</h1></a>

<p>
    The Menu processor provides the following features:

<ul>
  <li>User may access an item by its item number or label.
  <li>Abbreviations are allowed on the current menu.
  <li>Aliases are supplied for all items. The user may enter the label 
  name for any item on any menu in the current menu system.
  <li>Help may be obtained for the current menu via the VMS Help utility.
  <li>Users will only see the items on the menu that they are authorized 
  to access.
</ul>

<p>
    Features for the system manager:

<ul>
  <li>May be used for CAPTIVE user accounts.
  <li>Menus or items may be easily added or removed.
  <li>Access to items and menus may be controlled with the standard 
  OECN_xxxx VMS security identifiers.
  <li>The OSA utility may be used to customize security.
  <li>A menu system may consist of multiple menu files. This allows 
  individual A-sites to add custom menus without modifying the menus 
  included in the distribution.
  <li>By default, does not spawn a subprocess when executing a command. 
  All commands execute in the current process. This prevents the 
  excessive overhead associated with repeatedly spawning subprocesses.
  <li>Optionally, spawns most commands in a subprocess. Spawning commands 
  may increase response time for larger VAX processors. This may be 
  configured by the system manager.
  <li>May be used from batch if the third parameter to the OECN_MENU 
  procedure is used.
  <li>Optional timeout feature that automatically exits the menu system 
  if the user remains inactive for a specified period.
</ul>

<p>
<hr size=5>
<a name="menu_theory"><h1>Theory</h1></a>

<p>
 The basic theory behind the Menu processor is fairly simple. The menu 
 definitions are stored in an RMS indexed file. The menu definitions are 
 flexible enough to allow creation of menus containing any combination 
 of DCL commands, programs and information.

<a name="menu_terms_head"><h1>Definition of Terms</h1></a>

<p>
 First, it will be helpful to define some terms that will be used 
 throughout the rest of this document. <p>

<table border=3>
  <caption><a name="menu_terms_tab"><strong> Menu System Terms</strong></a></caption>
  <tr>
    <th align=center>Term </th>
    <th align=center>Meaning </th>
  </tr>
  <tr>
    <td>
      Menu Processor
    </td>
    <td>
      The program that the user runs to enter a menu system.
    </td>
  </tr>
  <tr>
    <td>
      menu
    </td>
    <td>
      A menu consists of the menu heading and the menu items on that menu.
    </td>
  </tr>
  <tr>
    <td>
      menu name
    </td>
    <td>
      The name of the menu as defined in the MENUEDT program.
    </td>
  </tr>
  <tr>
    <td>
      menu item
    </td>
    <td>
      An item on a menu. An item belongs to a specific menu and must have a 
      label that is unique throughout the menu system.
    </td>
  </tr>
  <tr>
    <td>
      label
    </td>
    <td>
      A label is the unique name for an item. It is defined in the MENUEDT 
      program and is the label the user will see on the actual menu.
    </td>
  </tr>
  <tr>
    <td>
      menu file
    </td>
    <td>
      A file created by MENUEDT that contains the menu definitions for one 
      for more menus.
    </td>
  </tr>
  <tr>
    <td>
      menu system
    </td>
    <td>
      A menu system is a collection of menus that the user has access to. 
      This is the
      <strong>logical</strong> menu system as viewed by a specific user. A 
      system may consist of one or more physical menu files.
    </td>
  </tr>
  <tr>
    <td>
      menu specification
    </td>
    <td>
      A menu specification is the format for specifying a menu. The 
      specification may contain a file and/or a menu name.
    </td>
  </tr>
  <tr>
    <td>
      alias
    </td>
    <td>
      For each item in the menu system an alias is created. It has the same 
      name as the item's label. The alias is global to the entire menu 
      system, i.e., it crosses all menu file boundaries. The alias must be 
      unique within each menu system.
    </td>
  </tr>
</table>

<a name="menu_files_theory"><h1>How Menu Files Create a Menu System</h1></a>

<p>
<a href="oecn10_sysman_handbook_full.html#menu_system_fig">Figure 2-1</a> displays a graphical representation of a possible menu 
system.
<a name="menu_system_fig"></a>
<p>
<strong>Conceptual View of a Menu system</strong>
<hr>

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
+-----------------------Menu-System-------------------+ 
|            +Menu-File+                              | 
|            |         |                +-Alias-File-+| 
|            | +Menu+  |                |            || 
|            | |    |  |                |            || 
|            | +----+  |                |            || 
|            +----+----+                |            || 
|         +-------+------------+        +------------+| 
| +---Menu+File--+        +Menu+File-+  +-Secur-File-+| 
| | +Menu+       |        |          |  |            || 
| | |    |       |        | +Menu+   |  |            || 
| | +-+--+       |        | |    |   |  |            || 
| |   +------+   |        | +----+   |  |            || 
| | +Menu+ +Menu+|        +----+-----+  +------------+| 
| | |    | |    ||        +----+------+               | 
| | +----+ +-+--+|        |           |               | 
| |   +------+   |   +Menu+File+ +Menu+File+          | 
| | +Menu+ +Menu+|   | +Menu+  | | +Menu+  |          | 
| | |    | |    ||   | |    |  | | |    |  |          | 
| | +----+ +----+|   | +----+  | | +----+  |          | 
| +--------------+   +---------+ +---------+          | 
+-----------------------------------------------------+ 
</pre>
</table>

<p>
 You can see from <a href="oecn10_sysman_handbook_full.html#menu_system_fig">Figure 2-1</a> that a menu system as seen by the user may 
 consist of multiple menu files, and a menu file may contain multiple 
 menus. This provides considerable flexibility for designing and 
 modifying a menu system.

<p>
 The menu system that is included with the distribution will have a 
 separate menu file for each OECN state software package. Additionally, 
 each major package will have a <strong>local</strong> menu. This local 
 menu will be in a separate menu file and left blank. You will be able 
 to customize this local menu without disturbing the other menus.

<p>
 A more detailed description of how to modify and create menus will 
 follow later in this document. The method used to customize local menus 
 will be discussed.

<p>
 Each menu system has one alias file. This file is used to find an 
 item's location if the user enters an alias.

<p>
Also, the menu system may have one local security file. This file is 
optional and created by the OSA utility. See the OECN Software Security 
for VAX/VMS System Manager manual for more information about security 
and the OSA utility.

<a name="menu_specs_head"><h1>Menu Specifications</h1></a>

<p>
 Throughout this document there are references to <strong>menu 
 specifications</strong>. Wherever a menu specification is required the 
 following syntax is allowed:
<table border=0>
  <tr>
    <td>
      <br>
<pre>
@menu_file\menu_name 
</pre>
    </td>
  </tr>
</table>
<p>

<table border=3>
  <tr>
    <th align=center>Parameter </th>
    <th align=center>Meaning </th>
  </tr>
  <tr>
    <td>
      @menu_file
    </td>
    <td>
      Name of a menu file that contains menu_name. If not specified then 
      menu_name is assumed to exist in the current menu file.
    </td>
  </tr>
  <tr>
    <td>
      menu_name
    </td>
    <td>
      A menu within either the specified menu file or the current menu file.
    </td>
  </tr>
</table>

<p>
 A valid menu specification contains one or both of these components.

<p>
 If a menu name is specified without a menu file then the menu is 
 assumed to exist in the current menu file. If there is no current menu 
 file then OECN$MENU is used.

<p>
 If a menu file is specified without a menu name then the default menu 
 of the menu file's header record is used.

<p>
 If both the menu file and menu name are specified they must be 
 separated by a backslash (\).

<p>
Examples:

<table border=3>
  <tr>
    <th align=center>Specification </th>
    <th align=center>Result </th>
  </tr>
  <tr>
    <td>
      @BUD_MENU\USAS_PRC
    </td>
    <td>
      Goes to the USAS_PRC menu of the BUD_MENU file.
    </td>
  </tr>
  <tr>
    <td>
      @MAIN_MENU
    </td>
    <td>
      Goes to the default menu of the MAIN_MENU file.
    </td>
  </tr>
  <tr>
    <td>
      LOCAL
    </td>
    <td>
      Goes to the LOCAL menu of the current file.
    </td>
  </tr>
</table>

<a name="alias_file_head"><h1>The Alias File</h1></a>

<p>
 Each menu system may have exactly one <strong>alias file</strong>. An 
 alias file contains a record for each menu item in the menu system. 
 This alias record contains a pointer to the proper menu file that 
 contains the item.

<p>
 When the user enters a label name that is not on the current menu, the 
 alias file is checked for the label. If found then the item is located 
 in the appropriate menu file, and, assuming the user has access to the 
 item, it is executed. This allows the user to get to any item or menu 
 in the menu system without navigating through the intervening menus.

<p>
The alias file is built automatically by the MENUUTL program. See 
<a href="oecn10_sysman_handbook_full.html#build_alias_head">Section 5.2.1, Building the Alias File</a> for more information about creating the alias file.

<a name="option_exec_sect"><h1>Option execution</h1></a>

<p>
By default, the menu processor does <em>not</em> spawn subprocesses to 
execute user options. All commands are executed in the user's current 
process. This implies that menu processor image must exit and restart 
(activate) after each option has completed. This is called 
<strong>"terminate and execute"</strong> mode. This mode may provided 
optimal response time for smaller VAX processors, particularly machines 
with small memory configurations.

<a name="heading_2.5.1"><h2>Spawning Options</h2></a>

<p>
Another mode that may be chosen by the system manager is "spawn and 
execute". In this mode, <em>most</em> commands are executed in a 
subprocess. The menu processor remains running in the main process and 
does not terminate. Spawning options may reduce response time for 
larger VAX machines with excess physical memory.

<p>
No firm guidelines can be provided to suggest which mode will provide 
optimal response time and resource utilization for a given system. 
Response time in both modes is determined by machine size, available 
memory, tuning, typical load on the system, etc. Trial and error under 
a typical work load is the only way to determine the best mode. If the 
time required to spawn a process is less than the time required to 
activate the menu image, then spawning is preferable.

<p>
To implement menu option spawning the system manager must be aware of 
the following:

<ol start=1 >
  <li>Users must have a PRCLM Authorize quota of at least 1. If the user 
  executes programs that also spawn processes (e.g., TPU/EVE, WPS) they 
  may need a higher PRCLM quota.
  <li>Other user quotas also may need to be increased in order for the 
  main and subprocess to have access to sufficient resources.
  <li>BALCSETCNT (balance set count) in SYSGEN must be large enough to 
  handle the addition processes.
  <li>Some types of options must be executed in the main process (see 
  below).
</ol>

<p>
Prior to implementing spawning you must carefully consider whether any 
custom menu files contain any options that fall under #4 above. The 
subprocess that is created by the menu processor is temporary (i.e., 
the subprocess logs out as soon as the option has completed). This 
means that any commands performed in the subprocess will not be 
permanent. If you have options that change user logicals, create 
processes, etc. or anything that must affect both the main process and 
the subprocess, you must modify your custom menu files.

<p>
The MENUEDT program will allow you to define an item type "DP" (DCL 
command in Parent). These types of items will always be executed in the 
main process using "terminate and execute". These means that any 
commands executed in this way will affect both the main process and 
subprocess. These types of items should be used sparingly and will 
seldom be necessary. The only item in the menu files distributed by 
SSDT that need the "DP" item type was the DETPRT option of the LOCAL 
menu. All other SSDT menu items may be executed in a subprocess.

<a name="heading_2.5.2"><h2>Selecting Execution Mode</h2></a>

<p>
To select either "terminate and execute" or "spawn and execute" mode, 
the system manager needs only define a single logical. The logical name 
is OECN$MENU_BEHAVIOR and may be defined in the SYSTARTUP procedure. 
The valid values are: TERMINATE or SPAWN. For example, if you want to 
use "spawn and execute", add the following line the SYSTARTUP procedure:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ DEFINE/SYSTEM OECN$MENU_BEHAVIOR "SPAWN" 
</pre>
</table>

<p>
This logical also can be defined at the group or process level. If the 
logical is not defined, the default is "TERMINATE".

<a name="timeout_head"><h1>Inactivity Timeout</h1></a>

<p>
The menu processor has an optional feature that will cause it to 
automatically exit if the user does not enter a command after a 
specified period of time. This might be a useful security feature for 
user users who remain idle in the menu for long periods of time or 
forget to logout.

<p>
The system manager may add a command to the OECN$MENU_BEHAVIOR logical 
that will enable the timeout feature. The following syntax may be used:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ DEFINE/SYSTEM OECN$MENU_BEHAVIOR "TIMEOUT=n" 
</pre>
</table>

<p>
 Where <em>n</em> is the number minutes to wait with no activity. After 
 the timeout period expires without any options being entered, the menu 
 processor will exit automatically.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
The menu processor simply exits the menu and returns to DCL it does not 
log the user off the system. It is up to the local captive login 
procedure or other mechanism to log the user off. </td>
  </tr>
</table>
</center>

<p>
<hr size=5>
<a name="menu_implentation_chap"><h1>Implementation</h1></a>

<p>
 Several steps are required in order to implement the Menu Processor on 
 your system. The steps are briefly outlined below, detailed 
 explanations follow:

<ol start=1 >
  <li> Install the OECN, MENU and HELP distribution packages with 
  OECN_INSTALL.
  <li> Establish the necessary OECN logicals.
  <li> Move the menu files and VMS Help libraries from the distribution 
  directories to the appropriate directories on your system.
  <li> Create the OECN_MENU symbol.
  <li> Use the VMS Install utility to make the Menu Processor a known, 
  shared image.
</ol>

<a name="installation_head"><h1>Installation</h1></a>

<p>
 The Menu Processor uses files from the OECN, MENU and HELP packages. 
 Install these packages as usual using OECN_INSTALL. For further 
 information about OECN_INSTALL see OECN_INSTALL.DOC in the VAX manager 
 documentation directory.

<a name="logicals_head"><h1>Establish OECN Logicals</h1></a>

<p>
 Several logicals are used by the Menu Processor to locate the menu 
 files and VMS Help libraries. <p>

<table border=3>
  <caption><a name="logicals_tab"><strong> Menu Logicals</strong></a></caption>
  <tr>
    <th align=center>Logical </th>
    <th align=center>Purpose </th>
  </tr>
  <tr>
    <td>
      OECN$MENU$FILES
      <sup>1</sup>
    </td>
    <td>
      Device and directory where the menu files are located.
    </td>
  </tr>
  <tr>
    <td>
      OECN$MENU
      <sup>2</sup>
    </td>
    <td>
      Default menu file if none is specified by the user when the Menu 
      Processor is invoked.
    </td>
  </tr>
  <tr>
    <td>
      OECN$ALIAS
      <sup>2</sup>
    </td>
    <td>
      Default alias file that is used if none is specified when the Menu 
      Processor is invoked.
    </td>
  </tr>
  <tr>
    <td>
      OECN$SECUR
    </td>
    <td>
      Local security file. Optional. Created by OSA utility to define local 
      security.
    </td>
  </tr>
  <tr>
    <td>
      OECN$HELP
      <sup>1</sup>
    </td>
    <td>
      Device and directory where the VMS Help libraries are located.
    </td>
  </tr>
  <tr>
    <td>
      OECN$MENU_HELP
      <sup>2</sup>
    </td>
    <td>
      Default menu help library. Used when the user presses
      <kbd>[PF2]</kbd> or ?.
    </td>
  </tr>
  <tr>
    <td>
      OECN_MENU_PROMPT
    </td>
    <td>
      Default prompt to be used in the Menu Processor. Optional. May be 
      overridden by the user with a SET PROMPT command.
    </td>
  </tr>
  <tr>
    <td>
      OECN_MENU_MODE
    </td>
    <td>
      Default mode. Optional. May contain the "MENU" or "COMMAND". May be 
      overridden by the user with a SET MODE command.
    </td>
  </tr>
  <tr>
    <td>
      OECN$MENU_BEHAVIOR
    </td>
    <td>
      Optional logical that may contain commands to control how the menu 
      processor behaves at run-time. This logical is defined by the system 
      manager. See <a href="oecn10_sysman_handbook_full.html#behavior_logical">3.2.1</a>.
    </td>
  </tr>
</table>
<hr>
<sup>2</sup> Defined by the OECN_STARTUP procedure.
<br>
<sup>1</sup>May be defined as a search list.
<br>
<hr>

<p>
 OECN$MENU$FILES and OECN$HELP must be defined in either the SYSTARTUP 
 or individual LOGIN.COM files. These logicals may be defined at the 
 system, group or process level. For example, the OECN$MENU logical may 
 be defined for each user to provide a different default menu.

<a name="behavior_logical"><h2>Specifying options with OECN$MENU_BEHAVIOR logical</h2></a>

<p>
 This section describes the commands that may be placed in the 
 OECN$BEHAVIOR logical. The syntax for the logical definition is:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ DEFINE/SYSTEM OECN$MENU_BEHAVIOR "command[,command]..." 
</pre>
</table>

<p>
 Where <em>[command]</em> is one of the commands in the following table. 
 The command(s) must be enclosed in quotes and be in uppercase. When 
 multiple commands are specified they must be separated by commas (,). 
 This logical can be defined at the system, group, job or process level. 
 <p>

<table border=3>
  <caption><a name="Table_3-2"><strong> Behavior Options</strong></a></caption>
  <tr>
    <th align=center>Command </th>
    <th align=center>Description </th>
  </tr>
  <tr>
    <td>
      TERMINATE
    </td>
    <td>
      Causes the processor to use the &quot; terminate and execute &quot; 
      method for executing options. This is the default behavior.
    </td>
  </tr>
  <tr>
    <td>
      SPAWN
    </td>
    <td>
      Causes the processor to spawn all DCL and Program type action items in 
      a subprocess.
    </td>
  </tr>
  <tr>
    <td>
      TIMEOUT=n
    </td>
    <td>
      Sets the inactivity timeout interval to n minutes.
    </td>
  </tr>
  <tr>
    <td>
      NOTIMEOUT
    </td>
    <td>
      Disables inactivity timeout. This is the default behavior.
    </td>
  </tr>
</table>

<p>
 For example, to specify the spawn option and a timeout of 30 minutes 
 use the following command:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ DEFINE/SYSTEM OECN$MENU_BEHAVIOR "SPAWN,TIMEOUT=30" 
</pre>
</table>

<a name="move_files_head"><h1>Move Files to Appropriate Directories</h1></a>

<p>
 Move the menu files (OECN$ROOT:[MENU.DIST]*.DAT) to the directory 
 referenced by OECN$MENU$FILES.

<p>
 Move the VMS Help libraries from the HELP package distribution 
 directory to the directory referenced by OECN$HELP.

<p>
 The users of the Menu Processor must have read access to the above 
 files.

<p>
 Also move the following files to the OECN$ directory:

<blockquote>
  OECN$ROOT:[OECN.V1P0.DIST]MENU.EXE
  <br>OECN$ROOT:[OECN.V1P0.DIST]OECN_MENU.COM
</blockquote>

<p>
 The users must have execute access to these files.

<a name="add_symbol_head"><h1>Add Global Symbol</h1></a>

<p>
 Add the following symbol to either your SYLOGIN.COM or each user's 
 LOGIN.COM who will be using the system:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ OECN_MENU :== $OECN$:MENU 
</pre>
</table>

<p>
 This creates a foreign command that the OECN_MENU.COM procedure uses to 
 invoke the Menu Processor. Other symbols may be necessary to make it 
 easier for your users to invoke a menu. These symbols will be discussed 
 in the <a href="oecn10_sysman_handbook_full.html#invoking_chap">Chapter 4, Invoking the Menu Processor</a>. The OECN_MENU symbol is the only required symbol.

<a name="install_head"><h1>Install the Menu Processor</h1></a>

<p>
 Although it is not necessary for proper execution of the Menu 
 Processor, it is <strong>strongly</strong> recommended that you install 
 the Menu Processor as a known image.

<p>
 Because the Menu Processor does not spawn a subprocess it must be 
 reactivated after each time the user selects a menu item. If the image 
 is not installed, image activation will cause a noticeable delay in the 
 Menu Processor.

<p>
 The recommended method of installing the image is to add the following 
 commands to your SYSTARTUP.COM:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ INSTALL :== $INSTALL/COMMAND_MODE 
$ INSTALL ADD OECN$:MENU.EXE/OPEN/SHARED/HEADER 
</pre>
</table>

<p>
<hr size=5>
<a name="invoking_chap"><h1>Invoking the Menu Processor</h1></a>

<p>
 The Menu Processor must be invoked via a command procedure that is 
 provided as part of the OECN package. The Menu Processor depends on 
 this command procedure to perform several vital functions and to 
 actually execute any items selected by the user. Absolutely nothing 
 useful will happen if the Menu Processor is invoked directly.

<p>
 Additionally, the Menu Processor is invoked by the command procedure 
 with a foreign command. Therefore the following symbol definition is 
 required. See <a href="oecn10_sysman_handbook_full.html#add_symbol_head">Section 3.4, Add Global Symbol</a>.

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ OECN_MENU == "$OECN:MENU" 
</pre>
</table>

<p>
 To invoke the menu processor the following command must be used:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ @OECN$:OECN_MENU [menu spec] [alias file] [menu_option] 
</pre>
</table>

<p>
 The OECN_MENU.COM command procedure is provided with the distribution 
 and must be used to invoke the menu processor.

<p>
 The first parameter is an optional menu specification that specifies 
 the default menu file and menu to be used. If the menu specification is 
 not supplied then OECN$MENU is used by default. See <a href="oecn10_sysman_handbook_full.html#menu_specs_head">Section 2.3, Menu Specifications</a> for 
 more information about menu specifications.

<p>
 The second optional parameter is the alias file for the menu system 
 being invoked. If not specified then OECN$ALIAS is used by default.

<p>
The third optional parameter is a menu command, option or alias to be 
executed. If this parameter is specified then the menu processor will 
execute the option and return to DCL, the user will 
<strong>not</strong> be left in the menus after the option has finished 
executing. This could be used as a replacement for the DCL RUN command, 
particularly for batch procedures. This would insure that batch 
procedures do the same security checking as interactive processes.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
The menu processor will operate properly in batch only if the third 
parameter is supplied. If the parameter is not specified the menu 
processor will not function in batch. </td>
  </tr>
</table>
</center>

<p>
 This command may be defined in a global symbol, invoked from a captive 
 login procedure or from inside another procedure. No restrictions are 
 placed on the method of invoking the Menu Processor.

<a name="invoke_example_head"><h1>Examples</h1></a>

<p>
 For most users the following symbol definition is sufficient:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ MENU == "@OECN$:OECN_MENU" 
</pre>
</table>

<p>
 This will invoke the Menu Processor with the default menu and alias 
 file. This will normally, unless changed by you, be the MAIN_MENU file, 
 which contains menu items for all state software packages.

<p>
If users will be using the third parameter (or it will be used from 
batch) then the following symbol might be used:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ MENU == "OECN$:OECN_MENU """" """" " 
</pre>
</table>

<p>
This will leave the first two parameters as null (accepting the default 
menu and alias files) and allow the third parameter to be specified 
after the MENU symbol.

<p>
 As another possibility, suppose that you have a payroll user that would 
 rather be started out in the USPS menu. In this case put this symbol in 
 that user's LOGIN procedure:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ MENU == "@OECN$:OECN_MENU @PAY_MENU" 
</pre>
</table>

<p>
 This will put the user in the PAY_MENU directly. Note that this does 
 not restrict the user to the PAY_MENU, it just starts them out in that 
 menu.

<p>
<hr size=5>
<a name="modifying_menus_chap"><h1>Modifying and Creating Menu Systems</h1></a>

<p>
 The MENUEDT program is a fully functional maintenance program for 
 modifying and creating menu files. Another program, MENUUTL, provides 
 several necessary and useful utilities when manipulating the files, 
 such as building the alias file and reporting functions. <p>

<table border=3>
  <caption><a name="menu_type_tab"><strong> Menu Record Types</strong></a></caption>
  <tr>
    <th align=center>Record Type </th>
    <th align=center>Function </th>
  </tr>
  <tr>
    <td>
      File Header Record
    </td>
    <td>
      Contains information about the entire menu file. There is only one file 
      header record per file.
    </td>
  </tr>
  <tr>
    <td>
      Menu Header Record
    </td>
    <td>
      Contains information specific to one menu. There is no structural or 
      logical limit to the number of menus that may exist in a menu file.
    </td>
  </tr>
  <tr>
    <td>
      Item Record
    </td>
    <td>
      Contains the actual item that appears on a menu. Each item record 
      belongs to one and only one menu. The number of items is limited by the 
      Menu Processor to 50 items (about 4 screens).
    </td>
  </tr>
</table>

<p>
 The menu files and records form a <em>loose</em> hierarchy. That is, 
 the hierarchy is created by the person developing the menu system. The 
 hierarchy is not enforced by the MENUEDT program or even the Menu 
 Processor. The menus can be connected in an almost limitless number of 
 combinations. It is impossible for the MENUEDT program to know exactly 
 what the runtime environment will be for the menu file. Thus, very 
 little error checking is performed or even attempted. This means that 
 menus that you modify or create should be tested thoroughly before 
 being made available to your users.

<a name="using_edt_head"><h1>Using MENUEDT</h1></a>

<p>
 When you first run the MENUEDT program it will prompt you for the name 
 of the menu file to modify. If the file does not exist it will be 
 created. <p>

<table border=3>
  <caption><a name="edt_options_tab"><strong> MENUEDT Main Menu Options</strong></a></caption>
  <tr>
    <th align=center>Option </th>
    <th align=center>Function </th>
  </tr>
  <tr>
    <td>
      Add
    </td>
    <td>
      Adds new records of any type.
    </td>
  </tr>
  <tr>
    <td>
      Change
    </td>
    <td>
      Enters change mode for the current record.
    </td>
  </tr>
  <tr>
    <td>
      Delete
    </td>
    <td>
      Deletes the current record.
    </td>
  </tr>
  <tr>
    <td>
      Top
    </td>
    <td>
      Goes to top of file (File header record).
    </td>
  </tr>
  <tr>
    <td>
      Find
    </td>
    <td>
      Finds a record by menu or item name.
    </td>
  </tr>
  <tr>
    <td>
      Next
    </td>
    <td>
      Goes to the next record.
    </td>
  </tr>
  <tr>
    <td>
      Simulate
    </td>
    <td>
      Simulates how the menu will look to the user. The simulation is 
      approximate since the MENUEDT upper window is smaller than in the Menu 
      Processor.
    </td>
  </tr>
  <tr>
    <td>
      Open
    </td>
    <td>
      Closes the current menu file and prompts for a new menu file to open.
    </td>
  </tr>
  <tr>
    <td>
      Exit
    </td>
    <td>
      Exits MENUEDT.
    </td>
  </tr>
</table>

<a name="menu_type_head"><h2>Menu File Record Types</h2></a>

<p>
 This section and the following sections show sample screens that are 
 used by MENUEDT to modify the various record types. After each screen 
 is a detailed explanation of each field and its purpose.

<a name="file_header_head"><h2>File Header Record</h2></a>

<p>
 The first record in each menu file must be a File Header record and 
 each file must contain exactly one Header record.

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
              Menu File Header Record:   
                                                               
               1. Desc:  
               2. Default menu:  
               3. Modify default security identifiers                  
                                                               
</pre>
</table>

<p>

<table border=3>
  <caption><a name="file_header_fld_tab"><strong> File Header Record Fields</strong></a></caption>
  <tr>
    <th align=center>Field </th>
    <th align=center>Description </th>
  </tr>
  <tr>
    <td>
      Desc
    </td>
    <td>
      This description is used in the heading for all menus in this file.
    </td>
  </tr>
  <tr>
    <td>
      Default Menu
    </td>
    <td>
      Is the default menu for this file if the user does not specify a menu 
      when the file is invoked. This menu will normally be the top-level menu 
      for this file.
    </td>
  </tr>
  <tr>
    <td>
      Modify default security identifiers
    </td>
    <td>
       Enters the
      <em>Security Id Maintenance</em> screen to allow default security 
      identifiers to be placed on the menu file. See <a href="oecn10_sysman_handbook_full.html#secur_id_screen_head">Section 5.1.5</a> for more 
      information about security identifiers.
    </td>
  </tr>
</table>

<a name="menu_header_head"><h2>Menu Header Record</h2></a>

<p>
 The Menu Header record contains information about each menu in the 
 file. There must be exactly one Header record for each menu contained 
 in the file.

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
               Menu header record:                             
                                                               
                1. Menu Name   :  
                2. Description :  
                3. Heading Type:  
                4. Help file   :                               
                5. Help topic  :                               
                6. Parent Menu :                               
                7. Modify Security Identifiers                 
    
</pre>
</table>

<p>

<table border=3>
  <caption><a name="menu_header_fld_tab"><strong> Menu Header Fields</strong></a></caption>
  <tr>
    <th align=center>field </th>
    <th align=center>Description </th>
  </tr>
  <tr>
    <td>
      Menu Name
    </td>
    <td>
      Name of the menu. This is the name that will be displayed in the menu 
      heading.
    </td>
  </tr>
  <tr>
    <td>
      Description
    </td>
    <td>
      This description is used in the heading for this menu.
    </td>
  </tr>
  <tr>
    <td>
      Heading Type
    </td>
    <td>
      Indicates what type of menu heading to use for this menu.
      <table border=3> 
        <tr>
          <td>
            A
          </td>
          <td>
            Heading contains both the file description and the menu description.
          </td>
        </tr>
        <tr>
          <td>
            B
          </td>
          <td>
            Heading contains only the menu heading description.
          </td>
        </tr>
      </table> 
    </td>
  </tr>
  <tr>
    <td>
      Help File
    </td>
    <td>
       The VMS Help file that will be used if the user enters HELP at this 
       menu.
    </td>
  </tr>
  <tr>
    <td>
      Help topic
    </td>
    <td>
      The initial topic string used when the user enters HELP.
    </td>
  </tr>
  <tr>
    <td>
      Parent Menu
    </td>
    <td>
      Must contain the parent menu specification for this menu. This is the 
      menu that the user will return to when they enter /EXIT or ^. If this 
      field is blank then the menu is assumed to be the top level menu of the 
      menu system.
    </td>
  </tr>
  <tr>
    <td>
      Modify security identifiers
    </td>
    <td>
       Enters the
      <em>Security Id Maintenance</em> screen to allow security identifiers 
      to be placed on the menu. See <a href="oecn10_sysman_handbook_full.html#secur_id_screen_head">Section 5.1.5</a> more information about 
      security identifiers.
    </td>
  </tr>
</table>

<a name="menu_item_head"><h2>Menu Item Record</h2></a>

<p>
 One menu item record must be specified for each desired item on a menu. 
 A menu can contain a maximum of 50 item records. If there are less than 
 8 items then the menu will be double spaced, otherwise the menu will be 
 single spaced. If there are more items than will fit on one screen then 
 the menu will be divided into multiple screens.

<p>
 An item may be of one of four types, the value and meaning of the 
 Action field is determined by the Item Type field. The four possible 
 types and the meaning of the Action field are defined in <a href="oecn10_sysman_handbook_full.html#item_types_tab">Table 5-5</a>. 
 <p>

<table border=3>
  <caption><a name="item_types_tab"><strong> Menu Item Types</strong></a></caption>
  <tr>
    <th align=center>Item Type </th>
    <th align=center>Interpretation of Action Field </th>
  </tr>
  <tr>
    <td>
      D
    </td>
    <td>
      DCL command to execute
    </td>
  </tr>
  <tr>
    <td>
      DP
    </td>
    <td>
      DCL command to execute in Parent process
    </td>
  </tr>
  <tr>
    <td>
      P
    </td>
    <td>
      Program filespec to execute
    </td>
  </tr>
  <tr>
    <td>
      M
    </td>
    <td>
      Menu specification
    </td>
  </tr>
  <tr>
    <td>
      T
    </td>
    <td>
      Ignored
    </td>
  </tr>
</table>

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
      Menu Item record: 
                       
         1. Menu Name: 
         2. Label    : 
         3. Desc     : 
         4. Item Type: 
         5. Action   : 
                             
         6. Item order#: 
         7. Modify Security Identifiers 
 
</pre>
</table>

<p>

<table border=3>
  <caption><a name="menu_item_tab"><strong> Menu Item Fields</strong></a></caption>
  <tr>
    <th align=center>Field </th>
    <th align=center>Description </th>
  </tr>
  <tr>
    <td>
      Menu Name
      <sup>1</sup>
    </td>
    <td>
      Name of the menu that this item belongs to.
    </td>
  </tr>
  <tr>
    <td>
      Label
      <sup>1</sup>
    </td>
    <td>
      Label of this item that the user will use to reference this item.
    </td>
  </tr>
  <tr>
    <td>
      Desc
    </td>
    <td>
      Description displayed for this item.
    </td>
  </tr>
  <tr>
    <td>
      Item Type
    </td>
    <td>
      Indicates what type of item this is:
      <table border=3> 
        <tr>
          <td>
            D
          </td>
          <td>
            DCL command
          </td>
        </tr>
        <tr>
          <td>
            DP
          </td>
          <td>
            DCL in Parent process
          </td>
        </tr>
        <tr>
          <td>
            P
          </td>
          <td>
            Program to be executed
          </td>
        </tr>
        <tr>
          <td>
            M
          </td>
          <td>
            Menu item
          </td>
        </tr>
        <tr>
          <td>
            T
          </td>
          <td>
            Text Item
          </td>
        </tr>
      </table> 
    </td>
  </tr>
  <tr>
    <td>
      Action
    </td>
    <td>
      Contains the action to be performed when this item is selected. See 
      <a href="oecn10_sysman_handbook_full.html#action_values_head">Section 5.1.4.1</a> for more information.
    </td>
  </tr>
  <tr>
    <td>
      Item order #
    </td>
    <td>
      This field is used to order the items on the menu. By default the items 
      are in alphabetical order by Item Label. If you want to change the 
      order of the items then you may put a number in the Item Order# field. 
      This number does not affect the number that the user will use to invoke 
      the item, it only affects the physical order of the items on the menu.
    </td>
  </tr>
  <tr>
    <td>
      Modify security identifiers
    </td>
    <td>
       Enters the
      <em>Security Id Maintenance</em> screen to allow security identifiers 
      to be placed on the item. See section <a href="oecn10_sysman_handbook_full.html#secur_id_screen_head">Section 5.1.5</a> for more information 
      about security identifiers.
    </td>
  </tr>
</table>
<hr>
<sup>1</sup>Key fields of the menu file. However the MENUEDT program 
allows these fields to be changed.
<br>
<hr>

<a name="action_values_head"><h3>Values for Action Field</h3></a>

<p>
 Much of the Menu Processor's flexibility is provided by the values that 
 may be placed in the Action field. The Action field and the Item Type 
 field together determine what will happen when the user chooses an item 
 from a menu.
<p>
<strong>Item Type D (DCL)</strong>
<br>

<p>
 If Type = "D" then Action must contain a valid DCL command. Any DCL 
 command may be specified, including command procedures. These commands 
 may be executed in subprocess depending on the setting of 
 OECN$MENU_BEHAVIOR (See <a href="oecn10_sysman_handbook_full.html#option_exec_sect">Section 2.5</a>). For example, the following are 
 valid for Action:

<blockquote>
  MAIL
  <br>@PURGE_TEXT_FILES
  <br>Write sys$output "Hello there."
</blockquote>

<p>
 If the DCL command requires or allows parameters to be specified you 
 may place a tilde (~) at the location where the parameters should be 
 placed.

<p>
 As a simple example, assume that you have a print procedure that allows 
 the filename and the number of copies as parameters. Item Label is 
 PRINT and the name of the command procedure is OECN$UTL:PRINT.COM. On 
 the PRINT item record you would put the following in the Action field:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
@OECN$UTL:PRINT ~ ~ 
</pre>
</table>

<p>
 When the user enters the PRINT item from the Menu Processor they may 
 specify the parameters on one line. For example, the user could enter:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
Menu&gt; PRINT MYFILE.TXT 10
</pre>
</table>

<p>
 The DCL command that would be executed by the Menu Processor would be:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ @OECN$UTL:PRINT MYFILE.TXT 10
</pre>
</table>

<p>
 Up to 8 parameters may be specified. Parameters containing spaces must 
 be enclosed in quotes. (Parameters may not contain quotes.) Lowercase 
 characters are preserved inside of quotes. Parameters are replaced from 
 left to right. No other parsing of the parameters is done. Parameters 
 are always considered to be optional, if the user does not specify a 
 parameter then the tilde (~) will be replaced by a space.
<p>
<strong>Item Type DP (DCL in Parent)</strong>
<br>

<p>
 Type "DP" is identical to type "D" except that the Action line is 
 always executed in the parent process. This only has an effect if the 
 menu processor is in "spawn and execute" mode (See <a href="oecn10_sysman_handbook_full.html#option_exec_sect">Section 2.5</a>).

<p>
This item type should be used sparingly and only when the command 
<em>must</em> be executed in the parent process. This is only necessary 
when the commands being executed must affect both the parent and 
subprocess. Examples of such commands are:

<ul>
  <li>Commands that change security identifiers
  <li>Commands that modify menu logicals or modes
  <li>Commands that spawn subprocesses with the /NOWAIT qualifier
</ul>

<p>
<strong>Item Type P (Program)</strong>
<br>

<p>
 If Type = "P" then the Action field contains the full VMS file 
 specification for an executable image to be executed by the DCL RUN 
 command. The distinction between programs and DCL commands is made 
 primarily for compatibility with the HP version of the Menu Processor. 
 However, future VAX releases may take advantage of this distinction.
<p>
<strong>Item Type M (Menu)</strong>
<br>

<p>
 If Type = "M" then the Action field must contain a valid menu 
 specification. This type of item allows the user to move from one menu 
 to another at a lower level. The menu specified may be in the current 
 menu file or may specify a completely different menu file. See 
 <a href="oecn10_sysman_handbook_full.html#menu_specs_head">Section 2.3</a> for more information about menu specifications.
<p>
<strong>Item Type T (Text)</strong>
<br>

<p>
 If Type = "T" then the action line is ignored. Text items are used to 
 put information or subheadings on a menu. For text items, the 
 Description field is simply displayed on the menu without a label or an 
 option number.

<a name="secur_id_screen_head"><h2>Menu Security Screen</h2></a>

<p>
 The <strong>Modify Security Identifier</strong> screen allows you to 
 require that the user has specific VMS identifiers before they are 
 allowed access to certain menu elements.

<p>
 Security may be placed on any level: File, Menu or Item. If the user 
 does not have access to a menu item, it will not appear on the menu.

<p>
Three levels of access can be specified for each identifier that 
appears on the Security Identifier screen: Read-only, Standard or Group 
Manager. See <a href="oecn10_sysman_handbook_full.html#security_ids">Section 5.1.5.1</a> for more information about how these 
identifiers are derived.

<p>
 The following screen shows an example of a menu element that requires 
 the user to have read-only access to the OECN_PPS identifier or 
 standard access to the OECN_SALSIM identifier. Note that the user must 
 only have one of the selected identifiers. Of course, users with 
 OECN_SYSMAN access have access to all menu elements regardless of these 
 identifiers.

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
    1) OECN_EDCIMS                9) OECN_SYSMAN 
    2) OECN_EIS                   10) OECN_USAS  
    3) OECN_OECN                  11) OECN_USPS  
  R 4) OECN_PPS                   12) OECN_VIS   
    5) OECN_PVS                   13) OECN_USER1 
  S 6) OECN_SALSIM                14) OECN_USER2 
    7) OECN_SECIMS                15) OECN_USER3 
    8) OECN_SECIMS_GRPMAN         16) OECN_USER4 
                                                        
(R = Read-Only,  S = Standard, G = Group Manager)       
 
</pre>
</table>

<p>
 Security will be propagated through the menu structure. If security is 
 not specified for a menu element, then security will be inherited from 
 the level above it. The following list details the rules that are used 
 to determine how security is inherited.

<ol start=1 >
  <li>If a menu item has no security specified for it, then security will 
  be inherited from the menu header record to which the item belongs.
  <li>If a menu header has no security, then it will inherit its security 
  from its parent's menu header record. This occurs until a parent record 
  is found that contains security information, or the top-level menu is 
  found within the current menu file.
  <li>The top-level menu of each menu file, will inherit security from 
  the file header record.
  <li>If no security is specified, after rule #3 above, then there is no 
  security required to access the menu element.
</ol>

<p>
 The identifiers OECN_USER1 through OECN_USER4 are for use locally at 
 the A-sites. You may assign these identifiers in any manner you wish. 
 For example, you may want to allow specific users to access VMS Mail. 
 You could use OECN_USER1 to restrict a MAIL menu item to those users. 
 These identifiers will not be used by SSDT in any State Software 
 programs.

<p>
 If four identifiers are not enough for your site, you may add new ones. 
 Up to 16 identifier positions have been reserved for use at the A-site 
 level. See OECN_IDS.LIB in OECN$LIB: for instructions.

<a name="security_ids"><h3>Security Identifiers</h3></a>

<p>
 The security identifiers that appear on the Security Identifier screen 
 are the &quot;standard&quot; identifiers. Three possible identifiers 
 exist for each standard identifier, which are used to specify three 
 levels of access. These alternate identifiers are derived by adding a 
 suffix to the standard identifier.

<p>
 The following table lists the three access levels, in order of lowest 
 level access to the highest. <p>

<table border=3>
  <caption><a name="security_level_tbl"><strong> Security Access Levels</strong></a></caption>
  <tr>
    <th align=center>Access Level </th>
    <th align=center>Suffix </th>
    <th align=center>Description </th>
  </tr>
  <tr>
    <td>
      Read-Only
    </td>
    <td>
      _RO
    </td>
    <td>
      If a user holds the identifier then read-only access is granted. This 
      user may execute read-only programs or have access to read-only 
      functions within programs.
    </td>
  </tr>
  <tr>
    <td>
      Standard
    </td>
    <td>
      none
    </td>
    <td>
      If a user holds this identifier then the user is granted 
      &quot;standard&quot; access to the identifier. This user is assumed to 
      be a standard read-write user of the corresponding package.
    </td>
  </tr>
  <tr>
    <td>
      Group Manager
    </td>
    <td>
      _GM
    </td>
    <td>
      Users that hold this identifier are granted access to &quot;group 
      manager&quot; functions. This user is assumed to hold special 
      privileges within the corresponding package.
    </td>
  </tr>
</table>

<p>
For example, for the OECN_USPS identifier there are really three 
identifiers that may be granted to a user. These identifiers are:

<blockquote>
  OECN_USPS_RO
  <br>OECN_USPS
  <br>OECN_USPS_GM
</blockquote>

<p>
All these access levels, and therefore all the identifiers, exist for 
all packages, even if the package itself does not implement the 
identifiers. In other words, the Menu Processor will test for all the 
identifiers, even if the individual package does not.

<p>
It also should be noted that the access levels will be applied to the 
A-site specific identifiers. That is, there will also be OECN_USER1_RO 
and OECN_USER1_GM identifiers available for use at the A-site level.

<a name="menuutl_head"><h1>Using MENUUTL</h1></a>

<p>
 The MENUUTL program provides some necessary functions for building, 
 maintaining and documenting a menu system. The options provided are:

<ol start=1 >
  <li>Build the Alias File
  <li>Simulated Menu Listing
  <li>Detailed Menu Report
  <li>Hierarchical Menu Listing
</ol>

<a name="build_alias_head"><h2>Building the Alias File</h2></a>

<p>
 The first and the most important option of MENUUTL is the alias file 
 build option. The alias file contains a pointer for each menu item in 
 the system. Therefore, whenever you add or remove menu items from a 
 menu file you must rebuild the alias file.

<p>
 MENUUTL makes this process rather simple. All you have to do is run 
 MENUUTL and choose option 1. MENUUTL will ask the following questions:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
Physical name of top level menu file:___________
</pre>
</table>

<p>
 Enter the physical filespec of the top-level menu file. This is the 
 current physical location of the top-level menu file.

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
Logical name of top level menu file:_____________
</pre>
</table>

<p>
 Enter the logical filespec of the top level menu file. This should be 
 the logical name of the file that will be used when the user accesses 
 the menu system.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
 The physical and logical name should normally be the same. </td>
  </tr>
</table>
</center>

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
Enter new alias filename: ___________________
</pre>
</table>

<p>
 Enter the name of the new alias file to be built. The alias file is 
 always rebuilt from scratch and a new version is created.

<p>
 After prompting for these values, MENUUTL will begin reading through 
 the specified menu file and add an alias for each item found. It will 
 also search for references to other menu files. If such references are 
 found, MENUUTL will search those files for menu items and add aliases 
 for each one.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Important</strong></font></center><hr 
  size=1 noshade>
 MENUUTL uses the OECN$MENU$FILES logical to search for the menu files 
 in the same manner as will be used by the Menu Processor. Therefore, 
 the runtime environment for MENUUTL must be the same as when the Menu 
 Processor will be invoked. </td>
  </tr>
</table>
</center>

<p>
 As stated earlier, all aliases must be unique across the entire menu 
 system. If MENUUTL finds a duplicate alias name, an error message will 
 displayed and the duplicate will not be added. Processing will continue 
 and the alias file will be usable, but the alias for the duplicate item 
 will not exist.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
    You may also use the OECN$:BUILD_ALIAS.COM command procedure to build 
    the alias file. This procedure will automatically build a new alias 
    file using the current values of OECN$MENU$FILES, OECN$MENU and 
    OECN$ALIAS. You can run this procedure after installing a new 
    distribution or customizing menu files. If you frequently modify menu 
    files, you could even run the procedure periodically in batch to ensure 
    that the alias file is always up-to-date. </td>
  </tr>
</table>
</center>

<a name="simulate_list_head"><h2>Simulated Menu Listing</h2></a>

<p>
 This option will read through the specified menu file and create a 
 simulated menu listing. The listing will display the menu in as close 
 an approximation as possible on a hardcopy printer. The option will 
 only report on one menu file at a time and will be sorted in 
 alphabetical order by menu name.

<a name="detailed_list_head"><h2>Detailed Menu Listing</h2></a>

<p>
 The detailed menu report lists all available information about the 
 specified menu file. This report is particularly useful for double 
 checking the action fields and security.

<a name="hier_list_head"><h2>Hierarchical Listing</h2></a>

<p>
 This report will display the structure of the menu system. The menus 
 are listed in the proper order as they appear on the menu. This option 
 will prompt for the top level menu file and menu where the listing is 
 to start. You need not necessarily start at the top of the entire menu 
 system.

<a name="osa_head"><h1>OSA</h1></a>

<p>
The OSA, OECN Security Authorization, Utility may be used in 
conjunction with the OECN Menu Processor to fine tune security access. 
OSA can be used to enable user's access to individual programs to be 
granted or denied. This <em>local security</em> is defined by each 
A-site and is maintained separately from the menu system included on 
the OECN distribution. (See also VMS Manager's Guide)

<p>
<hr size=5>
<a name="custom_chap"><h1>Customizing Menus from the Distribution</h1></a>

<p>
 This chapter describes the recommended procedure for customizing the 
 menu files from the distribution. Following this procedure will ensure 
 that you can install future releases with minimum effort and maintain a 
 consistent user interface across the state.

<p>
 Each major package has its own menu file. The file name for the primary 
 menu file ends with _MENU and has an extension of .DAT. For example, 
 the USAS menu file is named BUD_MENU.DAT. On the main menu of each 
 package there is an item that links to a <em>local</em> menu file. This 
 local menu file is an empty menu file that you may customize as you 
 wish. The local menu filenames end with _LCL. Therefore, the USAS local 
 menu is named: BUD_LCL.DAT.

<p>
 It is recommended that you only modify the *_LCL menu files. If you 
 modify the other primary menu files, you will not be able to install 
 updated menu files in the future without making all of your 
 modifications over again.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
Security for all menu items may be customized, even if they are part of 
the distribution, without modifying the menu files. This is 
accomplished by using the OECN Security Authorization (OSA) utility. 
See the <em>OECN Software Security for the VMS System Manager</em> 
manual for information about the OSA utility and local security. </td>
  </tr>
</table>
</center>

<a name="local_head"><h1>Modifying a Local Menu File</h1></a>

<p>
    Following is the recommend procedure for modifying one or more menu 
    files.

<ol start=1 >
  <li>Redefine the OECN$MENU$FILES to be a search list.
  <li>Modify the Menu Files
  <li>Build a New Alias File
  <li>Redefine OECN$MENU$FILES permanently
</ol>

<a name="redefine_logical_head"><h2>Redefine the OECN$MENU$FILES logical</h2></a>

<p>
 The first step is to redefine OECN$MENU$FILES as a search list. For 
 consistency with other customized files, it is recommended that you use 
 OECN$CUSTOM. However, you may use any directory that you wish. The rest 
 of this chapter assumes that you are placing the customized menu files 
 in OECN$CUSTOM. For example:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ DEFINE/SYSTEM OECN$MENU$FILES -
_$ OECN$CUSTOM,DUA0:[ODE.MENU.DIST]
</pre>
</table>

<p>
 This will cause the Menu Processor and MENUUTL to search first through 
 OECN$CUSTOM and then the distribution menu files.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
 You may want to make this logical assignment in your current process, 
 instead of at the SYSTEM level, while changing the menu files. This 
 will prevent any users from getting into a half completed menu. </td>
  </tr>
</table>
</center>

<a name="heading_6.1.2"><h2>Modify the Menu Files</h2></a>

<p>
 Copy the *_LCL.DAT menu files that you want to modify from the 
 distribution into OECN$CUSTOM. Then use MENUEDT to make the desired 
 modifications. By making all modifications in OECN$CUSTOM: will insure 
 that installing future releases will not overlay your customized local 
 menus.

<p>
 Use the Menu Processor and MENUUTL to test the new menus as needed. If 
 you're creating new menus, be sure that the users have read access to 
 the new files.

<a name="heading_6.1.3"><h2>Build a New Alias File</h2></a>

<p>
 After all desired changes have been made, use MENUUTL to rebuild the 
 alias file. You may put the alias file in OECN$CUSTOM or simply replace 
 the current alias file in OECN$ALIAS. If you change the location of the 
 alias file be sure to redefine the OECN$ALIAS logical.

<p>
 You may build the alias file manually by running MENUUTL, or you may 
 use the BUILD_ALIAS.COM procedure in the OECN$ directory.

<a name="heading_6.1.4"><h2>Redefine OECN$MENU$FILES Permanently</h2></a>

<p>
 If you have not already done so, define the logical OECN$MENU$FILES to 
 be a search list as above at the SYSTEM level.

<p>
 At this point your users should have access to the customized menus.

<a name="heading_6.2"><h1>After a Distribution</h1></a>

<p>
 If you modify the local menu files in this way, your changes will not 
 be affected by any future releases. Changes made by SSDT will 
 automatically be installed when you copy the distribution menu files to 
 the OECN$MENU$FILES directory.

<p>
However, you will have to rebuild the alias file after installing each 
distribution. After a package has been installed and the menu files 
moved to thier proper location, you must rebuild the alias file.

<p>
 You may build the alias file manually by running MENUUTL, or you may 
 use the BUILD_ALIAS.COM procedure in the OECN$ directory. The 
 BUILD_ALIAS.COM procedure will automatically build a new alias file 
 using the files in OECN$MENU$FILES. You can run the procedure 
 interactvely by typing:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
    $ @OECN$:BUILD_ALIAS 
</pre>
</table>

<p>
Or you can submit it for batch processing using DCL SUBMIT. By default, 
BUILD_ALIAS will rebuild the default menu system based on the current 
values of OECN$MENU$FILES, OECN$MENU and OECN$ALIAS logicals. If you 
have other menu systems on your system, you can pass parameters to 
BUILD_ALIAS to indicate the location and names of the menu and alias 
files. See the comments in BUILD_ALIAS.COM for more information about 
using this procedure.

<a name="intercept_head"><h1>Intercepting Menu Actions</h1></a>

<p>
 Sometimes it is desirable, or necessary, to redefine the action 
 associated with a menu item. For instance, you may want to force 
 certain actions prior to running a particular program or force certain 
 options to run in batch.

<p>
 This may be done by intercepting the action line of specific options 
 <em>without</em> modifying the menu files supplied by SSDT. You must 
 write a DCL command procedure that will replace the action line you are 
 going to intercept. Then assign a special logical to point to this 
 command procedure.

<p>
 The logical must be defined as follows:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ DEFINE/SYSTEM OECN$MENU_ACTION_label filespec 
</pre>
</table>

<p>
 Where <em>label</em> is the menu option label that you want to 
 intercept and <em>filespec</em> is the full filespec of the DCL command 
 procedure. The logical may be defined at the system, group or process 
 level, so you may intercept the action line for different classes of 
 users.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
    If the logical is defined system-wide it will affect all menu systems 
    that you have active on your system. If you have multiple menu systems 
    that contain the same label then they will all be affected. If this is 
    not what you want you may need to define this logical at the group or 
    process level. </td>
  </tr>
</table>
</center>

<p>
 After this logical is defined the command procedure will be executed 
 <em>instead of</em> the action line defined by the menu file.

<p>
 The following parameters will be passed to the command procedure :

<table border=3>
  <tr>
    <td>
      P1
    </td>
    <td>
      Menu label name that invoked the procedure
    </td>
  </tr>
  <tr>
    <td>
      P2
    </td>
    <td>
      Original action line defined by the menu file
    </td>
  </tr>
  <tr>
    <td>
      P3-P8
    </td>
    <td>
      Other parameters entered by the user
    </td>
  </tr>
</table>

<p>
 The procedure may use these parameters as it wishes or ignore them.

<p>
 For example, suppose that you want to automatically execute a backup of 
 the USPS files prior to the user running BUDDIS. The following 
 procedure, called PAY:BUDDIS_ACTION, might be used:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$! 
$! PAY:BUDDIS_ACTION.COM -- Procedure used by the BUDDIS menu option 
$! 
$ on error then exit 
$ 
$ @PAY:SAVEPAY    ! A-site procedure to perform disk backup set of 
$                 ! USPS files. 
$ 
$ DEFINE/USER SYS$INPUT SYS$COMMAND 
$ RUN OECN$PAY:BUDDIS 
$ 
$ EXIT 
</pre>
</table>

<p>
 The following logical definition would be made to intercept the BUDDIS 
 action for all users:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ DEFINE/SYSTEM OECN$MENU_ACTION_BUDDIS PAY:BUDDIS_ACTION 
</pre>
</table>

<p>
<hr size=5>
<a name="batch_mail_chap"><h1>Batch Mail Message System Manager  Guide</h1></a>

<a name="heading_7.1"><h1>Overview</h1></a>

<p>
The command procedure BATCH_MAIL_MESSAGE.COM can be used to send a VMS 
mail message via a batch job. This is useful for messages with large 
audiences where the user does not wish to tie up their terminal for an 
extended period of time.

<a name="heading_7.2"><h1>Sending a Mail Message via Batch</h1></a>

<p>
To use the command procedure for generic mail messages:

<p>
Create the desired mail message using a text file.

<p>
Submit the procedure as follows supplying the necessary parameter 
values:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
$ SUBMIT OECN$:BATCH_MAIL_MESSAGE/PARAMETER=("P1","P2","P3","P4")
</pre>
</table>

<p>
Where:

<ul>
  <li>P1 - Name of the text file to be mailed.
  <li>P2 - VMS mail address the text file will be sent to.
  <li>P3 - Text that is to be displayed on the Subject Line of the 
  message.
  <li>P4 - Y/N (yes/no) flag that indicates whether or not to delete the 
  text file containing the message after it is sent.
</ul>

<p>

<hr size=5>
<a name="oecn_view_chap"><h1>OECN VIEW Utility</h1></a>

<a name="heading_8.1"><h1>Overview</h1></a>

<p>
The OECN_VIEW utility allows users to view text files on the screen. It 
can be used for report files produced by OECN state software or other 
text documents. OECN_VIEW is a TPU based product, layered on DEC/EVE.

<p>
By default, OECN_VIEW will search for files in OECN$OUT which have the 
following extensions: *.TXT, *.LIS, *.DOC, *.RPT, *.LPT, *.RPT. These 
are the only files that OECN_VIEW will show to the user when they use 
the "Go_File" function or invoke VIEW without a file name.

<p>
However, A-sites may customize both the directory and/or the extension 
if desired. Define the OECN_VIEW_DIRECTORY logical to define the 
directory(ies) to be searched. It may be a search-list. The default for 
OECN_VIEW_DIRECTORY is OECN$OUT.

<p>
In order to change the file extensions, define the logical 
OECN_VIEW_FILES to be a search list containing the filespecs to search. 
Each entry in the search list must refer to OECN_VIEW_DIRECTORY.

<p>
Examples of the logicals are given below:

<a name="heading_8.2"><h1>OECN_VIEW.COM</h1></a>

<p>
The OECN_VIEW.COM command procedure is found in OECN$. It is used to 
define the two logicals, OECN_VIEW_DIRECTORY and OECN_VIEW_FILES. 
Observe the following notes from this procedure.

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
 
$!+ 
$! Notes: 
$! 
$!  This procedure is a shell for the OECN_VIEW utility.  It provides 
$!  defaults for the file directory and file types that the user may view. 
$! 
$!  A-sites can configure VIEW to behave differently if desired by defining 
$!  the following logicals: 
$! 
$!   OECN_VIEW_DIRECTORY =  Defines the directory OECN_VIEW will search 
$!       when user uses the 'Go File' command or invokes 
$!       VIEW without a file name.  This logical may 
$!       be a search list.  The default is OECN$OUT. 
$! 
$!   OECN_VIEW_FILES = Filespecs which user can see when the use 
$!     'Go file'.  The logical should be a searchlist 
$!     containing wildcard specfications for the files 
$!     names or types the user can view.  Each 
$!     equivalence string must refer to OECN_VIEW_DIRECTORY 
$!     for the device/directory.  That is, OECN_VIEW_FILES 
$!     should specify just the wildcard filename and type. 
$!- 
 
 
</pre>
</table>

<a name="heading_8.2.1"><h2>Customizing OECN VIEW</h2></a>

<p>
The following sample command file shows how to customize the 
directories and the file extensions to be viewed.

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
 
$!+ 
$! VIEW_EXAMPLES.com 
$! 
$!  Example of using OECN_VIEW to view shared documents.  This 
$!  command procedure may be added to a local menu to allow 
$!  users to view documents on-line. 
$! 
$!  In this example, users are given the ability to view internet documents. 
$!  Allows users to view *.TXT and *.DOC files in the directory 
$!  PUB:[INTERNET_DOCS]. 
$! 
$! - 
$ set noon 
$ set noverify 
$ 
$ define/user  OECN_VIEW_DIRECTORY PUB:[PUBDOM.NWOCA.INTERNET_DOCS] 
$ 
$ define/user  OECN_VIEW_FILES  OECN_VIEW_DIRECTORY:*.TXT,- 
     OECN_VIEW_DIRECTORY:*.DOC 
$ 
$ @oecn$:oecn_view 
$ 
$exit 
 
 
 
</pre>
</table>

<a name="heading_8.2.2"><h2>Creating a DCL Command</h2></a>

<p>
The VIEW utility works automatically from the MENU. However, you could 
define a symbol to execute VIEW from DCL.

<p>
For example, define:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
LOOK := = @OECN$:OECN_VIEW
 
</pre>
</table>

<p>
Then use the LOOK command from the $ prompt.

<a name="heading_8.2.3"><h2>OECN_EDIT</h2></a>

<p>
The OECN_VIEW utility uses a special editor called OECN_EDIT. Its 
purpose is to provide I/O routines to allow TPU to automatically read 
and translate VFC files into text. Please see <a href="oecn10_sysman_handbook_full.html#oecn_edit_chap">Chapter 9, OECN EDIT Utility</a>, for more 
details.
<p>

<hr size=5>
<a name="oecn_edit_chap"><h1>OECN EDIT Utility</h1></a>

<a name="heading_9.1"><h1>Overview</h1></a>

<p>
OECN_EDIT is a foreign command replacement for the EDIT/TPU DCL 
command. It is completely command line (qualifier and parameter) 
compatible with EDIT/TPU. Its purpose is to provide I/O routines to 
allow TPU to automatically read and translate VFC files into text. When 
using OECN_EDIT, all VFC files read by TPU are converted into text with 
form-feed and line-feed characters to preserve formatting. All other 
file types are NOT affected by OECN_EDIT and are read normally by TPU. 
This is different from the default TPU editor, which ignores VFC 
formatting. OECN_EDIT is used by the OECN_VIEW.COM procedure to allow 
VFC files to be viewed correctly. However, it may also be used with any 
TPU section file as an editor.

<a name="heading_9.2"><h1>Using OECN_EDIT</h1></a>

<p>
In order to use OECN_EDIT as your interface to TPU, define the 
following symbol:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
$ EDIT := = $OECN$:OECN_EDIT/TPU
 
</pre>
</table>

<p>
Note: The /TPU qualifier is required.

<p>
You may also include other qualifiers which you would normally use with 
EDIT/TPU, such as /SECTION, /UNIT, etc. OECN_EDIT will use the normal 
EVE section and initialization files by default.
<p>

<hr size=5>
<a name="oecn_keymap_chap"><h1>OECN KEYMAP Utility</h1></a>

<a name="heading_10.1"><h1>Overview</h1></a>

<p>
The OECN_KEYMAP utility allows users to select a terminal emulator, 
such as REFLECTIONS, EXCURSIONS, or PERSONA. Using this utility defines 
the logical OECN$KEY_MAP to point to a .INI file containing the desired 
keymapping. The mapping allows you to re-label the standard function 
keys. You cannot actually reassign the program functions to different 
keys. That is, from the programs point of view, the user is required to 
press a VT200 F11 for the "Find" function. However, you can assign F11 
to any PC key you wish in the emulator and then relabel F11 on the 
screen to match the PC keyboard.

<a name="heading_10.2"><h1>Using KEYMAP</h1></a>

<p>
Upon selecting the KEYMAP option from the OECN menu the user is given a 
list of keymapping options to select from. This menu of options is 
built by searching for all files named OECN$KEYMAP*.INI in either the 
OECN$ or the OECN$CUSTOM directory. If the same filename is found in 
both directories, only the one in OECN$CUSTOM will be used. The 
description used in the menu will be determined by whether or not a 
"DESCRIPTION=xxx" command is used. If the command is found in the .INI 
file, the description will be used for the menu, otherwise the filename 
will be used in the menu.

<p>
When a user selects their option, the name of the .INI file selected is 
recorded in a file called OECN$KEYMAP.DAT in their SYS$LOGIN directory. 
If keymapping is turned off, the OECN$KEYMAP.DAT file is deleted from 
the SYS$LOGIN directory.

<p>
The OECN_LOGIN procedure has been modified to look for the existence of 
this file and define the OECN$KEY_MAP logical to point to the .INI file 
found in the .DAT file. After selecting their option in KEYMAP, 
OECN_LOGIN will be immediately executed causing the logical to be 
defined for that process. Then, each time the user logs in, OECN_LOGIN 
will check for the OECN$KEYMAP.DAT file and set the OECN$KEY_MAP 
logical appropriately for that process.

<p>
The following standard .INI files have been created:

<ul>
  <li>OECN$KEYMAP_EXCURSIONS.INI
  <li>OECN$KEYMAP_PERSONA.INI
  <li>OECN$KEYMAP_REFLECTIONS_MAC.INI
  <li>OECN$KEYMAP_REFLECTIONS_PC.INI
</ul>

<p>
These files may be used as a starting point to create other .INI files 
for other terminal emulators that may be in use by districts or to 
support customized key mappings for districts. Instructions are 
included at the top of the .INI files which explain how the files need 
to be formatted and which keys are able to be mapped. It is recommended 
that the new .INI file be placed in the OECN$CUSTOM directory and be 
given a different name if it is to be an additional menu option. It is 
also recommended that the description inside the .INI file be changed 
to something meaningful to the user as this is what they will see in 
the KEYMAP menu.
<p>

<hr size=5>
<a name="oecn_setupenv_chap"><h1>OECN SETUPENV Utility</h1></a>

<a name="heading_11.1"><h1>Overview</h1></a>

<p>
SETUPENV is a general purpose utility for establishing or switching to 
user environments. The goal of the utility is to provide a single place 
to configure the software environment (primarily logicals) for given 
entities and allow user processes to configure based on these 
environment settings.

<p>
The concept for SETUPENV is similar to the BUNNY/FROG utilities 
available from NOACSC. However, it is intended to be more flexible and 
capable of configuring multiple environments. SETUPENV is not tailored 
to any particular software product. It may be used in the configuration 
of state software, McSIS, InfOhio, or any other software that requires 
logicals in establishing a user's environment.

<p>
The general goals of the utility are as follows:

<ol start=1 >
  <li>To provide a single location for all configuration information.
  <li>To provide a means for processes to establish a default context 
  during login.
  <li>To provide a means for users to change contexts using an 
  interactive (or DCL) interface.
  <li>To allow DAS personnel the ability to switch to any context using 
  the same rules as a user's process.
  <li>To provide compatibility with BUNNY, FROG, and USE to make the 
  transisition to the new utility easier.
  <li>To provide DCL and API interfaces which allow other utilities the 
  ability to find and establish contexts.
  <li>To provide support for common OpenVMS configuration methods in use 
  by DA Sites, including group tables and shared logical tables.
</ol>

<a name="heading_11.2"><h1>Getting Started</h1></a>

<p>
The SETUPENV utility is very flexible allowing the capability to deal 
with the variety of possible setups in use at the OECN DA Sites. This 
flexibility leads to a significant number of options in both the DCL 
command interface and options available in the OECN$SETUP 
initialization file. However, it is unlikely that any one DA Site will 
need all of the features provided by SETUPENV. Most sites will only 
need a limited set of options.

<p>
To get started with SETUPENV it is recommended that a simple OECN$SETUP 
file with a minimal set of options for just a few entities be created. 
Starting small will give the opportunity to experiment with the utility 
to see how, or if, it can fit into your environment.

<a name="heading_11.2.1"><h2>Entity Types</h2></a>

<p>
SETUPENV manages a user's context by assuming that any given process 
will have one context in each of the four entity "types". The current 
types of entities are:

<ul>
  <li>DISTRICT
  <li>BUILDING
  <li>LIBRARY
  <li>OTHER
</ul>

<p>
Therefore, a user may have one entity selected in each of these types 
and change the context for one entity without affecting the others. For 
example, a user might have a context in DISTRICT_A and BLG_B but be 
eligible to switch into several different LIBRARY entities. SETUPENV 
will allow the user to switch into different libraries without 
affecting the current district and building.

<p>
Entities can be linked together to form logical hierarchies. For 
example, a district entity might define the context for USPS, USAS, and 
EMIS. A building entity might define the context for McSIS. When a user 
selects a building, it may be desirable for the user's process to also 
select the corresponding district entity so that the EMIS logicals are 
switched automatically. SETUPENV can handle these relationships using 
the PARENT attribute in the OECN$SETUP file. Please refer to the PARENT 
attribute for more information.
<p>

<a name="heading_11.2.2"><h2>DCL Command Syntax</h2></a>
<br>

<p>
SETUPENV must be defined as a foreign command:
<br>

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
$ SETUPENV :== $OECN$:SETUPENV 
 
</pre>
</table>

<p>
Syntax:
<br>

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
$ SETUPENV [entry_code...] 
           [/MENU] 
           [/NEXT] 
           [/RESET] 
           [/LOGIN[=([SIS],[INFOHIO],[BY_ACCESS],[USERNAME[=n]])] 
           [/TYPE={DISTRICT,BUILDING,OTHER,ALL] 
           [/LOG] 
           [/[NO]PROMPT] 
           [/CATEGORIES={wildcard}] 
           [/APPLICATION={application}] 
           [/ARCHIVE=[archive_code]] 
           [/[NO]RESTRICT_IRNS] 
           [/PRINT] 
           [/USE] 
           [/BUNNY] 
           [/FROG] 
           
 
</pre>
</table>

<ul>
  <li><strong>ENTRY_CODE</strong> indicates the entry(s) to be selected 
  from the OECN$SETUP.INI file. The INI file indicates the environment to 
  be established for each entry. Multiple entries may be set by enclosing 
  the entry codes in quotes separated by commas. When setting multiple 
  entries, the first entry is considered to be the primary entry.
  <li><strong>/MENU</strong> indicates the user should be presented a 
  menu to select an entry based on their process security. /MENU is the 
  default for interactive processes when there are no other qualifiers 
  and no parameter specified.
  <li><strong>/RESET</strong> attempts to reset the current process to 
  it's original state. Any "reset" entries existing on the INI file are 
  used to determine which logicals should be reset. If there are no reset 
  entries on the INI file, the LNM$FILE_DEV logical will be the only one 
  returned to it's original state.
  <li><strong>/LOGIN</strong> instructs SETUPENV to attempt to determine 
  the user's default login context. If a specific entry code(s) is 
  specified with /LOGIN, the specified entry will override the defaults. 
  The following flags may be included to control how SETUPENV/LOGIN 
  determines the default entries:

  <ul>
    <li><strong>SIS</strong> searches the process' rightslist for 
    identifiers in the format SIS_x. For the first such identifier "x" is 
    used as the default entry.
    <li><strong>INFOHIO</strong> searches the process' rightslist for 
    identifiers in the format INFOHIO_x. For the first such identifier "x" 
    is used as the default entry. In order to avoid potential conflicts 
    with SIS entry codes, SETUPENV will first look for an entry named 
    "x_LIB". If and x_LIB entry is found, it will be used as the default 
    InfOhio entry, otherwise just "x" will be used.
    <li><strong>BY_ACCESS</strong> indicates that SETUPENV should determine 
    the user's default entry by checking security access to the entries. 
    SETUPENV will scan OECN$SETUP file and find the first entry of each 
    type (DISTRICT, BUILDING, LIBRARY, OTHER) to which the user has access 
    making this the default. BY_ACCESS should only be used by DA Sites who 
    have carefully placed proper identifiers on entries to allow access to 
    appropriate users.
    <li><strong>USERNAME=n</strong> uses the first "n" characters of the 
    username as the entry code. This is useful for sites who use a username 
    prefix to indicate districts and who have set up matching entry codes 
    in the OECN$SETUP file.
  </ul>
    <br>SETUPENV/LOGIN will also (unconditionally) search for an identifier 
    called "SETUPENV_xxx". If the user has such an identifier, then it is 
    always used as the default entry, superceding the default provided by 
    the above flags. This serves as a means to provide a specific default 
    for users who may have access to multiple entries.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
When /LOGIN is specified, SETUPENV will not issue errors if a default 
entry can not be found. This allows SETUPENV/LOGIN to be used in 
system-wide login procedures even for users who do not normally need a 
specific software context. </td>
  </tr>
</table>
</center>
  <li><strong>/NEXT</strong> indicates that the next entry should be 
  selected based on the current or specified entry. If an entry is 
  specified as a parameter, then the entry selected will be the one 
  immediately following it. Otherwise, the values of the 
  OECN$SETUP_CURRENT_* logicals are used to determine the current entry. 
  The primary purpose of /NEXT is to allow DCL procedures to process all 
  or selected entries sequentially.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
If /TYPE is not specified to indicate the type of the next entry, then 
the /TYPE defaults to the same type as the current entry 
(OECN$SETUP_ENTRY). That is, by default, /NEXT moves to the same type 
of entry as the current entry. If there is no current entry, then the 
default is DISTRICT. </td>
  </tr>
</table>
</center>
  <li><strong>/TYPE</strong> may be used in conjunction with /NEXT or 
  /MENU to determine the type of entry that may be considered. For 
  example, if /TYPE=DISTRICT is specified with /NEXT, then only district 
  entries will be considered. The default for /NEXT is DISTRICT. The 
  default for /MENU is ALL.
  <li><strong>/CATEGORIES</strong> may be used with /NEXT or /MENU to 
  select only entries where the CATEGORIES attribute matches the 
  specified wildcard.
  <li><strong>/APPLICATION</strong> may be used with /NEXT to select only 
  entries containing the specified application. Only one application may 
  be specified and it must exactly match an application specified on the 
  entries APPLICATION attribute.
  <li><strong>/[NO]PROMPT</strong> causes the user's DCL prompt and OECN 
  Menu prompt to be set to a value representing the entry(s) selected. 
  /NOPROMPT is the default.
  <li><strong>/LOG</strong> indicates an informational message should be 
  displayed indicating the entry selected. If multiple entries are set as 
  a result of the command, only the primary entry is displayed.
  <li><strong>/ARCHIVE[=archive_code]</strong> indicates which archive is 
  to be selected. If a specific archive is provided and it exists for the 
  entry, then the logical and table definitions for the archive will be 
  set. If no archive is specified, then the first archive for the 
  selected entry will be used. If /ARCHIVE is specifed with /MENU, the 
  archvives will be presented to the user as seperate choices on the menu.
  <li><strong>/RESTRICT_IRNS</strong> determines if SETUPENV should 
  attempt to define the OECN$EMIS_RESTRICT_IRNS logical. This logical is 
  set by checking all the entries which have a relationship (parent, 
  child, or sibling) based on the PARENT attributes. For each such entry, 
  the users access to the entries is checked (based on the IDENTIFIER 
  attributes). If the user has access to the entry, then the IRN of the 
  entry is added to the OECN$EMIS_RESTRIC_IRNS logical.
  <li><strong>/PRINT</strong> attempts to determine the user's default 
  printer using a convention from NOACSC. The "owner" field for the 
  current user is retrieved from SYSUAF. If the owner field contains a 
  slash (/) the characters after the slash are tested to see if it 
  contains a valid queue name. If not, "$PRINT" is appended to the string 
  from the owner field and is again tested as a queue. If either value 
  translates to a valid queue name (other than SYS$PRINT), then SYS$PRINT 
  is defined as a logical to point to the queue. The OECN_PRT symbol is 
  also defined to print to the queue.
  <li><strong>/EMIS</strong> places SETUPENV in "EMIS" mode. In this 
  mode, SETUPENV simulates the behavior of EMIS_SELECT.COM. The 
  OECN$EMIS_DBS file is read and handled in the same manner as 
  EMIS_SELECT. In this mode, the meaning of the "entry code" parameter is 
  the DBS code of the EMIS database, instead of a SETUPENV entry code. 
  The following qualifiers are valid with /EMIS:

  <ul>
    <li>/NEXT
    <li>/RESET
    <li>/MENU
    <li>/CATEGORIES
    <li>/LOG
  </ul>
    <br>See the "EMIS_SELECT Compatibility" section for more information.
  <li><strong>/USE, /BUNNY, /FROG</strong> provide compatibility with the 
  corresponding NOACSC's utilities. When one of these qualifiers is 
  specified, the utility accepts the corresponding utilitie's qualifiers 
  and converts them to the nearest SETUPENV equivalent. See the "NOACSC 
  Compatibility" section for more information.
</ul>

<h2>Usage Notes</h2>

<p>
When /NEXT is used, if the specified or next entry cannot be found 
SETUPENV exits with an error severity.

<p>
After successfully selecting an entry, OECN_LOGIN.COM is executed to 
ensure the users OECN$x logicals are set correctly. If the DAS has 
established the OECN_LOGIN_EPILOGUE procedure, it will subsequently be 
executed. This provides a means for the DAS to customize the behavior 
and do any additional processing after an entry is selected.

<p>
Likewise, when /EMIS is specified, EMIS_SELECT_EPILOGUE and 
EMIS_SWITCH_FY will be invoked after successfully selecting a database.

<a name="heading_11.3"><h1>Logicals Created By SETUPENV</h1></a>

<p>
After successfully selecting an entry, SETUPENV establishes a series of 
logicals (OECN$SETUP_*) to describe the current context and to maintain 
it's own context for subsequent invocations of SETUPENV. These logicals 
may be used by DCL procedures but should never be modified or 
deassigned (use SETUPENV/RESET to deassign the logicals if necessary).

<p>
The logical OECN$SETUP_ENTRY contains the current selected entry. This 
is the primary entry that was specified as a parameter, selected via 
the menu, or selected using /NEXT.

<p>
The logical OECN$SETUP_ARCHIVE contains the archive code if one was 
selected using /ARCHIVE or the menu.

<p>
One logical is defined for each of the entry types that has been 
selected. A user can have one context in up to four different "types" 
of entries: DISTRICT, BUILDING, LIBRARY, OTHER. For each type that has 
been selected, the corresponding logical will be defined:

<ul>
  <li>OECN$SETUP_CURRENT_DISTRICT
  <li>OECN$SETUP_CURRENT_BUILDING
  <li>OECN$SETUP_CURRENT_LIBRARY
  <li>OECN$SETUP_CURRENT_OTHER
</ul>

<p>
The logical will not exist for types that have not been selected.

<p>
The value of the OECN$SETUP_CURRENT_* logicals is a string that 
describes the selected entry. The format for the string entry is:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
        
        "entry_code,irn,categories,applications" 
 
        Where:  entry_code      the entry for this type 
                irn             from IRN attribute 
                categories      space delimited list of categories 
                                from CATEGORIES attribute 
                applications    space delimited list of applications 
                                from APPLICATIONS attribute 
        
</pre>
</table>

<p>
This string is formatted in a manner that is easily parsed using the 
F$ELEMENT lexical function.

<p>
The following logicals may also be defined depending on the selected 
entries relationship with other entries:

<ul>
  <li><strong>OECN$SETUP_PARENT</strong>---Contains the PARENT entry for 
  the current entry
  <li><strong>OECN$SETUP_CHILDREN</strong>---Contains a list, separated 
  by commas, of the children for the current entry. That is, a list of 
  entries which contain a PARENT pointing to the current entry.
  <li><strong>OECN$SETUP_SIBLINGS</strong>---Contains a list, separated 
  by commas, of "siblings" (excluding the current entry). That is, a list 
  of entries that share the same parent entry.
</ul>

<p>
Any of the logicals that do not apply to an entry will not be defined 
(e.g. for a parent entry, the siblings logical will not be defined).

<a name="heading_11.4"><h1>OECN$SETUP.INI</h1></a>

<p>
The OECN$SETUP initialization file defines the environment for various 
entities which use OECN (or other) software products. The default 
filename is OECN$CUSTOM:OECN$SETUP.INI. OECN$SETUP may be defined as a 
logical to override the location and filename.

<p>
Each "section" in the INI file describes an "entity". An entity might 
be a district, building, library or other entity where a specific 
context needs to be established. When the SETUPENV utility is executed 
to select an entity, the context is defined as specified in the rules 
for that section.

<p>
The parameters and formats for each section are as follows:

<ul>
  <li><strong>SECTION={entity_code}</strong> <br>The SECTION statement 
  begins a new entity definition. The entity code may be up to 12 
  alphanumeric digits. This is the code used to select the entry and is 
  seen on the menu. This code must uniquely identify each entity 
  regardless of type (i.e. You must not specify a district and building 
  entity with the same code).
  <li><strong>DESCRIPTION="text"</strong> <br>Text description for menu
  <li><strong>TYPE={DISTRICT|BUILDING|LIBRARY|OTHER}</strong> 
  <br>Indicates the type of entity. If TYPE is not specified, the default 
  is DISTRICT. A user can have context in each of these types at one time.
  <li><strong>CATEGORIES="string"</strong> <br>An unformatted string that 
  may further define the entry. Except where otherwise indicated, the 
  categories are site defined. It might be used as flags to indicate 
  processes that may be run against the entry. Entries may be selected by 
  category using the /CATEGORIES qualifer. The categories for each 
  selected type is also returned to DCL via the OECN$SETUP_CURRENT_* 
  logicals.
  <li><strong>APPLICATIONS={app}[,...]</strong> <br>List of applications 
  used by the entry. Each application is a site defined code of up to 10 
  characters. Five applications may be specified on each APPLICATIONS 
  line. Multiple APPLICATIONS lines may be specified if needed. 
  <br><strong>Note:</strong> Although the applications are site defined, 
  the SSDT and other software providers may require specific application 
  codes. It is recommended that you use these codes for established 
  applications:

  <blockquote>
     USPS
    <br> USAS
    <br> EMIS
    <br> EIS
    <br> VIS
    <br> SIS (McSIS)
    <br> INFOHIO
  </blockquote>
  <li><strong>IRN={irn}</strong> <br>Optional IRN for the entry. Returned 
  to DCL via the OECN$SETUP_CURRENT logical and optionally used in the 
  OECN$EMIS_RESTRICT_IRNS logical.
  <li><strong>PROMPT="prompt string"</strong> <br>Optionally specifies 
  the prompt string to be used if this entry is selected. This value 
  overrides the default prompt. The default prompt is the list of entry 
  codes currently selected.
  <li><strong>ARCHIVE={archive_code},[description],[table]...</strong> 
  <br> Declares this entity to have an "archive". Archives can be 
  selected using the /ARCHIVE qualifier. If a code is specified on the 
  /ARCHIVE qualifier, then the corresponding archive items are also 
  processed when the entry is selected. When /ARCHIVE is used with /MENU, 
  then the archive definitions are listed on the menu as separate items 
  which the user can select. <br>The optional table parameter indicates 
  additional table(s) which should be placed in the LNM$FILE_DEV search 
  path. If specified, they will be placed on the path before the other 
  shared tables (TABLE and GROUP_TABLE). This permits definitions for 
  archive logicals to be placed in special shared logical tables for use 
  as an archive. <br>A multiple ARCHIVE attributes might be included for 
  each fiscal year, or it may be a generic archive setting which requires 
  an additional step (outside of SETUPENV) to complete establishing the 
  archive environment. The usefulness of this attribute depends largely 
  on how the DAS currently has archives defined and whether/how they are 
  user selectable.
  <li><strong>LOGICAL={logical_name[@archive_code]}[,CONCEALED] 
  [,IF_EXISTS],[values]...</strong> <br> Specifies a process logical to 
  define. Multiple values may be included to define a search list. If a 
  logical name is specified without any values, then the logical will be 
  deassigned. <br> If the CONCEALED keyword is included, then the logical 
  will be concealed. <br><strong>Conditional Logicals</strong> <br>The 
  IF_EXISTS keyword causes the logical to be defined conditionally based 
  on the presence of the file specified in the value. The logical will 
  only be created if the file specified in the first value exists. In 
  this case, the value should contain a complete filespec. For example an 
  EMIS entry might specify:

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
          LOGICAL=OECN$EMIS_STU_SEARCH,IF_EXISTS,OECN$EMIS$DTA:EMSALT.IDX 
          LOGICAL=OECN$EMIS$DTA,CONCEALED,EMIS_ROOT:[LIVE] 
</pre>
</table>

    <br> In this case, OECN$EMIS_STU_SEARCH will only be defined if the 
    OECN$EMIS$DTA:EMSALT.IDX file exists.

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
SETUPENV defines logicals in the reverse order that they appear in the 
section. Therefore, conditional logicals should be placed prior to any 
logicals which they refer to. </td>
  </tr>
</table>
</center>
    <br><strong>Archive Logicals</strong> <br>If an optional archive code 
    is included after the logical name (by specifying the archive code 
    after an "@") then the logical will only be defined if the 
    corresponding ARCHIVE code is selected (via the /ARCHIVE qualifier or 
    the menu). Logicals which contain the archive code will be processed 
    after any normal logicals and therefore will supercede any previous 
    definition of the same logical. <br> The archive code on each logical 
    should match an archive code specified in an ARCHIVE attribute. The 
    ARCHIVE attribute will provide the description for the menu when the 
    archive is displayed.
  <li><strong>SYMBOL={symbol_name}[,symbol_value]</strong> <br>Sets a 
  global symbol. If a value is not specified, then the symbol is deleted. 
  <strong>Note:</strong> The symbol and value must be made up of 
  printable characters. Non-printable values may not be included (in the 
  current version of SETUPENV).
  <li><strong>PARENT={entry}</strong> <br>Indicates a parent entry of 
  this entry. Parent entries may be nested (i.e. parents of an entry may 
  themselves have a parent). This facility allows multiple entries to 
  share another entry as a parent. For example, if all buildings share 
  the district definition of EMIS_ROOT, then EMIS_ROOT can be defined in 
  the district entry and each building specify the district as PARENT. 
  <br>When the user selects an entry which contains the PARENT attribute, 
  then settings for the parent will be set prior to the logicals for the 
  selected entry. Therefore, selecting a building entry will also 
  automatically select the corresponding district (parent) entry.
  <li><strong>GROUP_TABLE={octal_group_number}</strong> <br>Specifies 
  this entry uses a GROUP logical name table for some of it's logical 
  definitions. This setting only applies if someone outside the group 
  attempts to set this entry. If so, the entry's group table will be 
  added to the process' LNM$FILE_DEV path. Otherwise, if the user is in 
  the specified group, it's assumed that the default definition of 
  LNM$FILE_DEV already includes LNM$GROUP.
  <li><strong>TABLE={logical_name_table},...</strong> <br>Indicates that 
  this entry uses a sharable logical name table(s) (other than a group 
  table) for some of its logicals. When this entry is selected, the 
  logical table will be added to the processes LNM$FILE_DEV logical path. 
  Up to four tables may be specified.
  <li><strong>IDENTIFIER={ident_specification}</strong> <br>Indicates an 
  ACE entry used to control access to the entry. This is used when /MENU 
  is specified to control which entries the user is allowed to see. It is 
  also used when determining which entry to select as default when 
  /LOGIN=BY_ACCESS is specified. <br>The format of the identifier 
  specification is the same as the "IDENTIFIER=" portion of a standard 
  identifier ACE entry. If the specification includes a comma then the 
  specification must be enclosed in quotes. Multiple IDENTIFIER lines may 
  be included for an entry. If so, standard ACL processing applies for 
  determining access. Examples:

  <blockquote>
     IDENTIFIER="[101,*]"
    <br>IDENTIFIER=SIS_BLDA
    <br>IDENTIFIER="OECN_USAS+ARCHBOLD_FISCAL"
  </blockquote>

<p>
<center>
<table border=0 width=75%>
<tr>
  <td><center><font size=+2><strong>Note</strong></font></center><hr 
  size=1 noshade>
IDENTIFIER does not necessarily restrict users from selecting a 
specific entry. If a specific entry is specified on the command line 
(manually or via a DCL procedure), SETUPENV will establish the context 
regardless of the IDENTIFIER attributes. This is useful for sites who 
do not need, or do not desire, to code specific identifiers into the 
OECN$SETUP file. </td>
  </tr>
</table>
</center>
</ul>

<a name="heading_11.4.1"><h2>Special "Reset" Entries</h2></a>

<p>
Prior to setting any given entry, SETUPENV will attempt to process 
special sections named "$RESET_type". If a $RESET section of the 
appropriate type exists in the INI file, it will be processed prior to 
setting an entry.

<p>
The following reset sections may be specified:

<ul>
  <li>$RESET_DISTRICT
  <li>$RESET_BUILDING
  <li>$RESET_LIBRARY
  <li>$RESET_OTHER
</ul>

<p>
When a user selects an entry of a specific type, the corresponding 
reset section is invoked prior to setting the environment for the 
selected entry.

<p>
This is useful in cases where some entries specify a process logical 
but others use a group logical. In order to switch from one entry to 
another, it is necessary to deassign the common logical from the 
process table prior to switching to the group logicals.

<p>
For example, consider that DISTRICT_A has a process logical definition 
of OECN$DTA. But DISTRICT_B has a group logical for OECN$DTA. Switching 
from DISTRICT_A to DISTRICT_B requires that the OECN$DTA be deassigned 
so the group logical is visable. SETUPENV does not attempt to keep 
track of this, rather it permits you to create a $RESET entry for each 
type to deassign logicals appropriate for your site. For example, 
$RESET could be defined as:

<blockquote>
  SECTION=$RESET_DISTRICT
  <br>LOGICAL=OECN$DTA
  <br>LOGICAL=OECN$OUT,"SYS$DISK:[]"
</blockquote>

<p>
The above entry would cause SETUPENV to deassign OECN$DTA and define 
OECN$OUT to the default directory prior to setting any valid entry. In 
general, you should explicitly deassign any logicals in the reset 
section that are defined in any entry of the same type.

<a name="heading_11.4.2"><h2>Sample OECN$SETUP File</h2></a>

<p>
Below is a very simple OECN$SETUP.INI file which defines entries for 
one district and two buildings. The setup file can contain many such 
entries for as many districts and buildings provided that the entry 
codes are unique.

<p>
<table border=0>
  <tr>
    <td>
      <br>
<pre>
 
        SECTION=SAMPLE 
        TYPE=DISTRICT 
        DESCRIPTION="Sample City Schools" 
        LOGICAL=EMIS_ROOT,          FSA:[EMIS_SAMPLE.],CONCEALED 
        LOGICAL=OECN$DTA,           FSA:[SAMPLE] 
        LOGICAL=OECN$FORM_DIRDEP,   OECN$PAY:DIRPRT.FRM 
 
        SECTION=SAME 
        TYPE=BUILDING 
        DESCRIPTION="Sample Elementary School" 
        PARENT=SAMPLE 
        TABLE=SIS_SAME 
        IDENTIFIER=SIS_SAME 
 
        SECTION=SAMH 
        TYPE=BUILDING 
        DESCRIPTION="Sample High School" 
        PARENT=SAMPLE 
        TABLE=SIS_SAMH 
        IDENTIFIER=SIS_SAMH 
 
        SECTION=$RESET_DISTRICT 
        LOGICAL=EMIS_ROOT 
        LOGICAL=OECN$DTA 
        LOGICAL=OECN$FORM_DIRDEP 
</pre>
</table>

<p>
In this example, the buildings point to the district using the PARENT 
attribute. This creates the appropriate relationship. When the user 
selects one of the buildings, the corresponding logicals from the 
district entry will also be set.

<p>
Also notice that the district entry uses LOGICAL's to define the 
individual logicals. But the building entries use shared logical tables 
created outside of SETUPENV.