Lacking Natural Simplicity

Random musings on books, code, and tabletop games.

POISE DMS-Plus, another Description

I found a better description of the POISE DMS-Plus; alas, the original link is broken now, but it is still accessible from archive.org here. It is from the time when POISE was still owned by Campus America, but they seem to had added a Tulsa to the end of the name, and I don't remember that version of the company. Oh, I forgot to mention that the POISE DMS-Plus runs on OpenVMS. I use it on VAX/VMS v5.5-2 on an emulated VAX that I maintain.

I'll quote it below in it's entirety:

DMS-Plus®

DMS-Plus is a 4GL (fourth generation language) with its own database management system that is the foundation of POISE application software systems. POISE PRODUCTSistrative software applications and DMS-Plus run under the OpenVMS operating system on Compaq’sVAX families and Alpha computers.

DMS-Plus offers the freedom to choose where control of the PRODUCTSistrative system should be depending on your institution’s needs. Control may be given to a central data processing center, or departments may be autonomous.

The benefits of a DMS-Plus approach to PRODUCTSistrative processing include greater flexibility and speed, and simplicity in implementing changes. Users have the freedom to organize, access, and manipulate information to meet their needs, freeing the data processing center to become a more flexible and responsive information and resource center.

Features

DMS-Plus provides the following capabilities and productivity tools:

  • Report Generators for easy sorting, selecting, and printing.

  • Screen Generators for easy data entry, update, and review

  • PRODUCTSistrative Systems Query (ASQ) for retrieving data from the database using English-like commands.

  • Menu Processor

  • Data Manipulation for inserting, updating, and deleting data in the database

  • Data Definition for adding new elements to the database

  • Data Control for accessing data by persons who have been granted access

  • Import/Export capability via ASCII file formats

  • WordPerfect Interface

Oracle Rdb for Open VMS and Open Alpha AXP commuting environments. In addition, it incorporates industry standards such as SQL. By including support for Oracle Rdb in POISE application software, Campus America provides investment protection. You may take advantage of new and sophisticated features while continuing to use the 4 GL tools of DMS-Plus.

Housing

DMS-Plus includes a wide range of reporting tools that can produce both ad hoc and routine reports. These tools include a columnar report writer, a forms writer, a label printing program, and an English-like query language.

All tools are designed for the everyday user and may be used without the help of a programming staff. These tools include on-line help.

DMS-Plus includes a wide range of reporting tools that can produce both ad hoc and routine reports. These tools include a columnar report writer, a forms, writer, a label printing program, and an English-like query language.

All tools are designed for the everyday user and may be used without the help of a programming staff. These tools include on -line help.

LIST OF DMS-PLUS FUNCTIONS

The following is a list of the DMS-Plus functions with a brief description of each:

ADD

Enters new records into a new database

ASQ

Inquires by English-like query language.

BLANK

Blanks (or fills) requested fields.

CALCULATE

Performs calculations on field information.

CARD/TAPE

Provides data import/export capabilities.

COMPARE

Compares two databases for match/non-match of records.

DELETE

Deletes database records.

DESCRIBE

Creates, modifies, defines databases and associated fields.

EXCHANGE

Creates WordPerfect and WPS files.

MENU

Accesses the DMS-Plus Menu Processor.

FORM

Produces specially formatted reports, personalized letters.

KEY

Reconstructs keyed file indices.

LABEL

Prints labels in a variety of formats.

POINTER

Creates a pointer file index by record selection, key, or field contents.

PRINT

Accesses the standard report generator.

PURGE

Purges deleted records.

QUEBATCH

Generates job stream files.

REORDER

Reorders existing pointer files.

ROTATE

Rotates field data from one database into another.

SAVE

Saves (or recalls) pointer files.

SCOPE

Processes field data using screen formats for entry, update, delete or inquiry.

SCREEN

Creates and maintains SCOPE screen formats.

SEARCH

Scans a database and allows updating.

SORT

Creates pointer files by record selection and/or ordering.

TRANSFER

Transfers (copies) data between databases.

UPDATE

Updates existing records in a database.

XTAB

Performs cross tabulations with field data.

DMS-Plus provides a set of tools to establish databases and to manipulate the data within them. Simple steps for the use of DMS-Plus are shown below:

  • Step 1: Create a database, DMS-Plus DESCRIBE is used to create a database. When the database is created, it is empty. Records may be added to it by any of several DMS-Plus functions: SCOPE, ADD, TRANSFER, etc.

  • Step 2: Use the database. After records(data) are added in one or more databases, you perform the following procedures:

    • Query the database

    • Generate reports

    • Post (move / update) data from one database to another

    • Perform calculations on data in the database

    • Exercise various combinations of the above actions

    • Print labels, personalized letters, reports, etc.

  • Step 3: Continue manipulating data. New records may be added, old records may be deleted, and / or data within existing records may be updated. Operations in Step 2 may be repeated.

In summary, after a database has been created, you may devote your attention to adding, updating, and manipulating data for specific purposes. If necessary, field descriptions in the data base may be changed or new fields added. Also, the number and size is included in the database may be increased if the need arises.

On-Site Training: Extensive on-site training classes are provided during initial installation to train personnel in the use of DMS-Plus and application software. Training is included in the license price.

Classroom Training: Classroom training is provided at Campus America training facilities for "hands-on" instruction on a regularly scheduled bases. Training is included in the license price.

Contract Training: Optional on-site workshops, classroom training and consulting services are available in addition to the training that is included with the license price of Campus America software.

Subscription Service: Subscribers to DMS-Plus and POISE application software receive support and services which promote the successful use of POISE PRODUCTSistrative systems in educational institutions. These services include: normal corrections to software, periodic enhancements; telephone support (to help users diagnose and answer questions), technical support assistance, and contract programming services.

Documentation: Reference and technical manuals are provided and may be reproduced by licensee for intern Reference manuals include detailed explanations and liberal use of illustrated examples. Documentation also includes procedural guidelines documenting the step by step operation of the system. Detailed database descriptions are provided which include notes describing the purpose and function of each standard field (data element) in the databases. Technical reference materials include clear and concise tables with cross-references to procedures, menus and databases.

On-line Help: On-line help is included with the software.

11415 East 19th Street
Suite B
Tulsa, OK 74128-6412
Phone: 918-437-4920
Fax: 918-437-3533

Campus America is a registered service mark of Campus America, Inc. POISE and DMS-Plus are registered service marks and trademarks of Campus America, Inc. VAX and OpenVMS are registered trademarks of Digital Equipment Corporation which is owned by Compaq, Inc. Campus America believes the information on this site is accurate as of the production date. Such information is subject to change without notice. Campus America is not responsible for inadvertent errors. ©1998 Campus America, Inc.

POISE DMS-PLus, a Description

Some time ago I linked to a description of the POISE DMS-Plus, a Data Management System that I've used extensively since the mid 1980s. Last time I knew it was owned by Jenzabar. Since Jenzabar's description of it (as part of Jenzabar PX) has vanished from their web pages I thought it would be useful to have a description of it on my blog.

I'll include Jenzabar's description of the POISE DMS-Plus here:

DMS-Plus

Each Jenzabar PX Administrative application module is built on Jenzabar PX DMS-Plus®, a relational database management system (RDBMS) using fourth-generation (4GL) language. DMS-Plus includes a powerful report-writer, an information-retrieval system using multiple keys, screen generation, and has multiple user levels: the operator, intermediate user, advanced user, and application developers. It also includes an Administrative Systems Query (ASQ or ask) language that is designed to make the software easier to use for administrative personnel. ASQ permits users to select, order, display, and print information through simple English-like commands. In addition to ASQ, another option for queries and reporting is QBF (Query By Form), a point and select method which leads users through the data files and query options.

The benefits of a DMS-Plus approach to administrative processing include ease of use by nontechnical personnel, a greater flexibility, and speed and simplicity when implementing changes. It includes a powerful data management and information retrieval facility with right-to-use source code available. DMS-Plus includes list processing as well as interfaces to stand-alone word processing systems. Future enhancement to DMS-Plus are provided as part of the ongoing subscription services. DMS-Plus is the common language for all types of users.

DMS-Plus Highlights

  • DMS-Plus provides Report Generators for easy sorting, selecting, and printing along with Screen Generators for easy data entry, update, and review.

  • DMS-Plus utilizes data manipulation for inserting, updating and deleting data in the database. In addition to data definition for adding new elements to the database, data control is also available for accessing data by persons who have been granted access.

  • DMS-Plus has a menu processor, import/export capability via ASCII file formats, a WordPerfect interface, and SQL compliant.

  • DMS-Plus is a user-oriented system that operates in a multi-user environment. Simple English-like language prompts and responses are used to interact with the system. By utilizing the flexibility of DMS-Plus, each user office can determine the information collected, can regulate work flow, can set its own schedules for updating files, and can produce its own reports without depending on Information System services.

  • DMS-Plus supports multi-user access. These application systems use many of the same functions and techniques that provide continuity across user departments and also allows cross-utilization of personnel.

  • Many applications for information management needs may be implemented through the software provided with little or no additional programming.

  • DMS-Plus provides an integrated base of information for administrative data processing. Information introduced into the system may be carried forward into all appropriate areas without redundant entry.

While the above describes the POISE DMS-Plus as a “relational database management system”, it isn't really. It does not use a relational database. It comes from the time before relational databases.

To me, a database is a program that controls access to a collection of data - you can’t get to the data without asking the database program for it.

A data management system (the DMS in DMS-Plus) just lets you associate related data together, and then multiple programs can access the pieces, usually using a standard API implemented as a library.

Before the advent of Unix, files were often much more complicated that just a stream of bytes. For instance, under VMS (where I've used the POISE DMS-Plus the most) the Record Management Services (RMS) provides sequential, relative, and indexed file organization, and fixed-length and variable-length record formats, and allows you to access records within these files sequentially, directly by key value, directly by relative record number, or directly by record file address. It was common practice for programs to each use their own specific mix of these aspects of RMS, with the details directly coded into the program.

The advantage of the POISE DMS-Plus is it provided a suite of programs that worked together, allowing users to describe the format of the files they wanted, enter and modify data in those files, sort and select data, and produce nicely formatted reports, without having to write any code. The programs were interactive, issuing a series of prompts to the user for what they needed to do next, and were very easy to learn. If a secretary wanted to keep track of the inventory of their office, they would run DMS:DESCRIBE to describe the fields they wanted and allocate space for the file, then run DMS:ADD to add data, DMS:SEARCH to search and update it, DMS:SORT to sort and select data, and DMS:PRINT to produce a nicely formatted report. If they had to do a lot of data entry into the file, or it was large or complicated, they could run DMS:SCREEN to define a text user interface screen format for interactive user input, arranging the fields or subsets of the fields on the screen to make data entry easy, and then run DMS:SCOPE using that screen format to do data entry. (I keep wishing for something as easy to use as DMS:SCREEN in the area of database backed web applications, but haven't found it yet.)

POISE DMS-Plus files were relational in that it was possible for fields in one file to refer to values in fields in another file, similar to SQL JOINs and FOREIGN KEY constraints. So, for instance, it was possible to have a code field in one file, but on reports include the description of the code by pulling it from a code file, keyed by the code field.

All the POISE DMS-Plus programs used a documented API, the Support Procedure Library, which programmers could use to write programs that accessed POISE DMS-Plus files for applications that required sophisticated, special purpose processing. Furthermore, they documented the file structures they used, so it was possible to write programs that accessed DMS-Plus files directly, if necessary.

POISE, by the way, stood for “People Oriented Interactive Software for Education”, and it probably had its greatest success in systems for education administration, but it was a general purpose tool and I have worked on projects using it for many other areas, including local and state government, real estate sales management, oil and gas royalty management, and many others.

Redimensioning formal parameter arrays in OpenVMS BASIC, Revisited

I was working on a program on a VAX today, and needed to redimension dynamically allocated arrays that are passed to an external function. I've done this in the past (an old USENET post, and the old blog post that mentions it), but this time I managed to simplify my solution, and generalize it to work with both lower and upper bounds, and so the same function would work with multiple VMS BASIC data types. Here's the new USENET post. (How's that for thread necromancy?)

I'll include the code in this blog post, too, for ease of reference. Here's vax_redim_best.bas:

program vax_redim_best
    option type = explicit, constant type = integer, &
        size = integer long, size = real double
    record rec
        string s = 13
        long   i
    end record rec

    ! Don't declare the parameters, and everything works, even passing
    ! different types.
    external sub redim

    declare long stat, i
    i = 1
    dim rec rec(1 to i)
    print "lbound (rec) at start: "; lbound (rec)
    print "ubound (rec) at start: "; ubound (rec)
    call redim (rec(), 3, 10)
    print "lbound (rec) after redim: "; lbound (rec)
    print "ubound (rec) after redim: "; ubound (rec)

    dim string s(1 to i)
    print "lbound (s) at start: "; lbound (s)
    print "ubound (s) at start: "; ubound (s)
    call redim (s(), 3, 10)
    print "lbound (s) after redim: "; lbound (s)
    print "ubound (s) after redim: "; ubound (s)

    dim long l(1 to i)
    print "lbound (l) at start: "; lbound (l)
    print "ubound (l) at start: "; ubound (l)
    call redim (l(), 3, 10)
    print "lbound (l) after redim: "; lbound (l)
    print "ubound (l) after redim: "; ubound (l)


end program ! vax_redim_best

function long redim (long s, long low, long high)
    option type = explicit, constant type = integer, &
        size = integer long, size = real double
    external long function bas$rt_dim_bounds (long by value, long by value, long by value)
    declare long r
    r = bas$rt_dim_bounds (loc (s), low, high)
end function r ! redim

I'll just point out, which I failed to do in the old USENET post or the new USENET post, that you have to use a variable when using the VMS BASIC dim statement or you get a fatal runtime error. Ooops.

So use:

declare long i
i = 5
dim string s(1 to i) ! Notice that last thing is the variable, i
redim (s, 3, 10)

If you had said:

dim string s(1 to 5) ! Notice that last thing is a constant, 5
redim (s, 3, 10)

You'd have gotten the following error:

%BAS-F-PROLOSSOR, Internal error in VAX BASIC Run-Time Library.  Please submit an SPR
-BAS-I-FROFUN, In external function ALT_REDIM
-BAS-I-FROMOD, In module Y
%TRACE-F-TRACEBACK, symbolic stack dump follows
module name     routine name                     line       rel PC    abs PC

                                                           0004B2AA  0004B2AA
----- above condition handler called with exception 001A833C:
%BAS-F-PROLOSSOR, Internal error in VAX BASIC Run-Time Library.  Please submit an SPR
-BAS-I-FROFUN, In external function ALT_REDIM
----- end of exception message
                                                           0004B2AA  0004B2AA
----- above condition handler called with exception 001A833C:
%BAS-F-PROLOSSOR, Internal error in VAX BASIC Run-Time Library.  Please submit an SPR
----- end of exception message
                                                           0004A352  0004A352
                                                           00054E37  00054E37
ALT_REDIM       ALT_REDIM                          43      0000002E  00000AC2
Y               Y                                  24      0000015D  0000095D

Don't actually submit an SPR, of course: you did it to yourself by using an undocumented VMS BASIC internal runtime function.

Oh, I don't have access to an Alpha these days, so I haven't tried it there, but I imagine using something named DBASIC$RT_DIM_BOUNDS instead of DBASIC$RT_DIM would likely work there.

Getting the homebrew CHICKEN Scheme sqlite3 egg to use the homebrew-installed sqlite3 include files and library files

To get the Homebrew installed CHICKEN Scheme (HBCHICKEN) to use the Homebrew installed version of sqlite3 (HBSQLITE3) — because the one supplied by Apple in macOS is obsolete — for the sqlite egg, you need to set CSC_OPTIONS properly:

$ export CSC_OPTIONS="-I/usr/local/Cellar/sqlite/3.36.0/include -L/usr/local/Cellar/sqlite/3.36.0/lib"
$ chicken-install sqlite3
building sqlite3
   /usr/local/Cellar/chicken/5.2.0/bin/csc -host -D compiling-extension -J -s -regenerate-import-libraries -setup-mode -I /Users/tkb/.cache/chicken-install/sqlite3 -C -I/Users/tkb/.cache/chicken-install/sqlite3 -O2 -d1 -L -lsqlite3 sqlite3.scm -o /Users/tkb/.cache/chicken-install/sqlite3/sqlite3.so
   /usr/local/Cellar/chicken/5.2.0/bin/csc -regenerate-import-libraries -M -setup-mode -static -I /Users/tkb/.cache/chicken-install/sqlite3 -emit-link-file /Users/tkb/.cache/chicken-install/sqlite3/sqlite3.link -host -D compiling-extension -c -unit sqlite3 -D compiling-static-extension -C -I/Users/tkb/.cache/chicken-install/sqlite3 -O2 -d1 sqlite3.scm -o /Users/tkb/.cache/chicken-install/sqlite3/sqlite3.static.o
   /usr/local/Cellar/chicken/5.2.0/bin/csc -setup-mode -s -host -I /Users/tkb/.cache/chicken-install/sqlite3 -C -I/Users/tkb/.cache/chicken-install/sqlite3 -O2 -d0 -L -lsqlite3 sqlite3.import.scm -o /Users/tkb/.cache/chicken-install/sqlite3/sqlite3.import.so
installing sqlite3

You'll probably need to adjust the version numbers in the pathnames for whatever version is installed on your computer.

define-word results using wordnik stopped working

I use define-word, a package from melpa (DWM), that looks up the definition of a word online. It uses wordnik.com by default. Recently it stopped returning definitions.

I did a little digging, and it turns out that it works when you visit the url with Chrome, but not if you just try to download it with curl, or url-retrieve in Emacs. Adding a “User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36” with curl’s -H option made it work.

curl -i -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36' http://wordnik.com/words/importunate

So I added a let in my advice for define-word that binds url-request-extra-headers to an alist with "User-Agent" as the key and "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" as the value, and it works again.

My solution looks something like this (simplified from my actual advice, which does other things too):

(defadvice define-word (around your-around-define-word activate)
  "Dynamically bind tkb-define-word-word to the word passed in."
  (let ((url-request-extra-headers
         '(("User-Agent" . "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"))))
    ad-do-it))

I opened an issue on github, suggesting it might be a good idea to add a simpler way to add a User-Agent: header around define-word--to-string’s call to url-retrieve-synchronously.

The Isle of the Plangent Mage

The Isle of the Plangent MageThe Isle of the Plangent Mage by Donn Stroud
My rating: 5 of 5 stars

This is an interesting adventure intertwining the sea, its creatures, and music. It describes a small area of coast with a village and inhabitants, a nearby island with several interesting locations, some inhabitants, and a dungeon with a good mix of monsters and interesting devices.

Another very good adventure from Necrotic Gnome.

View all my reviews on Goodreads

Old-School Essentials Classic Fantasy Rules Tome

[I actually finished reading this back on July 9, 2021, but forgot to finish this post, so it is appearing now.]

I finished reading the Old-School Essentials Classic Fantasy Rules Tome from cover to cover and I am very impressed.

As I say in my terse Goodreads review:

Old-School Essentials Classic Fantasy: Rules TomeOld-School Essentials Classic Fantasy: Rules Tome by Gavin Norman
My rating: 5 of 5 stars

Excellent restatement of the class Basic/Expert D&D (B/X D&D) rules from 1981. Exceptionally clear presentation in wording, typography, and layout. Excellent physical production quality. I liked the use of full page or 2 page spread color artwork, and the black and white art included on the other pages. Excellent range of artwork.

View all my reviews on Goodreads

To expand on this:

I've said elsewhere that I started playing with first edition AD&D. As far as I can remember, we often simplified things: I don't remember using segments, spell components, weapon speed factors, or armor class adjustments, and I'm not sure we used anything like the actual official combat sequence.[1] I never picked up the Moldvay/Cook/Marsh Basic/Expert Sets, unfortunately, since I foolishly thought “Advanced” meant better than “Basic”.

I think Old-School Essentials Classic Fantasy is an wonderful way for someone to learn the rules of classic D&D, and for running classic D&D campaigns. I wish it had been around when I started playing D&D. I'd recommend it today for anyone learning to play, or anyone who prefers the classic rules.

Last edited: 2021-09-13 17:13:50 EDT

Old-School Essentials Advanced Fantasy Referee's Tome

Old-School Essentials Advanced Fantasy Referee's TomeOld-School Essentials Advanced Fantasy Referee's Tome by Gavin Norman


This adapts the Dungeon Master rules (creating and running adventures; monsters; encounters, treasures, and magic items) of first edition AD&D to the scale and mechanics of the Moldvay/Cook/Marsh edition of Basic/Expert D&D, contrasting with Labyrinth Lord: Revised, Advanced Edition Companion, and Advanced Labyrinth Lord, which does it the other way around and adapts the B/X rules to the scale of first edition AD&D.

As is common with the other Old-School Essentials titles, this is very well organized and presented. It is interesting what was integrated from first edition AD&D and what was left out. (For instance, there is a Wand of Summoning, but no Summon Monster spells.)

I think that this is an excellent choice for someone new to D&D to learn the classic Dungeon Master rules. I wish something this clear had been available when I started playing D&D.

View all my reviews on Goodreads

Old-School Essentials Advanced Fantasy would probably be my first choice for any new D&D campaign I start, all other things being equal.

Last edited: 2021-09-11 12:41:55 EDT

Old-School Essentials Advanced Fantasy Player’s Tome

Old-School Essentials Advanced Fantasy Player’s TomeOld-School Essentials Advanced Fantasy Player’s Tome by Gavin Norman
My rating: 5 of 5 stars

This adapts the classes, races, spells, and other player facing rules of first edition AD&D to the scale and mechanics of the Moldvay/Cook/Marsh edition of Basic/Expert D&D, contrasting with Labyrinth Lord: Revised, Advanced Edition Companion, and Advanced Labyrinth Lord, which does it the other way around and adapts the B/X rules to the scale of first edition AD&D.

I must admit I miss the monk, and the two Hit Dice at first level of the Ranger from AD&D 1E, but I suppose the former is out because of the common perception that it doesn't thematically fit the pseudo-medieval setting of most D&D games, and the latter is part of adapting to the scale of B/X.

The OSE Advanced Fantasy Player's Tome is another excellent presentation of the classic rules in a well designed and sturdy hard back book. I'm impressed with the organization and clarity of the presentation. I think that this is an excellent choice for someone new to D&D to learn the classic player rules.

View all my reviews on Goodreads