[Access to Wang masthead]

Time-Release Operations

More on using Glossary for keystroke automation

From "VS Workshop",  Access to Wang, January 1989
  [ Prior Article ]     [ Return to the Catalog of articles ]     [ Next Article ]  

In last month's column, I promised to supply more specifics on the use of Glossary programs to automate operations. Hopefully, those of you with little prior experience in Glossary programming will have worked through some examples, perhaps even using the Append option offered by the personality editor (WSPERSON; a.k.a. PERSON) to generate Glossary source. If you have performed this process you are ahead of the game, since that is the way I usually create individual modules for master Glossary programs.

The sample application I present here is necessarily limited in scope. It is quite possible to extend error-checking and fault tolerance far beyond what has been accorded here, but space limitations and relevance to overall needs dictate a simpler approach.

ROBOT: a sample application

The example Glossary application presented here shows a simple, one-file automation scheme based on the following specifications:

Glossary execution, linking, and control

Initiating Multi-Station Glossaries is a process that is difficult to understand until seen in action. The Auto-Start procedure mentioned above refers to a Glossary procedure that automatically executes every time the personality file is loaded into the workstation. Interestingly, this special procedure acts as a Global Glossary; that is, it executes in all windows simultaneously. This is the reason that there is logic to check the screen number before proceeding.

The WSRSTR (or MWSRSTR) program is used to load the personality file. This differs from typical use in logon procedures and other interactive tasks, where the WSLOAD (or MWSLOAD) procedure is often used instead. The difference? WSLOAD extracts the user's ID and attempts to find a file by that name in a default library; if found, the file is loaded and the procedure ends. WSRSTR, on the other hand, allows you to load any Multi-Station file into the workstation regardless of its location and name.

The ROBOT example shown here uses a naming convention of the days of the week. In this manner, the same procedure can be used to run Glossaries every day of the week. Naturally, this simplistic approach would not work well when the data to be entered or programs run was subject to frequent change; in those instances, more sophisticated methods might be necessary. (More on this point below.)

Using Glossary-by-Example

One method of creating Glossaries is to build individual Glossary fragments (such as RPT156) by running the process to be automated manually and recording the keystrokes with Glossary-by-Example for later use with the Append function in the personality editor. The resulting code could then be edited and saved as individual files to be assembled during the compiler process.

Using the Glossary-by-Example approach greatly simplifies the editing process and usually produces more accurate source code. Since the personality editor generates the keywords, you only have to add any desired error checking and create the new source file. Pay particular attention to the screen location and actual text information presented during both error conditions and successful operation, as these are some of the only clues you have for error detection and logging. (A file of screen print files is very helpful in creating and maintaining Glossary programs where on-screen information is used for program control.)

Access to the Append function mandates use of the WSPERSON utility for Glossary editing, since this important function is only found there. Using WSPERSON also allows you to see the size in percent of the compiled Glossary code, so you can avoid overflowing the 2048-byte boundary allowed for Glossary programs.

Advanced issues

Other topics to be considered include possible workstation security issues, space limitations, and further discussion of error handling. Since every situation is different, I will present only theory here.

A real danger of using Glossary to automate workstation operations is that some person or event will interrupt the process and cause it to abort. Worse, the use of Glossary offers little opportunity to log these problems for later analysis. The Glossary source pictured here uses screen dumps to log events, but this is predicated on the Glossary program retaining control of the workstation. As mentioned above, Glossaries can be irreversibly cancelled through use of RESET or HELP, resulting in the loss of all stored keystrokes.

Keyboard interruptions would be less likely if the type-ahead workstation feature was disabled. Another method of avoiding these interruptions might be to redefine the keyboard without any key functions, so no keys would work. (Remember that the key does not have to be present on the keyboard to be used by a Glossary.) Logging operations might be conducted via the TRACE function, invoked within the controlling procedure.

It is also likely that your application will require dynamic data entry for each run. For example, you may need to enter a date range for each report - data that changes with every run. A possible solution here lies in the use of the "pick up" and "put down" key functions, with the dynamic information displayed in a specific position on the workstation for Glossary access. Another method is to use Procedure Global variables, in which the contents of the variable remain in that task's memory and can be accessed by all other procedures run within.

I hope that the preceding discussion stimulates some of your thoughts for advanced use of Glossary programs. It should be obvious by now that this is a subject rich with potential. By all means, let me hear about some of your attempts at Glossary programming for all purposes.

Next month I'll sketch out an alternative text-processing environment that spans VS and PC word processing approaches, using local and host printers, storage, and processing resources.


Figure 1: Master Procedure to Load Multi-Station Files


PROCEDURE ROBOT - starts selected Multi-station tasks -

*  Literals follow
DECLARE &JOBLIB STRING (08) INITIAL "WSPER   "
DECLARE &JOBTIM STRING (04) INITIAL "2330" [11:30 pm]
*  End literals

DECLARE &JOBFIL   STRING (08)
DECLARE &SYSVOL   STRING (06)

DECLARE &HHMM     STRING (04)
DECLARE &MMDDYY   STRING (06)
DECLARE &YYMMDD   STRING (06)
DECLARE &DATINDEX INTEGER
DECLARE &DATNAMES STRING (21)
             INITIAL "SUNMONTUEWEDTHUFRISAT"

EXTRACT           &SYSVOL   = SYSVOL
ASSIGN &MMDDYY    = &DATE
ASSIGN &YYMMDD    = &MMDDYY(5,2) !! &MMDDYY(1,4)

RUN DAY IN USERSUBS ON &SYSVOL
        USING   &YYMMDD, &DATINDEX
IF &DATINDEX < 1 OR &DATINDEX > 7
    RETURN CODE = 999           [ Exit here ]

ASSIGN &JOBFIL = &DATNAMES((&DATINDEX * 3) - 2, 3)

MESSAGE CENTER "Batch job ", &JOBFIL(1,*),
               " waiting to begin--";
        CENTER "Please do not touch!"

* Loop to check times
LOOP: RUN PAUSE IN USERSUBS ON &SYSVOL
          USING +6000  [ pause 1 minute ]

ASSIGN &HHMM  = &TIME
IF &HHMM < &JOBTIM  GOTO LOOP

MESSAGE CENTER "Job ", &JOBFIL(1,*), " executing--";
        CENTER "Please do not touch."

RUN WSRSTR
  ENTER INPUT  FILE    = &JOBFIL,
               LIBRARY = &JOBLIB,
               VOLUME  = &SYSVOL

RETURN

Figure 2: Auto-Start Glossary for Daily Reporting


/*****************************************************
    Glossary MON - runs Monday reports and backup
            Last update: 08/01/88 DSB
 *****************************************************/


/************** Print Screen procedure ***************/

printscreen: procedure;
   call playout ('(-help!-)');
   call waitforunlock;
   call playout ('(-pf-14-)');
   call waitforunlock;
   call playout ('(-help!-)');
   call waitforunlock;
   call playout ('(-pf-1-)');
end printscreen;

/************ General Control Procedures *************/

%noprint            /* Suppress printing of password */
logon: procedure;
    if substr(screen(1),41,5) = "Logon" then do;
        call playout('(-help!-)');
        if window = 2 then do;
            call playout ("OP" !! char(window));
        end;
        call playout ("password(-enter-)");
    end;
end logon;
%print                            /* Resume printing */

logoff:
    do while (substr(screen(4),2,11) ^= "Workstation");
        call playout ('(-pf-16-)');
        call waitforunlock;
    end;
end logoff;

autologon: procedure options (main);
    do while window ^= 2;
        call playout ('(-get-n-)');
        call waitforunlock;

/****************** Daily reports ********************/

%include RPT156     /* Trial Balance (daily version) */
%include RPT201  /* Sales & Marketing Report (daily) */
%include RPT579               /* Transaction Summary */
%include RPT807          /* BACKUP - G/L, A/P, Sales */
%include PST116                     /* Post New Cash */

    end;

    call logoff;    /* Log off screen 2; return to 1 */
    do while window ^= 1;
        call playout ('(-get-n-)');
        call waitforunlock;
    end;
end autologon;

Figure 3: %include File RPT156 for Main Glossary


/******** RPT156 - prints daily Trial Balance ********/

   call playout ('(-pf-1)(-pf-4-)');
   call waitforunlock;
   call playout ('(-tab-)d(-tab-)(-tab-)x(-enter-)');
   call waitforunlock;

   if substr(screen(23),2,10) ^= "SUCCESSFUL" then do;
       call printscreen;
   end;

   call playout ('(-pf-16-)(-pf-16-)');
   call waitforunlock;

/******************* End of RPT156 *******************/

  [ Prior Article ]     [ Return to the Catalog of articles ]     [ Next Article ]  


Copyright © 1989 Dennis S. Barnes
Reprints of this article are permitted without notification if the source of the information is clearly identified