Home Shark Introduction Shark Reference Guide Purchase Menu ☰

SHARK REFERENCE GUIDE & Error Codes:


Data (dbf) file types
Editing Keys
System Variables
Commands:
Expressions:
        Constants
        Operations
        Relations
Functions:
        Mathematical Functions
        General Functions
Commands:
        Redirection, Command & Field
Colors & Attributes
Date Input & Output Formats
Format Strings
Get Tables
Macros
Memo Fields
Configuration
Text Handling
Write Program Editor

Creating a Program

Programs in Shark are created as text files using the methods described in this reference manual. When Shark boots, the screen will show a "1>" prompt:

1>_

At this point, you can simply start typing with the built-in Shark Write environment:

1>use invoices
1>list
1>quit

The result will be a series of instructions, executed by Shark as each line is typed and the <Enter> key is pressed. To repeat the sequence, each line will need to be typed again.

In order that the sequence of instructions ("the program") can be repeated endlessly, the series of instructions can be assembled into a "program" and saved. To create a program named "TEST", start by typing:

1>write test_

Shark will load the Write program, and the screen will then display:

TEST.PRG                      SharkBase 2.20 WRITE
....+....1....+....2....+....3....+....4....+....5
_

The same series of instructions can be typed again in the Write program, and then SAVED:

TEST.PRG                      SharkBase 2.20 WRITE
....+....1....+....2....+....3....+....4....+....5
use invoices
list
quit
_

TEST.PRG can be saved as a stored Shark program by pressing the <End> key on your keyboard, and following the simple instructions. After that, you can run your Shark program any time you want by typing:

1>DO TEST or "DO TEST.PRG"

Data (dbf) file types

This section explains the four dBase/FoxPro/Clipper formats used by SharkBase (and the earlier choices in VP-Info):

VP-Info is a basic dBase file programming language. Its data type is limited by file size (65,535 records). SharkBase, on the other hand, is a much later language and can read and write any dBase (0 i.e.'zero', I,II,or III) data file type, of any file size.

VP-Info and Sharkbase have identical syntax so the programs written in one can be run in the other except on multi-user, multi-tasking networks which require SharkBase and NetBIOS for file locking. Otherwise, the two languages are similar.

VP-Info/Shark data file type I is the earliest dbf file type used by Ashton-Tate's first dBase release.

VP-Info/Shark data file type II is the standard dBase II file type, with a slightly improved, more reliable file header. Type II is the default dBase file type in VP-Info.

VP-Info/Shark data file type III is similar to to dBase III, now used by FoxPro, Clipper, and others. Type III is still limited like the others, to 65,535 records per file

Shark data file type 0 can read/write all the other data types, but defaults to Type 0 which can handle data-bases of infinite number of files and up to 500 fields. Type 0 has a bigger file structure, but this is not a problem for newer computers. Useful for doing census-size projects!

There is more information in Shark Commands under "CREATE".

EDITING KEYS

Use these editing keys to edit field contents during APPEND, EDIT, and BROWSE. Except as noted, these commands work identically with the above commands:

Moving the Cursor

     Within a field:  Left arrow or Ctrl-S    (one character left)
                      Right arrow or Ctrl-D   (one character right)
                      Ctrl-Left arrow         (to beginning of field)
                      Ctrl-Right arrow        (to end of field)
     Between Fields:  Up arrow or Ctrl-E      (to previous field)
                      Down arrow or Ctrl-X    (to next field)
                      ENTER                   (to next field)
     Between pages:   Ctrl-K                  (to previous page)
                      Ctrl-L                  (to next page)
     Between records: PgUp or Ctrl-R          (to previous record-EDIT/BROWSE)
                      PgDn or Ctrl-C          (to next record)

Entering and Editing Data


                      INS or Ctrl-V           (toggles insert/overwrite modes)
                      DEL or Ctrl-G           (deletes character at cursor)
                      BACKSPACE or Ctrl-H     (deletes character to the left)
                      Ctrl-Y                  (deletes to end of the field)

Saving and Ending

                      END or Ctrl-W           (save changes and end)
                      Ctrl-Q                  (cancel changes to this record)

Other keys

					  
                      Ctrl-U                  (toggles deleted flag status)
                      Ctrl-HOME               (move to top of file)
                      Ctrl-END                (move to end of file)
                      Ctrl-PgDn               (append a new record)
                      Alt-E                   (skips backward in file as many
                                              records as can be displayed in
                                              current window - BROWSE)
                      Alt-X                   (skips forward in file as many
                                              records as can be displayed in
                                              current window - BROWSE)

FORMAT STRINGS

Format strings determine how numbers and strings are displayed. Shark information can be formatted at any time results are being displayed.

Format strings are used in the PICTURE clause of @...GET, in the USING clause of @...SAY, in the format lines in a TEXT block, in the REPORT keyword PICTURE, in the PIC() function, and in the system variable :PICTURE.

Format strings don't affect how Shark stores information; only how it is entered, displayed, or printed. Format strings are made up of format characters and background characters. In most cases (except TEXT and PICTURE in a report form), format strings are enclosed in quotes.

Format characters work as placeholders for displayed data and as "masks" to limit the kind of data that can be entered. There are separate format characters numbers and strings (listed in the next two help screens).

Background characters are primarily decorative, added to make data easier to read. They include all characters (including spaces) not listed in the format character tables. Background characters are displayed exactly as they appear in the format clause, but are not stored as data.

NUMERIC FORMATS

These are the format characters for numbers: 9 -- Displays or permits entry of any digit (0-9), the minus sign (-), or a decimal point (.). $ -- Displays any digit. The leading digit of a value is preceded by a dollar sign (e.g., 182.34 is displayed as $182.34). comma (,) -- Determines placement of commas in a displayed number. period (.) -- Determines placement of the decimal point in a display or input number.

Any other character in a numeric format clause is a background character and is displayed "as is". Here are some display examples (invalid for input):

   Number     Format         Display      Effect
   1123.89    "9,999.99"     1,123.89     Commas added
   100.89     "$9,999.99"    $  100.89    Fixed dollar sign
   100.89     "$$$$$$.99"    $100.89      Floating dollar sign

Rule: Do not use formats for numeric field input; formatting is for displaying variables.

STRING FORMATS

These are the format characters for strings:

  X or x -- Any typed character.
  A or a -- Any letter, upper- or lowercase.
  9 -- Any digit or letter.

All other characters are regarded as background characters: they are depicted literally when displayed and ignored upon input.

Format case when accepting input:

  ! -- Any character, but converts and displays lowercase input as uppercase.

Example:

x="brown dog"
? x
brown dog
? !(x)
BROWN DOG

GET TABLES

A screen can be setup to collect (i.e. "GET") several input variables at one time. The inputs can be edited individually before saving the entire lot at one time. The input variables are organized in an internal TABLE called a GET TABLE.

To set up a Get Table, use the @...GET command or the input macros (@ and %) of a TEXT block to set up the layout of an input screen. These commands specify how the input screen will be "painted" and to which fields or memory variables the entries are to be stored. These variables are called Get Variables. A Get Table can contain as many as 64 variables.

A very brief example:

TEXT

Name @name
Address @address

ENDTEXT
READ

This example will collect your NAME & ADDRESS input and keep in memory until you SAVE.

The READ, APPEND/EDIT OFF or BROWSE OFF commands cause Shark to "activate" the Get Table, allowing the user to view and edit the values of the Get Variables. During this time the command sequences in an ON FIELD structure will execute as the user moves from one Get Variable to another.

The CLEAR GETS command erases the current Get Table definitions, as will any @...GET commands or text macros executed after the Get Table has been activated.

See also: READ, TEXT

MACROS

Macros are a method of including several operations in a single request. For example, Shark can go to a memory location, retrieve the variable stored there, and feed that variable to a FIND command:

mname="John Macintyre"
... later in the program:
find &mname
disp name,address,city

One of Shark's most powerful features is the rich variety of ways in which macros can be used. Unfortunately, some users encounter difficulties, especially in the following areas:

1. Putting a data file into use with a macro. This technique requires a data file to be put into use with the COMPILE keyword or the compiler will not "know" that a data file is open. Secondly, users of the file-as-a-vector technique must reference the file only by the name of the COMPILE file. See the sample program VECTOR.PRG for an example of these techniques.

2. Using macros in TEXT blocks. Only standard variables and fields may be used as macros in TEXT. Do not use system variables, matrix variables, or functions.

3. Using a macro in a command when what is intended is use of the variable itself. Remember: a macro used in a command always contains the name of a field or variable, and means that you intend to use the value of that field or variable in the current command instead of the macro.

4. Using macros with commands that do not allow their use. The following commands may not be used with a macro:

COMMANDS PROHIBITED IN MACROS:

@
CLOSE
CLS
COLOR
DO
DO WHILE
ERASE
FIELD
FILES...ENDFILES
GLOBAL
GOTO
HELP
LOCK
ON
PERFORM
PROCEDURE
SELECT
SET INDEX TO 
UNLOCK
VARIABLES

FIELD VARIABLES

Fields are storage places for data in data files. Fields make up each record in a data file. Each item in a record (e.g., name, address, amount) is ONE FIELD.

Fields are a special type of variable; their value reflects the content of the current record of a data file. The value changes as the record pointer moves from one record to another.

MEMORY VARIABLES

Memory variables are temporary storage places cleared when you quit Shark (unless you write them to disk with the SAVE command).

Create a memory variable by assigning a string, number, or logical value to a name of 1 to 10 characters with the = or STORE command. Memory variables' data types are Character, Numeric, or Logical. Text surrounded by quotes creates a character variable. A number with no quotes creates a numeric variable. Logical values (T,t,F,f, etc.) create logical variables.

You can use 128 memory variables at a time. Arrays, or matrix variables, (defined with the DIM command) can contain many values per individual variable. Use the LIST MEMORY command to see all currently defined memory variables.

Memory variable names are 1 to 10 characters in length, with the first character a letter; remaining characters can be letters, numbers, colons (:), or underlines (_).

These commands use memory variables:

    Command    Stores
    ---------  --------------------------------------------------
    =          Any string or value
    @...GET    User input (using READ)
    ACCEPT     String input
    AVERAGE    Average of numbers
    COUNT      No. of records
    INPUT      Any user input
    REPEAT...  Count passes in loop (with VARYING)
    SUM        Sum of numbers
    STORE      Any string or value
    WAIT TO    User input

All of the above commands except @...GET will create a memory variable if it does not already exist. Some DOS file-handling functions also create and use memory variables. These include IN(), GET(), and READ().

RELEASE clears some or all (with the ALL clause) memory variables and makes room for others. CLEAR closes all memory variables and all open data files (it's a combination of RELEASE ALL and CLOSE ALL).

RELEASE ALL is automatically invoked when you use CHAIN to call a new command file from within another. Transfer memory variables from one command file to another, chained command file, use the GLOBAL command.

SAVE TO saves the current memory variables and their current values to a disk file (default extension MEM).

RESTORE recalls memory variables stored in a specified memory variable file.

PRECEDENCE

In an expression such as

2+3*4

Shark has to decide whether to perform the + first (result: 20) or the * first (result: 23). The Rules of Precedence decide such questions. Functions have the highest precedence.

Arithmetic operations have the second highest precedence; among themselves:

*, / (multiply & divide)

then

+, - (add & subtract)

Relations are next; among themselves they all have the same precedence. Logical operations come last; among themselves:

.NOT.

then

.AND., .OR.

When two or more of the above have the same precedence, they are performed from left to right.

The parentheses: ( and ) have higher precedence than functions, operations, or relations. Thus you can set the precedence explicitly using parentheses.

This means that you do not have to get involved in familiarizing yourself with the Rules of Precedence. If you want THE "+" operation first, write

(2+3)*4

If you want a "*" performed first, write:

2+(3*4)

The parentheses tell Shark how you want the operations performed. Since Shark throws away the parentheses when the expression is compiled, you will gain readability by using parentheses - and lose nothing.

REPORT KEYWORDS

Keywords that take no arguments are described under REPORT command.

Others:

FIELDS Keyword
FILE Keyword
HEADING Keyword
INDEX Keyword
LENGTH Keyword
MESSAGE Keyword
PICTURE Keyword
RELATION Keyword
SELECT Keyword
SETUP Keyword
SPOOL Keyword
SUBTOTAL Keyword
TITLE Keyword

FIELDS KEYWORD

FIELDS - <exp1>,<exp2>,...

This is the expression list; these expressions fill the columns of the report. Often, these expressions are just field names, though they may be arbitrary expression including fields (from various data files), variables, and constants.

If all the expressions do not fit on one line, then leave a comma at the end of the line and continue on the next line.

FILE KEYWORD

FILE - <data file> [INDEX <index file>]

This keyword opens the data file (as file 1, if there was a file open as file 1, it is first closed) and, optionally, the index file.

This keyword may occur a number of times. The second time it opens file 2, then file 3, and so on. Since the reporting is done on the first data file opened by FILE, more than one file should be opened only if relations are used.

If there is no FILE line, REPORT uses the current data file. If none is open, an error message (usually: 2. Variable not found.) is given.

HEADING KEYWORD

HEADING - string1,string2,...

These are the column headings for each expression in FIELDS line. Separate the strings with commas. The spacing of each column is done by the program based on the largest of the following: the length of the heading, the width of the field, and the picture clause in the PICTURE line. Blanks on the left and on the right of a heading are counted in the width.

To move a column to the right, put spaces in front of the column heading. To make a column wider, put spaces at the end of the column heading. To move the column heading of a numeric field to the left, put spaces at the end of the column heading.

If no heading is required for a column, it may be omitted, but its comma is required if any later columns are to have a heading; no trailing commas are permitted, since they would be understood as continuation characters merging the next keyword to the HEADING line..

If the strings in the HEADING line do not fit on one line, then leave a comma at the end of the line and continue on the next line. Do not break a heading with a comma.

Multi-line headings. In the HEADING line, a semicolon (;) breaks the heading into more than one line. At most three lines are permitted.

For instance,

HEADING - Last Name;=========,First Name;==========,Department;==========,Salary;======

produces the headings:

Last Name       First Name Department         Salary
=========       ========== ==========         ======

Note the use of the comma (,) as a continuation character.

INDEX KEYWORD

INDEX - <exp> TO <index file name> [FOR <cond>]

This keyword will index the last data file opened with the FILE keyword on the expression <exp> to the specified index file. If this is only a temporary index, then you should specify a name such as TEMP. A condition can be specified to limit the index to only those records matching the condition; this is almost always faster than using SELECT or a FOR clause on the REPORT command. (Note: It is faster to index a file using the INDEX ON command outside REPORT, whether a condition is specified or not.)

Example:

FILE - inventry
INDEX - inven:no TO temp1 FOR type='G'
FILE - supplier
INDEX - suppl:code TO temp2

opens up the data files: INVENTRY as file 1 and SUPPLIER as file 2, and indexes both, limiting the primary index and the report to those for which type='G'.

LENGTH KEYWORD

LENGTH - <num exp>

This sets the number of printed lines per page. For instance,

LENGTH - 40

will set the page length at 40.

MESSAGE KEYWORD

MESSAGE - <str exp>

This keyword introduces the message to be displayed on the report lines at the start of a subtotaled group; e.g., 'Salesman - '+salesm.

When two levels of subtotaling are specified, the message for the outside level appears as a header; the message of the inside level appears with the sub-subtotal. String1 is printed from the start of the line. Make sure that there is enough room for string1 before the start of the first totaled column.

For instance, if the file is indexed on salesman+style, then salesman is exp2, the outside level, and salesman+style is exp1, the inside level. Thus one obtains a sales report grouped by salesman (outside level), and within salesman by style (inside level):

SUBTOTAL - salesman+style
MESSAGE - 'Style '+style
SUBTOTAL - salesman
MESSAGE - 'Salesman '+salesman

Note that the inside subtotal expression in on salesman+style instead of by style alone; this is done because the last record for one salesman might be the same as the first record for the next salesman, thus giving confusing results. Both subtotal expressions should be some leftmost part of the index expression, with the inside expression longer than the outside expression.

PICTURE KEYWORD

PICTURE - <format list>

The PICTURE keyword is used to indicate which expressions (in the FIELDS line) are to be totaled. The PICTURE line also shows how the expressions and totals (and subtotals) are to be displayed.

A format is some 9s and, optionally, a decimal point or other special characters used in the format clause for numbers (see the command @).

Examples:

999
999999.99
9.9999
999999.99-
999999.99>

A format list is a number of formats separated by commas. Some formats may be missing, but the commas have to be there as long as formats are required to reach the last field requiring accumulation. No trailing commas are permitted, since they would be understood as continuation characters merging the next keyword to the picture line.

Negative values can be displayed in any of three ways. The default is to use a leading minus sign. It is possible to surround negative values with pointed brackets, or to use trailing minus signs as follows: Indicator for Negatives Example Value Displays None 9999999.99 -19876.87 -19876.87 Trailing minus sign 9999999.99- -19876.87 19876.87- None 9999999.99> -19876.87 <19876.87>

If a format includes a comma, that format must be enclosed in quotes.

The following will all total the fourth and the fifth columns out of the eight (or more) specified in the FIELDS line:

,'$$$,$$9.99>'

There can be no format for character fields in the PICTURE line, since no strings are carried from record lines to total lines. To format a character field, use PIC( or other functions.

RELATION KEYWORD

RELATION - <str exp> TO <file number>

This keyword sets a relation between file 1 and the file <file number>. It is equivalent to the commands:

1>USE#1 NAMES
1>USE#2 ADDRESS
1>USE#3 ACCOUNTS
1>SELECT 1 ;select NAMES file
1>SET RELATION ON <str exp> TO <file number>

Example:

RELATION - inven:no TO 2.

There can be a number of these lines. File 1 can be in relations to file 2, file 3, and so on. The relations are always between file 1 and another file. To set up chaining relations (1 to 2 to 3, for example, set up the relations in the program before executing REPORT.

SELECT KEYWORD

SELECT - <cond>

Select by condition <cond>; the same as a FOR clause in the REPORT command. If a FOR clause is used in the REPORT command, it overrides the selection of the SELECT line. If a FILTER is in effect, only records which match both the filter and the select condition are included in the report. Caution: Do not use SELECT or SET FILTER when running a report with a SUBTOTAL; create a special index with the required records instead.

Note that NODETAIL can be used only when SUBTOTAL is also used. NODETAIL modifies a report with subtotaling: only the totals and subtotals are shown. The expressions from the FIELDS line and the column headings from the HEADING line are not displayed.

SETUP KEYWORD

SETUP - <setup string>

SETUP establishes a string of control characters to be sent to the printer when printing begins. It should not be used if neither printing nor spooling is in effect.

The setup string is a list of character descriptors, separated by commas. Each descriptor may be a number (the ASCII value of a character), a hex number followed by an "h" (the hex value of a character, or any alpha character.

Example:

SETUP - 27,W,1Bh,41h,3h

SPOOL KEYWORD

SPOOL - <file name>

This is an alternative to the PRINT keyword and diverts printed output to a file. It sends the report to the file <file name> (default extension TXT).

SPOOL EXAMPLE.TXT; "txt" is default and not needed
SET PRINT ON
 . . .
SET PRINT OFF
SPOOL; end spooling of output and return to program

Output can be sent to a stored file name:

INVNUM=INVNO5+".INV"
SPOOL &INVNUM
 . . . 

Output can be sent to a specified folder:

INVNUM=\INVOICES\INVNO5+".INV"
SPOOL &INVNUM
 . . . 
The SPOOL command assumes that printed output is SPOOLED to a file instead of being sent to a printer port. Therefore the SPOOL instruction is sent first:
SPOOL EXAMPLE.TXT; the intention is to SPOOL the subsequent output
SET PRINT ON
?"Some printed text output"
SET PRINT OFF
SPOOL

Spool a report if you want to pretty it up with your word processor, or include it in a document, or print it later. The Shark command SPOOL filename TO PRN or the operating system command PRINT can later print the report in the background mode from this file.

Note that if <file name> already exists, the report will be added at its end; it will not be overwritten. (Do not confuse the SPOOL keyword with the SPOOL command, which does overwrite existing files.)

Check your Shark directory after SPOOLing output; output will normally be directed according to your preferences in the FILES/ENDFILES instruction in SHARKNET.CNF configuration file.
NOTE: when running Shark under a DOS emulator, the location of output can end up in C:/SHARK directory depending on how your drives were mounted at boot time. For example, DOSbox-X sets the drive locations in this manner:

mount c c:\shark\

vDOS sets the drive as follows:

use c c:\shark\

In this example, if SHARKNET.CNF contains a FILES statement "*.DTA,C:\DTA", the \DTA folder will actually be "C:\SHARK\DTA\" since "C:\SHARK\" was mounted as the "C" drive. A little experimentation will show where the files are written.

SUBTOTAL KEYWORD

SUBTOTAL - <exp>

This keyword causes subtotals to be printed when the expression <exp> changes. Subtotaling is done only for numeric expressions that are specified in the PICTURE line.

Two levels of subtotaling - If there are two SUBTOTAL lines:

SUBTOTAL - <exp1>              "inside level"
MESSAGE - string1              message for the "inside level", footer
SUBTOTAL - <exp2>              "outside level"
MESSAGE - string2              message for the "outside level", header

two levels of subtotaling is done. <exp1> is the "inside" level (the sub- subtotal) and <exp2> is the "outside" level (the grand subtotal).

Subtotaling produces erratic result if the data file is not sorted or indexed in a way to group all the items with the same <exp> in one group. The command REPORT works whether or not this is the case.

TITLE KEYWORD

TITLE - string/<str exp>

This keyword is followed by the title of the report; the title appears centered as the third line of the report. If no title is specified in the text file, then the string in the system variable :TITLE (if any) is used for the title.

If a <str exp> is used, it will be evaluated, and used as the title. If an invalid expression is used, it will be printed as a literal.

Shark looks at the TITLE line; what appears to the right of the hyphen is evaluated as an expression. If it is valid, then it is used as an expression. If it is not, then it is printed "as is".

So to get Annual Report as the title, simply use the line

TITLE - Annual Report (No quotation marks are needed)

*The TITLE keyword may be used twice:

TITLE - string1
TITLE - string2

Then the title is in two lines, both centered.

If ASOF is a variable containing the date of the last accounts-receivable aging in the standard format, then

TITLE - 'Accounts receivable as of '+DATE(FULL,asof) 

will display:

Accounts receivable as of Thursday, September 19, 1998

MEMO FIELDS

Memo fields may be specified in the structure of any data file of any type. This may be done in either CREATE or MODIFY. The field width is automatically 10 characters, but what you see when the field is displayed or edited is either "memo" if the memo has been attached to the record, or "MEMO" if a memo is present.

All memos associated with a data file are stored in a file of the same name, but with a DBT extension (standing for data base text).

Since memo fields were originated in dBASE III, many database programs still use its standard format, which is not compatible with dBASE IV. Shark handles either format when a DBT file is created externally, but all DBT files created by Shark itself use the same format as dBASE IV version 1.1. This format has the advantage of reusing space that becomes available inside the DBT file, in much the same way as Shark's libraries have always done; the original dBase memo files grew endlessly.

1. Writing & Editing Memos. Memos may be written and edited in two ways:

WITH THE WRITE COMMAND:

Whenever a data file with one or more memo fields is open, you may create or edit a memo attached to any memo field in the current record by entering WRITE with the name of the field, preceded with the letter M and a period. For example, WRITE M.COMMENT will open the memo associated with the field COMMENT and allow you to edit it. If it does not already exist, it will be created.

INSIDE FULL-SCREEN EDITING

You are in full-screen editing whenever you are executing READ, EDIT, BROWSE or APPEND commands. If a memo field is on the screen, you may move your cursor to the memo field and press Alt-W to enter WRITE in read/write mode, or Alt-R to enter WRITE in read-only mode (no changes are saved). Again, if no memo already exists, it will be created.

Memos may be copied to or from DOS files and library entries inside WRITE. For example, to write M.COMMENT out to disk, merely change its name before storing it for a valid DOS name, such as COMMENT.DAT.

2. Displaying Memos.

Memos are displayed with the TEXT command. Just as you can display a DOS file or library entry by naming it after the TEXT command

Examples:

TEXT comment.dat or TEXT .123), you may name a memo field using the same "M." convention used by WRITE (example: TEXT m.comment).

TEXT's margins and width are controlled by the SET MARGIN and SET WIDTH commands. When writing to the screen, positioning may also be controlled by setting a WINDOW, with or without a border.

Be aware when printing to the screen that TEXT stops the display when it reaches the last line of the window, or of the current screen if no window is in effect. It waits for a keystroke before proceeding, but no prompt is displayed. Pressing <Esc> is not recommended.

Example programs:

1. Using a DO WHILE loop to control movement between records, memo fields are successively displayed:

USE memodemo                   ;a data file with memo fields
WINDOW                         ;these two lines initialize the screen
CLS
DO WHILE t                     ;do endlessly, or until  is pressed
   WINDOW 1,2,9,77             ;single-line window in top half of screen
   TEXT
   NOTE_NUM #NOTE_NUM
   NOTE_NOTE #NOTE_NOTE
   press a key:
     - (minus) for previous memo
      to exit
     any other key for next memo
   ENDTEXT
   WINDOW 12,2,23,77           ;window over botton half to display text
   TEXT m.note
   dummy=inkey()               ;wait for a keystroke
   IF dummy=asc('-')           ;compare to minus sign...if it is, skip back
      IF #>1                   ;skip -1 only if we're past top of file
         SKIP -1
      ENDIF
   ELSE
      SKIP                     ;otherwise, skip forward
   ENDIF
ENDDO

2. Use EDIT OFF with an ON FIELD structure to control display of memo fields and allow memos to be created and edited.

USE memodemo                    ;same file as in previous example
SET text on                     ;we want non-editable display to update
recnum=#                        ;variable to show record number
WINDOW                          ;initialize screen
CLS
WINDOW 2,2,9,77                 ;window for top half of screen
TEXT
.. recnum,9999
                                            Record #recnum

         NOTE_NUM.... @NOTE_NUM
    Use the standard EDIT keys, including PgUp and PgDn between records.
    To edit MEMO, place cursor in this field and press Alt-W: @note

         NOTE_NOTE... @NOTE_NOTE
ENDTEXT
SCREEN 1,2                      ;save screen as it is to screen 2
ON FIELD                        ;set up ON FIELD
FIELD 0                         ;on entry to record...
   recnum=#                     ;get current record number
   SCREEN 2,1                   ;restore original screen and window
   WINDOW 12,2,23,77            ;new screen to put TEXT into
   TEXT m.note
FIELD note                      ;when leaving memo field
   WINDOW 12,2,23,77            ;display memo again to ensure changes shown
   TEXT m.note
ENDON
EDIT off                        ;edit the records
WINDOW                          ;cancel the window
CLS                             ;erase the screen

CONFIGURATION

SHARK.SET file:

Shark was designed to run older DOS-type environments. Running Shark in a modern DOS-emulator may not require DOS-type memory allocation management. Be that as it may, Shark's memory space on older MS-DOS, DR-DOS, or PC-MOS machines is managed by a SET file:

SHARK.SET or SHARKNET.SET  ("SHARK" refers to the single-user version; "SHARKNET" to the multi-user version)

The SHARK.SET file is a text file located in the Shark folder.

SHARK.SET file is required for older DOS environments. Some later environments such as DR-DOS, PC-MOS, dbDOS, and vDOS are able to manage file memory internally and some settings (e.g. BINSPACE,FILES,HANDLES,FIELDS) of SHARK.SET/SHARKNET.SET FILE may not be required.

Assembly-language programs may be copied from disk into a special area of memory called BINSPACE, which is set aside with the BINSPACE=command in your SHARK.SET or SHARKNET.SET file. See BINSPACE

Allocate memory in the SHARK.SET or SHARKNET.SET file using the BINSPACE=n where <n> is the number of 1K blocks to allocate to the BINSPACE in memory. The limit for <n> is 32. Example: BINSPACE=32 allocates 32K.

Sufficient space to load binary files must be provided with the BINSPACE=command in the SHARK.SET or SHARKNET.SET file; and no more than eight binary files may be loaded at any one time. BIN files can be removed from memory with the BINUNLOAD command.

Caution: Be sure you have set FIELDS= in the SHARK.SET or SHARKNET.SET file to a number large enough to accommodate all the fields in all the data files you will ever have open at one time, plus the largest number of fields in any of these files. The limits for FIELDS= are 128 and 1000, with a default of 320 files. See FIELDS=. Later environments such as DR-DOS, PC-MOS, dbDOS, and vDOS are able to manage file memory internally and a FIELDS= statement may not be required.

Reserving memory space for a single field requires 16 bytes. Therefore, increasing the number of fields requested reduces the memory space available for your program.

Shark has a default maximum of 20 files, unless the operating system allows more than 20 open files (DOS 3.3 and above) and that a FILES=statement is present in the CONFIG.SYS file specifying at least <n> files. Later environments such as DR-DOS, PC-MOS, and vDOS are able to manage file memory internally and a FILES statement may not be required.

As a practical matter, <n> should be in the range 25 to 60; the default and minimum is 20. Loading more files reduces the maximum size of programs and reduces speed of such memory-intensive commands as INDEX.

The command MEMORY= in the SHARK.SET file allocates a specific amount of high memory for use of Shark rather than the default of 128K.

The number of blocks can be as little as 32, although Shark can be expected to be sluggish in performance at that level, and there will be little space available for matrixes and background screens.

NOEFFECTS

This command in the SHARK.SET file suppresses the special screen and sound effects used for the sign-on screen, as well as for the SCREEN, SOUND, and RING commands. NOEFFECTS must be used in network installations to avoid unwanted effects appearing on remote workstations!

Example of contents of SHARK.SET file:

BINSPACE=32
NOEFFECTS
FIELDS=480

SHARK.CNF file:

Shark's configuration on your computer is managed by a CONFIGURATION FILE.

SHARK.CNF or SHARKNET.CNF ("SHARK" refers to the single-user version; "SHARKNET" to the multi-user version)

The SHARK.CNF file is a text file located in the Shark folder.

NOTE: The file extension "cnf" is a Windows config file extension and some Windows editors will not see or open a file with this extension. On a Windows PC, the file may appear in the file listing NOT as "SHARKNET.CNF" but simply as "SHARKNET". You may have to use a programmer's editor to access this file. This doesn't affect the operation of Shark within a DOS emulator like DOSbox-X or vDos.

Example:

SET NETWORK ON                      turns NETBIOS instructions on for multi-user version of Shark
SET APRI OFF                        undocumented instruction for technicians to permit escaping to Shark prompt only
                                    if APRI is set ON, Shark escapes to DOS prompt, enabling direct access to files   
SET DATE TO 'YYYYMMDD'              sets global calendar date sequence format, e.g. "20190814"
CLS                                 clears screen on sign-on
:USER=99                            User number identifies each local workstation
:color=31                           default color = blue with white text
:RETRY=15000                        on file lock, default setting tries to open file for 15000 times until
                                    admitting defeat with an error message. This example tries for about 1 minute.
:UNDOC=PIC(DATE(8),"XXXX.XX.XX")    store today's global formatted calender date in this location
:TITLE='DEBUG=Y'                    store global debug flag in this location

FILES instructions can be placed here:

FILES                               
*.TXT,C:\SHARK\TXT (sub-folder)     
*.LOC,C:\SHARK\LOC (sub-folder)    
*.MEM,C:\SHARK\MEM (sub-folder)     
*.FRM,C:\SHARK\FRM (sub-folder)     
*.GET,C:\SHARK\GET (sub-folder)                                    
*.SCR,C:\SHARK\SCR (sub-folder)
*.STO,C:\SHARK\STO (sub-folder)
*.PRG,C:\PRG (shared parallel folder)
*.DTA,C:\DTA (shared parallel folder)
*.MNU,C:\CPL (shared parallel folder)
*.CPL,C:\CPL (shared parallel folder)
*.DBF,C:\DBF (shared parallel folder)
*.NDX,C:\NDX (shared parallel folder)
ENDFILES                                                                         

Note DBF files are in a common parallel shared folder while LOC,MEM,GET,SCR,STO files are local to each workstation. Shark won't direct working files like LOC,MEM,GET to a shared parallel folder, but will send working files to a local sub-folder as shown below(be sure to set up the sub-folders beforehand).

SET files instructions can be placed here:

SET EXECUTE OFF                     ON FIELD is not executed at one time; it's executed line by line
SET END OFF


:F1=" "                             Contents of function keys f1 - f10 are set here.  Note that
:F2=" "                             Function Keys cannot be pre-loaded with instructions.  They 
:F3=" "                             must be set as shown with a 1-character space.  This reserves
:F4=" "                             the location so that Function keys can  be programmed with a  
:F5=" "                             memory variable in this manner:":F1=MEMVAR" where "MEMVAR" is 
:F6=" "                             a memory variable. Thus Function keys in Sharkbase are
:F7=" "                             useful - but transient!
:F8=" "                     
:F9=" "                             
:F10=" "                            

NOTE: For curious developers, the functions keys are hybrid browser/hardware tools (i.e. keyboard based), not DOS tools, and don't always work as expected on some PCs! As of this date, Function Keys work as described when running Shark within the state-of-the-art emulators (e.g. vDos & DOSbox-X). Since emulators are always being continuously developed in scientific circles, these results can evolve for the better at any time. Related trivia: Shark was written for 10 function keys, and keyboards have can have 6 to 12 function keys, plus "shifted" functions. See the Configuration section for more on Function Keys.

In Firefox on Linux, at least six or seven of the function keys are reserved for use by the browser:

    F1 (Help),
    F3 (Search),
    F5 (Refresh),
    F6 (focus address bar),
    F7 (caret browsing mode),
    F11 (full screen mode), and
    F12 (used by several add-ons, including Firebug)

The worst part is that different browsers on different operating systems use different keys for different things. Normally, Shark can t5olerate some keyboard stuffing with the Function Keys, but otherwise doesn't pay much attention to Function keys.

Sample SHARKNET.CNF file:

SET NETWORK ON
SET APRI OFF
SET DATE TO 'YYYYMMDD'
CLS
:USER=99
:COLOR=31
:RETRY=15000
:DATE=DATE(8)
:COMPANY="ACME INDUSTRIES INC" 
:PICTURE="9999999.99"
:UNDOC=PIC(DATE(8),"XXXX.XX.XX")
:TITLE=" "

FILES
*.TXT,C:\TXT\
*.BAK,C:\BAK\
*.MSG,C:\MSG\
*.ERR,C:\ERR\
*.LOC,C:\LOC\
*.MEM,C:\MEM\
*.SCR,C:\SCR\
*.PRG,C:\PRG\
*.FRM,C:\FRM\
*.DTA,C:\DTA\
*.CPL,C:\CPL\
*.DBF,C:\DBF\
*.NDX,C:\NDX\
ENDFILES

SET EXECUTE OFF
SET END OFF
 

Some CNF locations can store quite a bit of global information. Subsets can be accessed using the $( substring function. The size limit of each global variable is about 256 bytes.

Example from above sample CNF file:

? :UNDOC
2014.03.27
? $(:UNDOC,1 4)
2014   

System Variables (Global Variables)


:USER=99
:COLOR=31
:RETRY=15000
:DATE=DATE(8)
:UNDOC=PIC(DATE(8),"XXXX.XX.XX")
:TITLE='DEBUG=N'
:TIME="22:53:43"                           
:DATE=DATE(8)
:VERSION="710 "                               
:SERIAL="710020194A"                         
:COMPANY="ABC Inc                           " 
:PICTURE="9999999.99"                         
:TITLE=" "                                                         
:KEY="0"                                  
:AVAIL="0"                                  
:FIELD="0"                                  
:ERROR="0"                                  
:MESSAGE="2. Variable not found."                                                                                      
:DIR="C:\"                                
:NEAR="0"                                  
:ROLL="ROLL.$$R"                           

See also the command LIST SYSTEM

These system variables are built into Shark. They include the contents of the function keys (F1 - F10), the date and time (from DOS), various default values, and other information. System variables may be changed by the user, but they're not removed by the CLEAR command. For example, the :DATE and :TIME variables will always be available to running programs.

A system variable is distinguished from other variables by having a colon as the first character of its name -- e.g., :TIME.

To see the contents of a particular system variable, give the ? command followed by the system variable name:

? :COMPANY

To see all system variables, type:

LIST SYSTEM

Like memory variables, the values of most system variables, including the function keys, are changeable using the = (equal sign) or STORE...TO commands.

Each of the function keys contains a pre-defined string (shown with LIST SYSTEM). Using the = command, you can redefine any function key (e.g., :F2="SET DEFAULT TO b:" assigns the string "SET DEFAULT TO b:" to F2). Function keys can be defined as commands or as frequently repeated entries for use in full-screen editing.

A semicolon (;) in a function key definition indicates a press of the ENTER key. A function key definition that contains a semicolon will be executed when you press the function key.

A quick way to redefine function keys is to type the string to be stored, then press ALT key along with the function key to store the string to that key. To capture a line of text to move in WRITE, place the cursor at the beginning of the line, then press ALT and the function key to store the text; then move to the new position and press the function key to insert it.

These processes redefine function keys only during the current Shark session.

To save changes to function keys or other system variables enter the new definitions in the CNF configuration file.

In addition to the function keys, there are a number of other system variables which can be viewed by typing LIST SYSTEM:

:AVAIL contains the number of the next available volume in the current library
     file.  See SET LIBRARY command.

:COLOR The current value of the color attribute written into the screen memory
     for every byte of screen display; set with SET COLOR TO or :COLOR=
     command.

:COMPANY contains the company name.  This is used by the REPORT command.  (It
     can be changed to the name of the company you are reporting on.)

:DATE. Contains a string of the date as formatted the last time the DATE()
     function was used.  DATE(Full) is used with the system date when
     Shark is started up.

:DIR. The user's current drive letter and directory.

:ERROR. The current value of Shark's internal error variable. Shows
     why execution of the last command failed.

:FIELD contains the number of the Get Table entry currently being processed.
     See ON FIELD command.

:KEY is a numeric variable.  It contains the number generated by the last
     keystroke used to exit a process or execute a command.  See the function
     INKEY( for the definition of this number.  :KEY is used in Shark
     programming to find out which key was pressed to abort or interrupt a
     procedure.  The inkey() function displays the :KEY value:
	 
	DO WHILE t
	@ 10,0 SAY "To display a key code, press any key . . ."
	? inkey()
	ENDDO
	
	or:
	
	SET FUNCTION ON
	* if <R> or <r>, <R>eturn to opening menu
	CASE :KEY=114 .or. :KEY=82
	LOOP
	* if <E> or <e>, <E>nter inventory
	CASE :KEY=101 .or. :key=69	
	CLS
	etc

:MESSAGE. The message from the MSG file associated with the error number
     contained in :ERROR

:NEAR The number of the record containing a key equal to or greater than the
     last FIND's FIND string.  See FIND command.

:PICTURE. The :PICTURE system variable is a format for numbers (see Formatting
     numbers under the @ command).  This formats the display of all numeric
     memory variables and numeric expressions.  This format can be overridden
     by a format clause in TEXT or an @ command, or with the PIC( function.

:RETRY. Controls the number of times that Shark Network Edition will attempt to connect 
	to a dbf file if the file has been opened by another user. 15,000 RETRIES will be 
	approximately 30 seconds, then Shark will signal "File Locked" and look for an escape or 
	return instruction. It has no meaning under other versions.

:SERIAL may contain the serial number.  Once Shark is loaded, you may
     use this as a variable that survives a CLEAR command such as different colored text
	 or screen formatting.

:TIME. Contains a string of the time of the last use of the TIME() function
     in the format last used by that function.  TIME(1) is used with the
     system time when Shark is started up.  When :TIME is set with STORE
     or = commands, the system time is set to the same time.

:TITLE is the default title of a report.  See the REPORT command.

:UNDOC. Unused - may be used to store formatted date or other useful data. Note that :DATE
	contains an unformatted date read from DOS.

:USER. A number between 1 and 999 assigned to each user on a network under
     Shark Network Edition.

:VERSION contains the current version number of Shark.

Note that "LIST SYSTEM" always displays the Function key contents.