home *** CD-ROM | disk | FTP | other *** search
Text File | 1987-11-10 | 121.9 KB | 3,366 lines |
- >>> "File is in use by another"
-
- The message "File is in use by another" results from an attempt to USE a
- read-only database file with single-user dBASE Administrator.
-
- To avoid this situation, use PROTECT to prevent editing of database files
- rather than making the files read-only.
-
-
- >>> 43-Line Mode Using the Enhanced Graphics Adapter
-
- Users of dBASE III PLUS who have the IBM Enhanced Graphics Adapter and
- Display will notice that this hardware is supported but not documented. If
- you enter the full-screen configuration SET at the dot prompt and select
- the Color menu, you will notice that instead of "Color" or "Monochrome,"
- "EColor25" and "EColor43" will be shown. You can toggle between the
- regular 25-line mode and the IBM Enhanced Graphic Adapter's special 43-line
- mode by pressing the Return key.
-
- Once in the 43-line mode, dBASE III uses all 43 lines of the screen in all
- display modes. This includes regular display commands such as LIST or
- DISPLAY, as well as full-screen commands such as APPEND, EDIT, BROWSE,
- @..SAY, @..GET. Unfortunately, no command in dBASE III PLUS can toggle
- modes, other than the full-screen SET command.
-
- In order to take advantage of this undocumented feature, set the switch
- settings on the IBM Enhanced Graphic Adapter should be as follows:
-
- SWITCHES
- 1 2 3 4
- Off On On Off
-
- For more information on using of the IBM Enhanced Graphic Adapter, consult
- the manual provided with the card.
-
-
- >>> @...GET...PICTURE
-
- BY J. MIKE HEDBLOM
-
- Issuing @...GET on logical fields produces different displays when READ is
- executed, depending on the presence of "@L" PICTURE function and the
- version of dBASE III PLUS. If a logical field has an assigned value,
- @...GET displays that value. However, if the field has not been assigned
- a value, in version 1.0, @...GET displays a "?" and @...GET...PICTURE "@L"
- displays "T." Version 1.1 displays a "?" when the PICTURE function is
- present, but shows a blank if the PICTURE function is not used.
-
-
- >>> @...SAY & Overstriking
-
- It is possible to produce overstriking on a printer with the @...SAY
- command in dBASE III PLUS. The documentation warns that, after executing
- SET DEVICE TO PRINT, an @...SAY command with row or column coordinates less
- than the coordinates of the previous @...SAY will cause a page eject. This
- is true of row coordinates. However, it is possible to @...SAY at a lesser
- column coordinate in the same row or even at the same coordinate. For
- example, the following commands produce underlined output.
-
- SET DEVICE TO PRINT
- @ 10,20 SAY "UNDERLINE"
- @ 10,20 SAY "_________"
- SET DEVICE TO SCREEN
-
-
-
- >>> @...SAY
-
- When sending control codes to the printer with @...SAY, control codes are
- counted as characters by dBASE III PLUS although these characters are not
- printed by the printer. This causes the print position coordinates for
- following @...SAY commands to the same line to be offset left by the number
- of control code characters sent to the printer. For instance, if one
- control character is sent to row 5, the column coordinate on row 5 will be
- less by one.
-
- @ 5,0 SAY CHR(15)
- @ 5,12 SAY "Test"
-
- will print "Test" starting at column 11. The control codes for the
- following example are for the C-Itoh 8510A printer.
-
- SET DEVICE TO PRINT
- @ 5,5 SAY CHR(27) + '!' + 'Test' + CHR(27) + '"'
- ^------^-----------------^------^
- |--- Each character takes one space.
- This prints the word "Test" in boldface and sets
- the type back to normal.
-
- @ 5,50 SAY "Test" <------- Prints at column 46.
- @ 6,50 SAY "Test" <------- Prints at column 50.
-
-
-
-
- >>> @..SAY/GET
-
- With SET SCOREBOARD ON, an @...SAY to line 0 in a format file will not
- write in the scoreboard area, but an @...GET will read from this area.
- This is consistent with previous versions of dBASE III. However, the
- larger size of the SCOREBOARD area in dBASE III PLUS increases the
- likelihood of conflict between SET SCOREBOARD ON and @...SAY...GET.
-
-
- >>> @...PICTURE
-
- When you use @...PICTURE with negative numbers, you need a template
- position for the minus sign. If you don't have one and the number fills
- the number of template digits you define an overflow will display.
- Including the "@(" PICTURE function to surround negative values with
- parentheses also requires a position for the minus sign, although the
- symbol is not used. The length of the template must be at least the length
- of the number plus one for the sign. For example,
-
- mvar = -100
- @ 5,20 SAY mvar PICTURE "999"
- @ 6,20 SAY mvar PICTURE "@( 999"
-
- each display an overflow. However,
-
- @ 5,20 SAY mvar PICTURE "9999"
- @ 6,20 SAY mvar PICTURE "@( 9999"
-
- correctly display, "-100" and "(100)," respectively.
-
-
- >>> ACCEPT/WAIT
-
- When a function key is SET to a literal character string, the ACCEPT TO
- command accepts the assigned string, while WAIT TO does not. Instead, the
- WAIT command takes the decimal ASCII representation of the function key
- itself. For example,
-
- SET FUNCTION 10 TO 'A'
- WAIT TO mem
- ACCEPT TO mem1
-
- If F10 is pressed in response to the WAIT and ACCEPT commands, DISPLAY
- MEMORY shows a graphic character representing the ASCII code of the F10 key
- in mem and an "A" in mem1.
-
- For reference, here are the values stored when these keys are pressed in
- response to the WAIT command.
-
- Key Pressed Value Function
- =========== ===== ========
- F1 0 HELP
- F2 255 ASSIST
- F3 254 LIST
- F4 253 DIR
- F5 252 DISPLAY STRUCTURE
- F6 251 DISPLAY STATUS
- F7 250 DISPLAY MEMORY
- F8 249 DISPLAY
- F9 248 APPEND
- F10 247 EDIT
- SPACE 32 SPACE
- BACKSPACE 127 BACKSPACE
-
- All other keys that send nondisplay characters (including Alt,
- control keys, and shifted keypad characters) send an ASCII 0.
-
-
- >>> ACCESS DISK [dBASE III PLUS - Multi-User]
-
- Because of a disk manufacturing error in which a unique access code was not
- recorded on System Disk #1 and System Disk #1 Back-up of dBASE III PLUS,
- Ashton-Tate implemented an exchange policy for the affected products. The
- serial numbers of the affected products are 2500001 through 2533960. Copies
- of dBASE III PLUS with other serial numbers are fully functional and are
- not affected.
-
- The defect involves only local area network use. It does not affect
- functionality or data integrity of dBASE III PLUS when used in its
- stand-alone, single-user mode. The problem was created when a special
- access code that permits dBASE III PLUS to be networked with other copies
- of dBASE III PLUS was not placed on System Disk #1 and System Disk #1
- Back-up. All other disks packaged with the product are not affected.
-
-
- >>> Accessing Filenames with No Extensions
-
- In dBASE III PLUS, you can now access and create files with no extensions.
- To access or create such a file, use the double period (..) in place of the
- extension. For example, you can access an external file with no extension
- in the APPEND FROM command. Virtually all dBASE III PLUS commands that
- operate on files support this capability.
-
- The following list of command lines show a number of ways to work with
- these files.
-
- * ---Import a file with no extension.
- APPEND FROM Yourfile.. SDF
-
- * ---Export a file with no extension.
- COPY TO Yourfile.. SDF
-
- * ---Open a database file with no extension.
- USE Yourfile..
-
- * ---Rename a file with no extension.
- RENAME Yourfile.. TO Yourfile.TXT
-
- Note that DIR does not respect the (..) notation. You must instead use the
- standard wildcard notation.
-
-
- >>> APPEND FROM
-
- Beginning with the Developer's Release of dBASE III, APPEND FROM
- [DELIMITED] will import delimited files without delimiters. Formerly,
- delimited files without delimiters would be erroneously APPENDed into the
- current database file.
-
-
- >>> APPEND FROM DELIMITED
-
- APPEND FROM <Filename> DELIMITED WITH BLANK does not recognize blank fields
- and left-justifies the APPENDed data. When a blank field is APPENDed, the
- field is filled with data from the next field in the record. The data in
- the fields following the blank field are shifted into preceding fields.
- Leading blanks are removed from all APPENDed data. To illustrate,
-
-
- .LIST
- Record# Field1 Field2 Field3
- 1 March March March
- 2 April April
- 3 May May May
- 4 June June June
-
- . COPY TO Test TYPE DELIMITED WITH BLANK
- . ZAP
- . APPEND FROM Test TYPE DELIMITED WITH BLANK
- . LIST
- Record# Field1 Field2 Field3
- 1 March March March
- 2 April April
- 3 May May May
- 4 June June June
-
-
- In record 2, the data from Field3 shifted to Field2. This occurs in both
- versions 1.0 and 1.1 of dBASE III PLUS.
-
-
- >>> Applications Generator
-
- The Applications Generator does not reset the SET commands it changes to
- their original values when terminating. This means that subsequent
- operations affected by the status of any SET commmand could be compromised
- unless you reset it. Most noticeably, SET SAFETY is changed to OFF.
-
- The following is a list of the SET commands the Applications Generator
- changes and the status when you leave the Applications Generator:
-
- Command Setting
- -------------------
- BELL ON
- CONFIRM ON
- ESCAPE OFF
- FIELDS OFF
- HEADINGS OFF
- SAFETY OFF
- STATUS ON
- TALK ON
-
- To workaround this, create a command file that calls the Applications
- Generator and then resets the current status of all critical SET commands.
- When you need to run the Applications Generator, DO this command file
- instead.
-
- This occurs in both versions of dBASE III PLUS.
-
-
- >>> ASSIST/RETRIEVE
-
- On page L1-24 of the original dBASE III PLUS documentation,
- ASSIST Retrieve:List:Construct a field list is incorrectly
- documented as displaying an arrow next to selected fields. An
- arrow does briefly flash next to the selected fields but does not
- remain on screen.
-
- The documentation also states that fields can be deselected by
- pressing Return on the previously selected field. Selected fields
- are dimmed, indicating that they cannot be deselected.
-
-
- >>> ASSIST
-
- There is no way to close files from ASSIST. To close files opened in
- ASSIST, select ASSIST Set Up:Quit dBASE III, or execute a CLEAR ALL or
- appropriate CLOSE command from the dot prompt after leaving ASSIST.
-
-
- >>> ASSIST and Subdirectories
-
- If you are an ASSIST user, you may have found that you cannot change
- directories in ASSIST. The following program, Subdir.PRG, allows you to
- provide support for subdirectories by running ASSIST from a menu that
- includes choices for changing directories.
-
- Whenever you want to enter ASSIST, type DO Subdir and choose the directory
- where you want to work. When you are situated, choose the option for
- ASSIST and away you go. After you leave ASSIST, you must also quit Subdir
- by pressing Esc. Subdir then CLOSEs all the DATABASES you may have opened.
-
- If you want Subdir to come up automatically whenever you bring up dBASE III
- PLUS, add the command line
-
- COMMAND=DO Subdir;
-
- to your Config.DB file.
-
- The program operates by selecting subdirectories from the current default
- directory you boot dBASE III PLUS from. After it loads (this can take some
- time), you can move forward to all of the subdirectories under the current
- one and back. You can run ASSIST from any selected subdirectory.
-
- Subdir has, in addition, a number of small but significant features. For
- example, it displays the volume label for the current drive. It has row
- and column coordinates that may be modified to change the display location
- of the menu window. It also displays the default directory name, so you
- always know where you started.
-
- There are some limitations to be aware of:
-
- 1. Subdir only displays the first 9 subdirectories it encounters, no matter
- how many there are in the default directory.
-
- 2. It does not allow the user to navigate anywhere on the disk.
-
- 3. It does not display sub-subdirectories.
-
-
- Program Code
-
- * Program ...: Subdir.PRG
- * Author ....: Stephen Goodman and Olivier Biggerstaff
- * Date ......: April 1, 1987
- * Note(s) ...: Executes a menu that allows you to change your DOS
- * directories in association with ASSIST.
- *
- SET TALK OFF
- SET BELL OFF
- SET SAFETY OFF
- SET TITLE OFF
- CLEAR
- *
- * ---This portion creates a database file to hold the
- * ---names of the subdirectories in the current directory.
- @ 12,2 SAY "Reading directory - Please wait"
- RUN DIR > Sysdir.TXT
- SET CATALOG TO Sysdir
- SELECT 10
- COPY STRUCTURE EXTENDED TO Tempfile
- SET CATALOG TO
- SELECT 1
- USE Tempfile
- ZAP
- APPEND BLANK
- REPLACE field_name WITH "Textdata",;
- field_type WITH "C",;
- field_len WITH 80
- USE
- CREATE SYSDIR FROM Tempfile
- APPEND FROM Sysdir.TXT SDF
- DELETE FILE Tempfile.DBF
- DELETE FILE Sysdir.TXT
- DELETE FILE Sysdir.CAT
- *
- * ---The drive and volume label are saved to variables.
- GOTO 2
- drive = SUBSTR(Textdata, 18, 1) + ":"
- title = TRIM("Available Directories" + ;
- IIF(SUBSTR(Textdata, 23, 1) = " ", "", " for " + ;
- SUBSTR(Textdata, 23)))
- *
- * ---The current directory is the default.
- GOTO 3
- d_default = drive + TRIM(SUBSTR(Textdata, 18))
- *
- * ---Delete all non-subdirectory entries.
- DELETE FOR SUBSTR(Textdata, 1, 1) = ".";
- .OR. SUBSTR(Textdata, 14, 5) <> "<DIR>"
- PACK
- *
- * ---Read the database file into memory variables.
- dot = .F.
- GOTO TOP
- DO WHILE .NOT. EOF()
- datanum = LTRIM(STR(RECNO()))
- data&datanum = SUBSTR(Textdata, 1, 8)
- IF SUBSTR(Textdata, 10, 1) <> " "
- data&datanum = data&datanum + "." + SUBSTR(Textdata, 10, 3)
- dot = .T.
- ENDIF
- SKIP
- ENDDO
- *
- * ---The maximum number of subdirectories is 9.
- maximum = LTRIM(STR(MIN(9, RECCOUNT())))
- USE
- DELETE FILE Sysdir.DBF
- maxlength = LEN(d_default) + 11 + IIF(dot, 0, 4)
- maxlength = MAX(LEN(title), maxlength) + 6
- line = CHR(199) + REPLICATE(CHR(196), maxlength - 2) + CHR(182)
- default = .T.
- choice = " "
- mchoice = " "
- DO WHILE .T.
- choice = " "
- CLEAR
- row = 6
- col = 4
- *
- * ---Draw a double lined box with 2 lines in it.
- @ row - 2, col - 3 TO VAL(maximum) + 12, maxlength DOUBLE
- @ row + 1, col - 3 SAY line
- @ row - 1, col SAY title
- *
- * ---If there are no subdirectories, say so.
- IF maximum = "0"
- @ row, col SAY "None in "+d_default
- ELSE
- @ row + 5, col - 3 SAY line
- @ row, col - 1 SAY IIF(default, CHR(175), " ") + "Default is " +
- d_default
- ENDIF
- @ row + 2, col SAY "A. Run ASSIST"
- @ row + 3, col SAY "B. Go to Default"
- @ row + 4, col SAY "E. Exit"
- *
- * ---Display the subdirectory names in the box.
- datanum = "1"
- DO WHILE datanum <= maximum
- @ row + VAL(datanum) + 5, col SAY datanum + ". Directory " +
- data&datanum
- datanum = LTRIM(STR(VAL(datanum) + 1))
- ENDDO
- IF .NOT. default .AND. mchoice $ "123456789"
- @ row + VAL(mchoice) + 5, col - 1 SAY CHR(175)
- ENDIF
- @ row + VAL(datanum) + 7, col SAY "Enter selection: "
- choice = " "
- mcol = COL()
- DO WHILE .NOT. (choice $ "ABE" .OR. (choice >= "1" .AND. choice <=
- maximum))
- choice = " "
- @ row + VAL(datanum) + 7,mcol + 1 GET choice;
- PICTURE "!"
- READ
- ENDDO
- *
- * ---Change directory, run ASSIST, or exit to dBASE III PLUS.
- DO CASE
- CASE choice = "A"
- ASSIST
- CASE choice = "B"
- CLEAR
- RUN CD &d_default
- default = .T.
- CASE choice = "E"
- EXIT
- CASE choice >= "1" .AND. choice <= maximum
- mchoice = choice
- CLEAR
- d_choice = data&choice
- IF LEN(d_default) = 3
- RUN CD \&d_choice
- ELSE
- RUN CD &d_default\&d_choice
- ENDIF
- default = .F.
- ENDCASE
- ENDDO
- *
- * ---Close up and return to the default directory.
- CLEAR
- CLOSE DATABASES
- RUN CD &d_default
- SET TALK ON
- SET SAFETY ON
- SET TITLE ON
- RETURN
- * EOP Subdir.PRG
-
-
-
- >>> ASSIST
-
- In ASSIST, it is not possible to specify the .NOT. (or FALSE) of
- a logical field in a search condition. When a logical field is
- specified as the search condition, ASSIST uses .T. as the search
- condition. This is true of versions 1.0 and 1.1 of dBASE III
- PLUS.
-
-
-
- >>> ASSIST
-
- 1. In any of the submenus of the Update, Position, Retrieve, or
- Organize menus that support the building of search conditions, when
- building a condition for a date type field, non-date entries are
- accepted as an argument for the CTOD() function without an error
- message. In the Developer"s Release and earlier versions this would
- fail to locate any date field. But since the CTOD() function in dBASE
- III PLUS converts non-date entries to blank dates, searching for
- non-date entries on date fields with dBASE III PLUS will position the
- record pointer at the first blank date encountered. If there are no
- blank dates in the database file, dBASE III PLUS will not locate any
- records.
-
- 2. With versions of dBASE III greater than 1.1, it is not possible to build
- a search condition for blank spaces from ASSIST. The Developer"s
- Release would return the user to ASSIST without comment when this was
- attempted. dBASE III PLUS will attempt to execute the command.
- However, when it constructs the command line, blank spaces are
- excluded. For example, requesting ASSIST to
-
- LIST FOR <Field> = " "
-
- actually executes:
-
- LIST FOR <Field> = ""
-
-
-
- Since all conditions are true when compared to a null string, this is
- identical to:
-
- LIST ALL
-
-
- >>> BROWSE
-
- The Ctrl-Home and F10 keys behave slightly differently in BROWSE.
- Both keys call the menu bar to the screen, but only Ctrl-Home
- removes it. This is true of both versions of dBASE III PLUS.
-
-
-
- >>> BROWSE
-
- BROWSE is extremely slow paging through a database file if the
- file is indexed and the index contains many identical entries.
- The wait to move from one page to the next is better measured in
- minutes than seconds and may appear to have locked the machine.
- The amount of time necessary is proportional to the amount of
- records with identical keys in the index file. This occurs in
- both versions of dBASE III PLUS.
-
-
-
- >>> BROWSE
-
- The status bar is a part of BROWSE and cannot be removed with SET
- STATUS OFF. The state of the status bar prior to BROWSE is
- restored when BROWSE is exited.
-
-
- >>> CALL
-
- Including the memory variable alias (M->) in the WITH clause of the CALL
- command returns the error message "Not a character expression." if the data
- type of the memory variable you pass is numeric. The variable is passed
- correctly if the M-> alias is not included. Since, however, CALL...WITH
- assumes a character expression or a memory variable of any type, when you
- pass a memory variable and a field with the same name exists, dBASE III
- PLUS always passes the memory variable reference to the WITH clause.
-
- This occurs in both versions of dBASE III PLUS.
-
-
- >>> CASE
-
- When using the CASE structure to branch control within your command files,
- there are two distinct behaviors if the either the DO CASE or ENDCASE
- statements are missing from the construct.
-
- 1. If a CASE statement is not preceded by a DO CASE statement, commands
- following the CASE statement and preceding the ENDCASE statement will
- not execute. In the following example, the LIST and WAIT commands do
- not execute but the DISPLAY MEMORY statement does.
-
- DO WHILE .T.
- USE Test
- CASE
- LIST <--------|
- WAIT <--------| Commands do not execute.
- ENDCASE
- DISPLAY MEMORY <---------- Command executes.
- ENDDO
-
- 2. A CASE structure without a terminating ENDCASE will terminate execution
- of a command file and return control to the dot prompt without an error
- message when the first true CASE statement executes.
-
-
- >>> CHR(0) to Printer
-
- BY CHUCK LITZELL
-
- dBASE III PLUS is unable to send CHR(0) to the printer. Since
- dBASE uses CHR(0) internally to mark the end of strings, it
- processes right up to, but does not include, the CHR(0).
-
- This is a problem only if you need to send control codes that
- include CHR(0) to the printer. Many printers ignore the high bit
- when processing escape codes. Therefore, sending CHR(128) in
- place of CHR(0) might work because CHR(128) is the equivalent of
- CHR(0) with bit seven turned on.
-
- If CHR(128) does not produce the desired results with your
- printer, however, you can use the following DEBUG script to
- create a .BIN file that will send CHR(0) to your printer. Using a
- text editor or the dBASE MODIFY FILE command, create a text file,
- named Prnull.DBG, with the lines that follow. Note the empty line
- five lines from the bottom; it's important!
-
- N PRNULL.BIN
- A 100
- PUSH AX
- PUSH DX
- XOR DX, DX
- MOV AX, 0500
- INT 21
- POP DX
- POP AX
- RETF
-
- RCX
- C
- W
- Q
-
-
- To create Prnull.BIN, you must have access to DEBUG.COM, which
- you will find on your DOS Supplemental Program diskette. Change
- to the drive and directory in which you want to create Prnull.BIN
- and enter
-
- DEBUG < Prnull.DBG
-
- This command will create Prnull.BIN. If you don't get the DOS
- prompt rather quickly, there is an error in your DEBUG script.
- Press Return until you see a dash (DEBUG's prompt), and type Q
- and then press Return to quit DEBUG. When Prnull.BIN has been
- successfully created you can erase Prnull.DBG.
-
- Using Prnull.BIN from within dBASE III PLUS is simple. First LOAD
- Prnull. Any time you need to print a CHR(0), just CALL Prnull.
- The following example sets the form length to seven inches on an
- Epson FX-80 printer.
-
- * Set Form Length to 7 inches
- * on Epson FX-80 printer
- * (ESC C NUL 7)
- LOAD Prnull
- SET PRINT ON
- SET CONSOLE OFF
- ?? CHR(27) + "C"
- CALL Prnull
- ?? CHR(7)
- SET PRINT OFF
- SET CONSOLE ON
- RELEASE MODULE Prnull
-
-
-
- >>> CHR()
-
- CHR(138) and CHR(141), "è" and "ì" respectively, produce
- unexpected results when displayed on the screen and cause .PRG
- files containing these characters to appear corrupted when edited
- with MODIFY COMMAND. Displaying CHR(138) causes the rest of the
- characters on that line to be suppressed. CHR(141) displays
- following characters on the next line. This occurs because dBASE
- III PLUS interprets CHR(138) and CHR(141) as a linefeed and a
- carriage return, respectively.
-
- The dBASE III PLUS MODIFY COMMAND editor strips off the eighth
- data bit of all characters except CHR(141) when files are
- loaded. When CHR(138) is loaded into MODIFY COMMAND, it is
- transformed into CHR(10). Because CHR(10) is the MODIFY COMMAND
- end-of-line marker, data after the CHR(138) is not displayed.
- Executing a program file that formerly contained CHR(138)
- produces various errors when executed, depending on the command
- affected. When CHR(141) is loaded into the editor, characters
- following are displayed on the next line and the line status, on
- the right side of the screen, reveals that the line is
- continued. The CHR(141) remains in the file unless it is deleted
- or overwritten. This occurs in both versions 1.0 and 1.1 of
- dBASE III PLUS.
-
-
- >>> CLEAR
-
- CLEAR is incorrectly documented on page U5-50 of the original
- documentation as positioning the cursor in the upper left-hand
- corner of the screen at coordinates 0,0. CLEAR positions the
- cursor to the lower left-hand corner of the screen at coordinates
- 24,0 if SET STATUS is OFF, or coordinates 21,0 if SET STATUS is
- ON.
-
-
- >>> Compaq 386 DOS
-
- Running dBASE III PLUS on a Compaq 386 requires Compaq 386 DOS, not
- standard MS-DOS. To check whether a machine is running Compaq 386 DOS,
- enter the DOS MODE command at the operating system using the AUTO parameter
- (a valid parameter of Compaq 386 DOS only). For example, at the operating
- system, type
-
- C> MODE AUTO
-
- If the error message "Invalid parameter" is returned, the machine is running
- the wrong version of DOS. Running the wrong DOS may cause problems with
- system I/O.
-
-
- >>> CONFIG.DB
-
- The Command section of the original Using dBASE III PLUS manual
- says, "SET STATUS is normally ON." However, STATUS actually
- defaults to OFF unless STATUS=ON is included in the CONFIG.DB
- file. The CONFIG.DB file included with the original dBASE III
- PLUS disks contains the line STATUS=ON.
-
-
- >>> CONFIG.DB
-
- Using the keyword COMMAND in the CONFIG.DB or loading dBASE III PLUS with
- DBASE <Filename> alters the initial sign on. If this keyword is not
- included in the CONFIG.DB file and the command DBASE is used to call the
- program up, dBASE III PLUS will display the license agreement on the screen
- and immediately present the dot prompt. However, if COMMAND = <command> is
- included in CONFIG.DB or if dBASE III PLUS is invoked with a command
- filename on the DOS command line, the sign-on message will remain on the
- screen for approximately ten seconds or until Return is pressed before
- executing the command from CONFIG.DB or DOing the specified file.
-
-
- >>> COPY STRUCTURE EXTENDED
-
- Sometimes you may want to make a copy of a database file structure without
- making an exact duplicate as you would with the COPY STRUCTURE command. As
- a typical situation, you might have database file that is usable, but you
- think has a corrupted header. You would like to COPY the database file
- with a new header and not have to recreate the structure by hand. With
- COPY STRUCTURE EXTENDED, this task can be accomplished quite easily. The
- following block of code shows just exactly how.
-
- * ---Create new file.
- USE <old file>
- COPY STRUCTURE EXTENDED TO <extended file>
- CLOSE DATABASE
- CREATE <new file> FROM <extended file>
- * ---COPY old file data to new file.
- USE <new file>
- APPEND FROM <old file>
- CLOSE DATABASE
-
- 1. Description
-
- dBASE III PLUS and its predecessors, the Developer's Release, version 1.1,
- and version 1.0, do not allow you to COPY a DELIMITED file without
- delimiters and commas separating fields. Using the WITH BLANK option, you
- can get an text file without delimiters but you also get a text file
- without commas separating fields. A standard delimited file looks like
- this:
-
- "field1","field2",12,.T.
- ^ ^ ^
- | | |
- | | ----------- Field separator.
- ---------------------------- Delimiter that bounds character
-
- fields.
-
- If the external processor that you are interfacing only supports comma
- separated text files without delimiters, you can use the following command
- file to create one. The resulting text file will be in the following form:
-
- field1,field2,12,.T.
-
- To run this program, type the following command line in a command file or
- at the dot prompt:
-
- DO Cpdelim WITH "<database filename>","<index filename>",;
- "<filter condition>","<output filename>"
-
- The resulting file will have a (.TXT) extension.
-
- 2. Program Example
-
- * Program ...: Cpdelim.PRG
- * Author ....: Christopher White
- * Date ......: May 1, 1986
- * Note(s) ...: Program to COPY to a DELIMITED file without delimiters.
- *
- PARAMETERS dbf, ndx, condition, txtfile
- * ---Set environment.
- SET TALK OFF
- SET SAFETY OFF
- * ---Open database file to copy and define the working set of
- * ---records.
- filexp = dbf + IIF("" <> TRIM(ndx)," INDEX " + ndx,"")
- USE &filexp
- SET FILTER TO &condition
- GO TOP
- * ---Create a structure extended file.
- COPY STRUCTURE EXTENDED TO Temp
- SELECT B
- USE Temp
- * ---Find the last field is that not a memo field.
- lastrec = RECCOUNT()
- GO BOTTOM
- DO WHILE Field_type = "M" .AND. (.NOT. BOF())
- lastrec = lastrec - 1
- SKIP -1
- ENDDO
- * ---Open output text file.
- SET ALTERNATE TO &txtfile
- SET ALTERNATE ON
- * ---Output records.
- SELECT A
- DO WHILE .NOT. EOF()
- SELECT B
- GO TOP
- * ---Output fields.
- DO WHILE .NOT. EOF()
- fld_nme = TRIM("A->" + Field_name)
- DO CASE
- CASE field_type = "C"
- * ---Character field.
- ?? TRIM(&fld_nme)
- CASE field_type = "D"
- * ---Date field.
- ?? STR( YEAR(&fld_nme),4 ) +;
- RIGHT( STR(100 + MONTH(&fld_nme),3),2 ) +;
- RIGHT( STR(100 + DAY(&fld_nme),3),2 )
- CASE field_type = "N"
- * ---Numeric field.
- ?? LTRIM(STR(&fld_nme,Field_len,Field_dec))
- CASE field_type = "L"
- * ---Logical field.
- ?? &fld_nme
- ENDCASE
- * ---Insert field separator.
- ?? IIF(RECNO() = lastrec,"",",")
- SKIP
- ENDDO
- * ---Insert record separator.
- ?
- * ---Get next output record.
- SELECT A
- SKIP
- ENDDO
- * ---Clean up.
- CLOSE ALTERNATE
- CLOSE DATABASES
- ERASE Temp.DBF
- RETURN
- * EOP Cpdelim.PRG
-
-
- >>> CREATE LABEL
-
- The correct upper limit for Options:Labels across page is 5, not 15 as
- documented on pages L6-19 and U5-64 of the dBASE III PLUS documentation.
- This is corrected in the second edition.
-
- Elapsed. PRG
- * Program ....: Elapsed.PRG
- * Author .....: Chuck Litzell
- * Date .......: October 1, 1987
- * Version ....: dBASE III Plus
- * Note(s) ....: Calculates elapsed time between a starting date and time
- * and an ending date and time.
- * Returns result in fifth parameter as a character string in
- * the format HH:MM:SS
- *
- * The program is called with the following syntax:
- *
- * DO Elapsed WITH sdate, stime, edate, etime, result
- *
- * sdate ::= starting date, date expression
- * stime ::= starting time as HH:MM:SS;
- * character expression
- * edate ::= ending date, date expression
- * etime ::= ending time as HH:MM:SS;
- * character expression
- * result ::= character memvar, difference is stored
- * in this variable as HH:MM:SS
- *
- PARAMETERS sdate, stime, edate, etime, result
- * ---Proportion of a day for an hour, minute and second.
- hour = 1 / 24
- min = hour / 60
- sec = min / 60
-
- * ---Get starting date + time in dstart.
- dstart = sdate + VAL(stime) * hour +;
- VAL(SUBSTR(stime, AT(":", stime) + 1, 2)) * min +;
- VAL(RIGHT(stime, 2)) * sec
-
- * ---Get ending date + time in dend.
- dend = edate + VAL(etime) * hour +;
- VAL(SUBSTR(etime, AT(":", etime) + 1, 2)) * min +;
- VAL(RIGHT(etime, 2)) * sec
-
- timedif = ABS(dend - dstart)
- result = IIF(dend < dstart, "-", "")
- rhour = INT(timedif / hour)
- rmin = INT((timedif - rhour * hour) / min)
- rsec = ROUND((timedif - rhour * hour - rmin * min) / sec,0)
- result = result + LTRIM(STR(rhour)) + ":" +;
- RIGHT(STR(rmin + 100, 3), 2) + ":" +;
- RIGHT(STR(rsec + 100, 3), 2)
- RETURN
- * ---EOP: Elapsed.PRG.
-
-
- Projtime.PRG
- * Program ....: Projtime.PRG
- * Author .....: Chuck Litzell
- * Date .......: October 1, 1987
- * Version ....: dBASE III Plus Versions, 1.0 and 1.1
- * Note(s) ....: Calculates future date and time by adding a number of
- * days, hours, minutes and seconds to a given date and time.
- *
- * The program is called with the following syntax:
- *
- * DO Projtime WITH sdate, stime, days, timex, rdate, rtime
- *
- * sdate ::= starting date, date expression
- * stime ::= starting time as HH:MM:SS;
- * character expression
- * days ::= number of days to add
- * timex ::= time to add expressed as HH:MM:SS;
- * character expression
- * rdate ::= date memvar, receives calculated future date
- * rtime ::= character memvar, receives calculated
- * future time expressed as HH:MM:SS
- *
- *
- PARAMETERS sdate, stime, days, timex, rdate, rtime
-
- * ---Proportion of a day for an hour, minute and second.
- hour = 1 / 24
- min = hour / 60
- sec = min / 60
-
- * ---Get starting date and time in dwork.
- dwork = sdate + VAL(stime) * hour +;
- VAL(SUBSTR(stime, AT(":", stime) + 1, 2)) * min +;
- VAL(RIGHT(stime, 2)) * sec
-
- * ---Add days and time offset.
- dwork = dwork + days + ;
- VAL(timex) * hour +;
- VAL(SUBSTR(timex, AT(":", timex) + 1, 2)) * min +;
- VAL(RIGHT(timex, 2)) * sec
-
- * ---Store integer portion of ending date in rdate.
- * ---This construct removes the decimals that have
- * ---been added to rdate.
- rdate = CTOD(DTOC(dwork))
-
- * ---Get decimal portion of ending date in twork.
- twork = dwork - rdate
-
- * ---Convert twork to a character string.
- rhour = INT(twork / hour)
- rmin = INT((twork - rhour * hour) / min)
- rsec = ROUND((twork - rhour * hour - rmin * min) / sec, 0)
- rtime = LTRIM(STR(rhour)) + ":" +;
- RIGHT(STR(rmin + 100, 3), 2) + ":" +;
- RIGHT(STR(rsec + 100, 3), 2)
- RETURN
- * ---EOP: Projtime.PRG.
-
-
- >>> CREATE FROM
-
- The CREATE FROM command is used to create a database file from a database
- file that contains the target database file structure as records. This a
- very useful but not well understood aspect of dBASE III PLUS. It can be
- used as a vehicle for transferring file structures from other processors
- such as spreadsheets, word processors, and mainframes. As an example, your
- mainframe consultant could add the target dBASE III database file structure
- as a delimited file to the download package he sends you. It then would be
- an easy matter to CREATE the target database file structure FROM the
- extended structure definition, and then APPEND FROM the downloaded
- delimited data file. Quite nicely this would free you from knowing or
- having to CREATE the target database file structure yourself.
-
- If this prospect intrigues you, the structure of the delimited extended
- file must be as follows:
-
- Field Field Name Type Width Dec
- 1 Field_name Character 10
- 2 Field_type Character 1
- 3 Field_len Numeric 3
- 4 Field_dec Numeric 3
- ** Total ** 28
-
- Each record of the delimited extended file must have fields equivalent to the
- one listed above. The file should be a standard delimited file obeying all the
- rules of the delimited file structure. The following demonstrates what a
- typical delimited extended file looks like.
-
- ---------------- Field name
- | --------- Data type
- | | ----- Field length
- | | |
- v v v v -- Number of decimal places if numeric
- "Field_one","C",15
- "Field_two","N",10,2
-
- To import this structure into dBASE III PLUS and translate it into a database
- file structure, perform the following steps.
-
- * ---Create mechanism for structure translation.
- USE <any file>
- COPY STRUCTURE EXTENDED TO Temp
- USE Temp
- ZAP
- * ---Bring the structure to translate into the mechanism.
- APPEND FROM <your structure> DELIMITED
- USE
- * ---Translate your structure into a database file.
- CREATE <your file> FROM Temp
- ERASE Temp.DBF
-
-
- >>> CREATE REPORT
-
- In CREATE REPORT, the Columns:Decimal places value defaults to
- the number of decimal places specified by SET DECIMALS TO when
- SET FIXED is ON; ignoring the number of decimal places specified
- in the file structure. The documentation for CREATE REPORT
- incorrectly states that the Columns:Decimal places value defaults
- to the number of decimal places specified in the file structure.
- This is true of both versions of dBASE III PLUS.
-
-
-
-
- ==============================
-
- CTOOLS SECTION
-
- >>> Array Save and Restore [cTools Programmers Library]
-
- The Graphics Library uses a binary save of an array, unlike The Programmer's
- Library, which uses a text save. The dBASE Tools for C Incentive Disk allows
- you to use a text save with The Graphics Library.
-
-
- >>> Linking the Graphics Library [cTools Programmers Library]
-
- There have been several requests either to include portions of the Graphics
- Library in the Programmer's Library at link time or exclude portions of the
- Graphics Library that require source code. Neither one is possible but you
- can load both libraries at once as long as you have 640K of memory.
-
-
- >>> Scaling [cTools Programmers Library]
-
- The Graphics Library does not currently include parameters to allow manual Y
- axis scaling (as in Framework II). You can, however, write a dBASE III PLUS
- using the low-level graphic functions to draw a graph.
-
-
- END CTOOLS SECTION
-
- ==============================
-
-
- >>> Date Fields
-
- The date data type uses the Gregorian system of timekeeping in that only
- those centesimal years divisible by 400 are leap years. See the table at
- right for examples. This is true for every version of dBASE III PLUS.
-
- Year Number of Days
- 2000 366
- 1900 365
- 1800 365
- 1700 365
- 1600 366
- 1500 365
-
-
- >>> Date and Time Calculations
-
- BY CHUCK LITZELL
-
- dBASE III PLUS stores Date data types differently in memory variables than
- in database fields. In a database field, dates are stored as eight digits
- in the format YYYYMMDD. When a date is stored to a memory variable,
- however, it is stored as a floating point number. The actual value stored
- is an offset, in days, from a base date. This method of representing
- dates makes date math possible.
-
- Since a date memory variable is a floating point number, it should be
- possible to store decimals to the date as well as integers. Typing these
- lines at the dot prompt confirms this:
-
- . mdate = DATE()
- . ? mdate
- 10/01/87
- . mdate = mdate + .5
- . ? mdate
- 10/01/87
- . mdate = mdate + .5
- . ? mdate
- 10/02/87
-
- Adding .5 to mdate increments the date by one-half day, or 12 hours.
- Adding it a second time advances the date to the next day. Applications
- that need to perform date and time calculations can take advantage of this
- additional capacity of date memory variables. The procedures, Elapsed.PRG
- (Figure 1) and Projtime.PRG (Figure 2), demonstrate how times, represented
- as a fraction of a day, can be combined with date memory variables in
- calculations. Elapsed calculates the elapsed time between two dates and
- times, and Projtime calculates the date and time after a given increment
- to a given date and time.
-
- Both procedures accept dates and times as input parameters. Times are
- represented as character strings in a format similar to the result of the
- TIME() function, except that the number of hours may be more than two
- digits. "12:30:15," "1:00:05," and "4521:18:37" are all handled correctly
- by these procedures. However, "12:5:5," "7:30," and "18:12:5," are not
- valid. The minutes and days must be two digits, and there must be two
- colons appropriately positioned within the string. Here's an example of
- how to use Elapsed:
-
- mtime = ""
- DO Elapsed WITH CTOD("10/01/87"), "12:15:45",;
- CTOD("12/13/87"), "17:00:00", mtime
- ? mtime
- 1756:44:15
- and here's an example of how to use Projtime:
- mdate = CTOD(" / / ")
- mtime = ""
- DO Projtime WITH CTOD("12/31/87"), "23:59:59",;
- 0, "00:00:01", mdate, mtime
- ? mdate, mtime
- 01/01/88 0:00:00
-
-
- >>> dBCODE
-
- dBCODE does not trap illegal characters in filenames when
- encoding command files. Executing a dBCODEd command file that
- references an illegal filename produces the error message
- "Unrecognized phrase/keyword in command." [36] or "File does not
- exist." [1].
-
-
- >>> .DBF File Header
-
- The dBASE III PLUS database file header is one byte shorter than that
- created by all other versions of dBASE III. Earlier versions put an
- "extra" byte (00H) between the header and the beginning of the data. dBASE
- III PLUS no longer includes this byte and the data begins immediately
- following the last byte of the header (0DH). The number of bytes in the
- header (bytes 8 and 9) reflect the smaller header size.
-
- dBASE III PLUS has no problem reading files from earlier versions as long
- as bytes 8 and 9 correctly reflect the actual size of the header.
-
- This procedure will create a file one byte smaller than the original file:
-
- * ---This is a 1.1 created file.
- USE Test
- COPY TO Test1
- DIR && Test1 is one byte smaller than Test.
-
-
- >>> Demonstration Disk (RunTime+)
-
- In the Developer's Release of dBASE III, the dBRUN programs from the
- Demonstration Disk are not compatible with the full system. Code crunched
- with DBC.COM from the Demonstration Disk can only be run with dBRUN from
- the Demonstration Disk. Code crunched with DBC.COM from the Developer's
- Disk can only be run with the full dBASE III system or the dBRUN disk,
- purchased separately.
-
- The error message:
-
- No database is in USE. Enter filename:
-
- is a common indicator that the incorrect dBRUN or dBC is being used.
-
-
- >>> DIRECTORY
-
- DIRECTORY is an undocumented dBASE III PLUS command that performs
- identically to the dBASE DIR command.
-
-
- >>> DO
-
- dBASE III PLUS allows recursive calls of program files. A program
- can call a subprogram and that subprogram can call the
- originating program until too many files are open. For example,
-
- * A_prog.PRG * B_prog.PRG
- DO B_prog DO A_prog
-
- A program may also call itself. The following program continues
- to open files until the "Too many files are open." [6] error
- message is returned.
-
- * Test.PRG
- DO Test
-
- It is possible to do this in all versions of dBASE III PLUS.
-
-
- >>> DO <Procedure>
-
- If you SET PROCEDURE TO a file on a drive other than the default, DO
- <Procedure> requires that the drive designator not be included in the
- command. The commands
-
- SET PROCEDURE TO A:Test
- DO A:Test1
-
- will cause dBASE III to look for the command file Test1.PRG on drive A:.
- The proper syntax is
-
- SET PROCEDURE TO A:Test
- DO Test1
-
- This is true for all versions of dBASE III PLUS.
-
-
- >>> DO WHILE
-
- In versions of dBASE III earlier than the Developer's Release, the DO WHILE
- command will stop evaluating it's condition as soon as the expression is
- complete, ignoring characters beyond that point. This makes it possible
- for conditions with a seemingly invalid expression to be executed. For
- example,
-
- DO WHILE EOF() = .T.
- DO WHILE EOF() = .F. both equal DO WHILE EOF()
-
- and,
-
- DO WHILE .T. = EOF() equals DO WHILE .T.
- DO WHILE .F. = EOF() equals DO WHILE .F.
-
- In the Developer's Release and dBASE III PLUS the above conditions will
- return the error message, "Invalid operator."
-
-
- >>> Documentation Error
-
- 1. Page 5-25 of the Networking section of the dBASE III PLUS Reference
- Manual shows the following command line.
-
- CASE ERROR() = 158
-
- This command is supposed to trap the "File is in use by another"
- condition. The error number, however, is incorrect and the command line
- should read:
-
- CASE ERROR() = 108
-
- 2. There are coding errors on pages 4-18, 5-27, and 5-30 of the Networking
- section of the dBASE III PLUS Reference Manual. The command line,
-
- IF TIME = 250
-
- purports to test if an attempt to lock a database file failed. It is not,
- however, a reliable coding method and should be changed to
-
- IF .NOT. FLOCK()
-
- 3. On page 4-18 of the Networking section of the dBASE III PLUS Reference
- Manual, the command
-
- times = 1
-
- should be inserted immediately before the SKIP command. The routine on the
- following page is an error handling routine executed if SKIP encounters a
- locked record and expects the variable, times, to be reset each time it is
- called.
-
- 4. On page 5-30 of the Networking section of the dBASE III PLUS Reference
- Manual, the UNLOCK command should be placed after the READ command.
-
-
- >>> EDIT RECORD <n>
-
- In dBASE III versions 1.0 and 1.1, EDIT RECORD <n> and EDIT <n> behave
- identically. They both enter the full-screen edit mode at the record
- indicated. PgUp and PgDn take the user to the previous and following
- records respectively. In the Developer's Release and dBASEIIIPLUS, EDIT
- <n> acts the same as in version 1.0 and 1.1; however, EDIT RECORD <n>
- allows editing of the specified record only. PgUp and PgDn return the user
- to the dot prompt. This is true of both versions of dBASE III PLUS.
-
-
- >>> EOF()
-
- When you execute REINDEX or PACK on an indexed database file the the record
- pointer is positioned to the end-of-file and EOF() returns a true (.T.).
- By contrast, INDEX ON and PACK position the record pointer to the first
- record when used on non-indexed database files.
-
- This occurs in both versions of dBASE III PLUS.
-
-
- >>> ERROR()
-
- The following error messages cannot be trapped by ON ERROR in any version
- of dBASE III PLUS, although they do return the error number specified.
-
- 14 No find.
- 25 Record not inserted.
- 39 Numeric overflow (data was lost).
- 49 File has been deleted.
- 52 No database in USE.
- 56 Disk full when writing file:
- 72 ALTERNATE could not be opened.
- 73 ^^ Expected ON or OFF.
- 74 ^--- Truncated.
- 81 Invalid date.
- 82 ** Not Found **
- 86 ^-- Keyword not found.
- 89 Cannot erase a file which is open.
- 113 Index interrupted. Index will be damaged if not completed.
- 129 Unable to LOCK.
- 132 Unauthorized login.
- 144 Unauthorized duplicate.
- 145 Error in configuration value.
- 150 Help text not found.
-
- The following error message cannot be trapped by ON ERROR in version 1.0 of
- dBASE III PLUS, but can be trapped in version 1.1.
-
- 149 Master catalog is empty.
-
-
- >>> Error Messages
-
- The error message "Invalid DIF vector - DBF field mismatch [116]" is
- undocumented in the original dBASE III PLUS documentation. This error
- message occurs when APPENDing FROM a DIF file and data in that file
- conflicts with the DIF header.
-
-
- >>> Error Messages by Number
-
- The following is a list of dBASE III PLUS error messages in numeric order.
-
- 1 File does not exist.
- 2 Unassigned file no.
- 3 File is already open.
- 4 End-of-file encountered.
- 5 Record is out of range.
- 6 Too many files are open.
- 7 File already exists.
- 8 Unbalanced parenthesis.
- 9 Data type mismatch.
- 10 Syntax error.
- 11 Invalid function argument.
- 12 Variable not found.
- 13 ALIAS not found.
- 14 No find.
- 15 Not a dBASE database.
- 16 *** Unrecognized command verb.
- 17 Cannot select requested database.
- 18 Line exceeds maximum of 254 characters.
- 19 Index file does not match database.
- 20 Record is not in index.
- 21 Out of memory variable memory.
- 22 Out of memory variable slots.
- 23 Index is too big (100 char maximum).
- 24 ALIAS name already in use.
- 25 Record not inserted.
- 26 Database is not indexed.
- 27 Not a numeric expression.
- 28 Too many indices.
- 29 File is not accessible.
- 30 Position is off the screen.
- 31 Invalid function name.
- 33 Structure invalid.
- 34 Operation with Memo field invalid.
- 35 Unterminated string.
- 36 Unrecognized phrase/keyword in command.
- 37 Not a Logical expression.
- 38 Beginning of file encountered.
- 39 Numeric overflow (data was lost).
- 41 .DBT file cannot be opened.
- 42 CONTINUE without LOCATE.
- 43 Insufficient memory.
- 44 Cyclic relation.
- 45 Not a character expression.
- 46 Illegal value.
- 47 No fields to process.
- 48 Field not found.
- 50 Report file invalid.
- 51 End of file or error on keyboard input.
- 52 No database in USE.
- 53 There are no files of the type requested in this drive
- or catalog.
- 54 Label file invalid.
- 55 Memory Variable file is invalid.
- 56 Disk full when writing file:
- 57 ***Execution error on CHR() : Out of range.
- 58 ***Execution error on LOG() : Zero or negative.
- 59 ***Execution error on SPACE() : Too large.
- 60 ***Execution error on SPACE() : Negative.
- 61 ***Execution error on SQRT() : Negative.
- 62 ***Execution error on SUBSTR() : Start point out of
- range.
- 63 ***Execution error on STR() : Out of range.
- 65 Internal error : Unknown command code:
- 66 Internal error : CMDSET():
- 67 Internal error : EVAL work area overflow
- 68 Internal error : Illegal opcode.
- 70 ** WARNING ** Data will probably be lost. Confirm (Y/N).
- 72 ALTERNATE could not be opened.
- 73 ^^ Expected ON or OFF.
- 74 ^--- Truncated.
- 75 ^--- Out of range.
- 76 ***Execution error on - : Concatenation string too large.
- 77 ***Execution error on + : Concatenation string too large.
- 78 ***Execution error on ^ or ** : Negative base,
- fractional exponent.
- 79 ***Execution error on STORE : String too large.
- 81 Invalid date.
- 82 ** Not Found **
- 86 ^-- Keyword not found.
- 87 ***Execution error on NDX() : invalid index number.
- 88 ***Execution error on REPLICATE() : String too large.
- 89 Cannot erase a file which is open.
- 90 Operation with Logical field invalid.
- 91 File was not LOADed.
- 92 Unable to load COMMAND.COM.
- 93 No PARAMETER statement found.
- 94 Wrong number of parameters.
- 95 Valid only in programs.
- 96 Mismatched DO WHILE and ENDDO.
- 99 Invalid DOS SET option.
- 101 Not suspended.
- 102 ***Execution error on STUFF() : String too large
- 103 DOs nested too deep.
- 104 Unknown function key.
- 105 Table is full.
- 106 Invalid index number.
- 107 Invalid operator.
- 108 File is in use by another.
- 109 Record is in use by another.
- 110 Exclusive open of file is required.
- 111 Cannot write to a read-only file.
- 112 Index expression is too big (220 char maximum).
- 113 Index interrupted. Index will be deleted if not completed.
- 114 Index damaged. REINDEX should be done before using data.
- 115 Invalid DIF File Header.
- 116 Invalid DIF vector - DBF field mismatch.
- 117 Invalid DIF Type Indicator.
- 118 Invalid DIF character.
- 119 Invalid SYLK File Header.
- 120 Invalid SYLK Dimension Bounds
- 121 Invalid SYLK File Format.
- 122 Data Catalog has not been established.
- 123 Invalid printer port.
- 124 Invalid printer redirection.
- 125 Printer not ready.
- 126 Printer is either not connected or turned off.
- 127 Not a valid VIEW file.
- 128 Unable to SKIP.
- 129 Unable to LOCK.
- 130 Record is not locked.
- 131 Database is encrypted.
- 132 Unauthorized login.
- 133 Unauthorized access level.
- 134 Not a QUERY file.
- 136 Unsupported path given.
- 137 Maximum record length exceeded.
- 138 No fields were found to copy.
- 139 Cannot JOIN a file with itself.
- 140 Not a PFS file.
- 141 Fields list too complicated.
- 142 Relation record is in use by others.
- 143 Query not valid for this environment.
- 146 Maximum path length exceeded.
- 147 Cannot append in column order.
- 148 Network server busy.
- 149 Master catalog is empty.
-
- Note also that the following error is not documented.
-
- 146 Maximum path length exceeded.
-
-
- >>> "EVAL Work area" Messages
-
- The dBASE III PLUS "EVAL work area" is used by any expression in any
- command that allows any type of expression or condition. Commands that
- contain a condition or expression invoke the expression evaluator and use
- the evaluation workarea. The error message "Internal error: EVAL work area
- overflow" occurs when a command is too complex to be evaluated within the
- workarea's allocated space. This is true of all versions of dBASE III PLUS.
-
-
-
- >>> Exclusive .OR.
-
- dBASE's .OR. is nonexclusive. In other words, it returns true (.T.) in any
- case except when both conditions you are comparing are false (.F.).
-
- Exclusive .OR. (normally called XOR) returns true (.T.) only if the two
- conditions you are comparing are different.
-
- To XOR two conditions, you can use the following formula (where term_a and
- term_b represent two logical values):
-
- ? (term_a .AND. .NOT. term_b) .OR. (.NOT. term_a .AND. term_b)
-
- The following code fragment prints out all the possible values for XOR:
-
- x = "(term_a .AND. .NOT. term_b) .OR. (.NOT. term_a .AND. term_b)"
- term_a = .T.
- term_b = .T.
- ? ".T. XOR .T. = " + IIF(&x,".T.",".F.")
- term_a = .T.
- term_b = .F.
- ? ".T. XOR .F. = " + IIF(&x,".T.",".F.")
- term_a = .F.
- term_b = .T.
- ? ".F. XOR .T. = " + IIF(&x,".T.",".F.")
- term_a = .F.
- term_b = .F.
- ? ".F. XOR .F. = " + IIF(&x,".T.",".F.")
- The printout shows:
-
- .T. XOR .T. = .F.
- .T. XOR .F. = .T.
- .F. XOR .T. = .T.
- .F. XOR .F. = .F.
-
-
- >>> "***Execution error on SUBSTR(): Start point out of range."
-
- If you are using the SUBSTR() function with memory variables or with an
- expression whose value might be null or shorter in length than the starting
- position argument of the SUBSTR() function, you will get the error message
- "***Execution error on SUBSTR(): Start point out of range." This is not a
- terminal error condition as is the case with a syntax error. The SUBSTR()
- function terminates gracefully, returning a null as the result. The
- execution error, however, does present a problem. If SET CONSOLE is ON and
- the execution error occurs, the error message will echo to the screen,
- disturbing your display. If SET PRINT is ON or the substring expression is
- part of any command that is sending output with the TO PRINT clause, the
- error message will echo to the printer. This is particularly a problem
- with REPORT and LABEL FORMs.
-
- There are three strategies you can use to suppress the display of the error
- message. The use of each depends on what commands are being used with the
- substring expression.
-
- 1. If you are assigning memory variables or using @...SAY to send the
- result of the substring expression to the screen or printer, you can SET
- CONSOLE OFF to suppress the error message.
-
- 2. If you are using a TO PRINT command such as LABEL FORM TO PRINT, use the
- IIF() function as the starting position expression to return a zero if the
- length of the character string is less than the start position you really
- want. SUBSTR() always returns a null string if the starting position is
- zero. For example, the following expression returns a null string if the
- length of the memory variable "x" is less than three.
-
- SUBSTR(x, IIF(LEN(x) < 3, 0, 3), 6)
-
- Use a SUBSTR() with this form to suppress the execution error message.
-
- 3. Lastly, you can use ON ERROR to trap execution errors. Define the
- argument of the ON ERROR condition as a dummy expression such as,
-
- ON ERROR dummy = 0
-
- before you execute a command that causes the execution error. Be aware
- that this approach is limited since you may need the ON ERROR condition for
- other purposes. In addition, branching to a command file in order to trap
- a range of error conditions terminates REPORT or LABEL FORMs.
-
-
- >>> EXPORT
-
- The error messages produced by EXPORT and their causes are not documented.
- They are not trapped by ON ERROR. The messages are
-
- 1. "Too many @ commands on one page of format file." This error occurs when
- there are more than 200 @ commands in the format file used for EXPORT.
-
- 2. "Format files must be in row major order to be exported." This error
- occurs if the <Row> and/or <Col> coordinates have values that are less
- than previously given coordinates. For example,
-
- @ 10,1 SAY 'A'
- @ 5,1 SAY 'B'
-
- 3. "PFS does not allow row numbers higher than 20." Any <Row> value higher
- than 20 produces this error.
-
- This is corrected in the second edition of the documentation.
-
-
- >>> EXP()
-
- The range of the numeric expression of the EXP() function is between
-
- -708.3964185322642 and 709.7827128933841
-
- Values outside this range exceed the numeric accuracy of dBASE III PLUS and
- produce an internal numeric overflow. For example, using EXP() to evaluate
- the exponent of the LOG() of a number should return the original value. In
- the following exmaple, a value outside of the range does return itself.
-
- * ---Correct result.
- ? LOG(EXP(709))
- 709.00
-
- * ---Incorrect result.
- ? LOG(EXP(710))
- 11356.52
-
- Evaluating the LOG() of the EXP() of a number below -708.3964185322641
- produces the error message "Execution error on LOG() : Zero or negative"
- [58].
-
- This occurs in both versions of dBASE III PLUS.
-
-
- >>> F1 Key
-
- The F1 function key can be used to exit an active @...GET if the @...GET is
- not within a format file opened with SET FORMAT TO. Changes made prior to
- pressing F1 are saved as if Ctrl-W were pressed.
-
- However, even though F1 exits and saves the data, it does not produce
- exit-key values that are consistent with other dBASE III PLUS write
- operations. Write operations always save the data and produce an exit-key
- value that READKEY() interprets as data changed, regardless of whether data
- have been altered. When F1 is used to exit a full-screen operation,
- READKEY() returns either 36 for no change in data or 292 when data have
- changed. To be consistent, F1 should not produce 36 since it means
- non-updated data.
-
- Pressing F1 in an active screen format moves the cursor to the beginning of
- the current field without exiting the screen. This occurs in all versions
- of dBASE III PLUS.
-
-
-
- >>> File Extensions
-
- In Table 1 is a list of default filename extensions created by dBASE III
- PLUS along with their descriptions and the commands which may be used to
- create them. Only extensions that remain on disk once dBASE III PLUS has
- terminated normally are included.
-
- Temporary files created, then erased, by dBASE III PLUS are not included.
-
- Note that DBC.COM and DBL.COM also create files with .PRG extensions. See
- the Runtime section of the manual for more information on DBC and DBL.
-
- When dCONVERT is used to convert dBASE II files, the old file is renamed
- with a "B" for the last letter of the extension (.??B.)
-
- Following is a list of commands with their descriptions that create a file
- with no default extension.
-
- Command Description
-
- EXPORT TO... Creates a PFS
- TYPE PFS file.
-
- MODIFY/CREATE Creates a text
- FILE file.
-
- COPY TO... Creates a
- TYPE SYLK Multiplan spreadsheet.
-
-
- >>> Floating Dollar Signs
-
- dBASE III PLUS does not directly support the display of numbers
- right-justified with a floating dollar sign. To achieve a floating dollar
- sign to either print or display numeric data, you can use the following
- expression.
-
- RIGHT(SPACE(<length of number>) + "$" + ;
- LTRIM(TRANSFORM(<number>, "999,999,999,999.99"), <length of
- number>)
-
- This expression can be used wherever dBASE III PLUS accepts the result of a
- character expression. This includes @...SAY, ??, LABEL and REPORT FORMS.
-
-
- >>> For 256K Machines
-
- dBASE III PLUS runs with PC-DOS version 2.xx if you have 256K installed
- memory in your computer. If you have a minimum of 384K of installed
- memory, dBASE III PLUS runs with PC-DOS version 3.xx as well as version
- 2.xx.
-
- For 256K operation, two files are provided, CONFI256.SYS and CONFI256.DB,
- on System Disk #1. These two files set system parameters for maximum
- overall performance of dBASE III PLUS in a 256K environment.
-
- The CONFI256.SYS file contains:
-
- FILES = 20
- BUFFERS = 4
-
- Copy the CONFI256.SYS file to the root directory of the disk you boot DOS
- from or the directory set by the DOS COMSPEC command and rename it to
- CONFIG.SYS. If CONFIG.SYS already exists, modify the file to include FILES
- = 20 and BUFFERS = 4.
-
- The CONFI256.DB file contains:
- COMMAND = ASSIST
- STATUS = ON
- BUCKET = 1
- GETS = 35
- MVARSIZ = 3
- HISTORY = 10
- TYPEAHEAD = 10
-
- Copy CONFI256.DB into be placed in the same directory as DBASE.COM and
- rename it to CONFIG.DB.
-
- The CONFI256.DB settings reduce the memory-intensive parameters allowing
- dBASE III PLUS to work in a 256K environment. The smaller settings place
- the following limitations on dBASE III PLUS.
-
- MVARSIZ is reduced to 3,000 bytes which is half the normal default size of
- 6,000 bytes. This reduces the amount of space available for memory
- variables and may cause incompatibilities with programs written with
- earlier versions of dBASE III. Refer to the SAVE and RESTORE commands for
- ways to optimize use of memory variable space.
-
- BUCKET size is reduced to 1,024 bytes, half the normal default size. This
- reduces the amount of memory available for the PICTURE and RANGE options of
- the @...GET command, and may cause incompatibilities with programs written
- with earlier versions of dBASE III.
-
- CREATE SCREEN is limited to one screen, with a maximum of 35 pending GETs.
- Format files created on machines with more memory may not work when moved
- to a 256K machine. The limitation of 35 pending GETs may also cause
- incompatibilities with programs written with earlier versions of dBASE III.
-
- The RUN command is not supported on computers with 256K of memory. dBASE
- III PLUS requires 256K, the RUN command requires additional memory for
- COMMAND.COM plus the memory required by the external program. This is
- consistent with earlier versions of dBASE III.
-
- The "Insufficient memory" message is an indication that some memory must be
- released to allow dBASE III PLUS to continue with the operation. When
- using dBASE III PLUS with 256K RAM this message may result from a
- combination of factors and varies with the size and number of database
- files, index files, format files, and the HISTORY and TYPEAHEAD buffer
- sizes.
-
- If the "Insufficient memory" message is received:
-
- 1. Ensure that you are using the correct CONFIG.SYS and CONFIG.DB
- files, as listed above for 256K operation.
-
- 2. Close one or more open files and then proceed.
-
- Increasing the amount of RAM in your computer will significantly enhance
- the performance of dBASE III PLUS.
-
-
- >>> GETENV()
-
- You can use DOS environmental variables to set and hold locational pointers
- to various directories for the purpose of installing application systems.
- Many modern programs are now so large they require the use of
- subdirectories to control the location of information. In view of this,
- many use the DOS environmental variable technique to accomplish the needed
- control.
-
- In order to gain the same power with dBASE III PLUS and your programs, use
- GETENV() to return the contents of environmental variables that each hold a
- directory pointer for a specific set of files. Remember that GETENV() can
- return not only system variables that DOS uses, such as PATH or COMSPEC,
- but also environmental variables that you assign in DOS. You can assign
- these variables from anywhere in DOS, but many programs that use this
- directory pointer system initialize the environmental variables in the
- AUTOEXEC.BAT.
-
- This type of a system in dBASE III PLUS would consist of creating three
- basic classes of files (.PRG, .DBF, and .NDX) with three potential
- locations. You could, of course, have many more, but these serve the
- purposes of example.
-
- To set this up, you need first to create the environmental variables in DOS
- with a series SET command lines as follows:
-
- SET DB_DIR=<database file directory path>
- SET PRG_DIR=<program file directory path>
- SET NDX_DIR=<index file directory path>
-
- In the initialization area of your main application program you need to
- define a series of memory variables using GETENV() that correspond to the
- DOS environmental variables you have set up. For example,
-
- db_dir = GETENV("DB_DIR")
- prg_dir = GETENV("PRG_DIR")
- ndx_dir = GETENV("NDX_DIR")
-
- Now that you have the directory pointers variables for each class of file,
- you can use them to either SET the dBASE III PLUS PATH to the list of valid
- directories or you can them explicitly in file access commands. For
- example,
-
- SET PATH TO &db_dir., &ndx_dir., &prg_dir.
-
- or
-
- USE &db_dir.\<database file> INDEX &ndx_dir.\<index file>
-
- and
-
- DO &prg_dir.\<program name>
-
- One of the problems you may encounter using this technique is not having
- enough environment space for your variable definitions. This can happen
- if, for example, you have a long PATH statement. You can, however, change
- the size of the DOS environment if you are running under PC/MS-DOS 3.1 and
- above with the undocumented CONFIG.SYS command SHELL. The general syntax
- of the SHELL command is as follows:
-
- SHELL=C:<path>\<command processor> C:<path>\ /P/E:<number of paragraphs>
-
- When you wish to use SHELL, place it in your CONFIG.SYS file along with the
- traditional FILES and BUFFERS settings. To set up the SHELL command line,
- specify the path to your command processor, the name of your command
- processor (usually COMMAND.COM), the path again, a space, the /P and /E:
- switches (no spaces between them) and the number of 16-byte paragraphs to
- allocate to the environment space. If you do not specify the number of
- paragraphs, the default is 8 or a total of 128 bytes. If you do specify a
- /E: setting, the acceptable range is 11 to 63.
-
- Be aware that the order and spacing of the SHELL command arguments are
- vital.
-
- Reference:
-
- DeVoney, Chris. Using PC DOS. Indianapolis, Indiana: Que Corporation, 1986.
- pps. 487-488.
-
-
- >>> HELP
-
- It is not documented that the HELP command requires a file handle. When
- HELP is executed, dBASE III PLUS opens the file HELP.DBS. If the maximum
- number of files (15) are already open, the error message "Too many files
- are open." [6] is produced when HELP is executed.
-
-
- >>> HELP.DBS
-
- There are two HELP.DBS files shipped with dBASE III PLUS version 1.1; one
- each on System disk #1 and System disk #2. The file on System disk #2 is
- for dBASE III PLUS single-user systems. The file on System disk #1 is for
- dBASE III PLUS Administrator.
-
-
- >>> ID.EXE
-
- When terminate-and-stay-resident (TSR) programs are loaded and ID.EXE is
- run, a Ctrl-C may be required at the "Check over your responses. Would you
- like to re-edit them? (Y/N)." prompt. In one instance, the order in which
- the TSR programs were loaded affected the outcome of ID.EXE TSR programs
- should be removed from memory before running ID.EXE
-
-
- >>> IIF()
-
- dBASE III PLUS parses the entire IIF() statement before executing the
- function. If either parameter of the IIF() function is erroneous, then the
- entire function returns an error. For example,
-
- mem = "dBASE"
- ? IIF(.T., mem, SUBSTR(mem, 10, 3))
-
- returns the error message "***Execution error on SUBSTR() : Start point out
- of range" even though the false condition is never executed. The IIF()
- function requires that each argument be a valid expression.
-
- This is true for versions 1.0 and 1.1 of dBASE III PLUS.
-
-
- >>> IMPORT
-
- IMPORTing a PFS file from a drive other than the default creates the new
- .DBF, .FMT, and .VUE files on the drive containing the PFS file, not the
- default drive. This occurs in versions 1.0 and 1.1 of dBASE III PLUS.
-
-
- >>> INDEXing Street Addresses
-
- If you have a name and address database file, you might need to INDEX your
- database file in street order. The basic requirement is to create an index
- file that keeps all like streets together, and orders the addresses by
- numeric value within each street. The reason for this is that INDEXing ON
- the street alone will not give you a very meaningful order. An additional
- requirement is to assign all blank and "P.O. Box" addresses a value that
- groups them at the top or bottom of the index so that you can easily skip
- over them.
-
- The following commands use IIF() in combination with other string functions
- to create an index key that will produce an index file in street order.
- When you use these commands, enter the assignments to the memory variables
- "ae" and "af" first, and then enter the INDEX command on one continuous
- command line. As you type the INDEX command line, be sure to ignore
- embedded blanks and semicolons within the INDEX expression to keep the
- expression length less than the 220-character limit that dBASE III PLUS
- imposes.
-
- * ---INDEXing street names.
- ae = [SUBSTR(Street, 1, AT(" ",Street) - 1)]
- af = [SUBSTR(Street, AT(" ",Street) + 1, 5)]
- INDEX ON IIF( "BOX" $ &ae.;
- .OR. "P.O." $ &ae.;
- .OR. LEN(TRIM(Street)) = 0,;
- " ",;
- &af. + RIGHT(STR(100000 + VAL(&ae),6),5);
- );
- TO Address
-
-
- >>> INDEX File Size
-
- To calculate the size of a dBASE III PLUS index file created with INDEX or
- REINDEX, use the following program, Ndxsize.PRG. The variable, keyexplen,
- refers to the length of the index file's key expression and must be
- provided. Keyexplen is 8 when using numeric or date type keys and is
- rounded up to the nearest multiple of four on character type keys. To
- execute Ndxsize, use the following general syntax:
-
- USE <your database file>
- klen = <length of index key>
- ret_val = 0
- DO Ndxsize WITH klen, ret_val
-
- * Program ...: Ndxsize.PRG
- * Author ....: Paul Redmond
- * Date ......: January 1, 1987
- * Note(s) ...: Calculates the optimal size of an index file after
- * an INDEX or REINDEX.
- *
- PARAMETERS keyexplen, answer
- PRIVATE ALL
- blkkeycnt = INT(504 / (keyexplen + 8))
- blkleft = RECCOUNT() / blkkeycnt
- blkcnt = blkleft + 2
- blkkeycnt = blkkeycnt + 1
- DO WHILE blkleft > blkkeycnt
- blkleft = INT((blkleft - 1) / blkkeycnt) + 1
- blkcnt = blkcnt + blkleft
- ENDDO
- answer = blkcnt * 512
- * EOP Ndxsize.PRG
-
- Note that the size of the index file changes if an APPEND is used with an
- indexed database file. INDEX and REINDEX optimize the index file; this
- formula approximates the optimum index file size. This algorithm is
- relevant to both versions 1.0 and 1.1 of dBASE III PLUS.
-
-
- >>> INKEY()
-
- The list of alternate keys on pages U6-29 [Original] and U6-41 [Revised
- 6/86] is incomplete. Alternate keys not documented are:
-
-
- Special Key Alternate Key
- -------------------------------
- Rightarrow | Alt-<4>
- Leftarrow | Alt-R
- Uparrow | Alt-<5>
- Dnarrow | Alt-O
- Ctrl-Rightarrow | Alt-<2>
- Ins | Alt-U
- Del | Alt-<7>
- Home | Alt-<1>
- End | Alt-<6>
- PgDn | Ctrl-@, Alt-<3>
- Ctrl-End | Alt-I
- Esc | Ctrl-[
- Ctrl-PgUp | Alt-S
- Ctrl-PgDn | Alt-A
- F1 | Ctrl-\
-
- Numbers enclosed in <> denote keys on the numeric keypad only. All keys
- can be duplicated by entering their ASCII key codes on the numeric keypad
- while holding down the Alt key.
-
- Though this list is included in the documentation under INKEY(), the
- alternate keys are applicable throughout dBASE III PLUS. For example, in
- BROWSE Ctrl-\ toggles the cursor control keys menu instead of invoking
- HELP, as F1 does.
-
- Ctrl-Q is incorrectly documented as the alternate key for Esc; Ctrl-[ is
- the alternate key for Esc. In data-entry screens Ctrl-Q and Esc act the
- same in that they both abort the entry screen without writing the changes.
- However, during LIST or DISPLAY Ctrl-Q resumes scrolling after Ctrl-S has
- paused the output. Esc aborts the operation entirely. INKEY() returns 27
- for Esc and Ctrl-[, while Ctrl-Q returns 17.
-
-
- >>> INKEY()
-
- 1. The INKEY() function in the Developer's Release and dBASE III PLUS seems
- to return the wrong answer after a WAIT command has been executed. For
- example,
-
- WAIT
- i = INKEY()
- ? i
-
- The memory variable "i" will always contain the value zero no matter what
- key was last pressed. The reason for this is that WAIT pauses and waits
- for a key value from the keyboard or type-ahead buffer. Once the key is
- sensed, it is taken from the buffer. The INKEY() function also looks at
- this buffer for a key, but finds that the last key has been taken by the
- WAIT command and so returns a zero value.
-
- The correct method to poll the keyboard for a key press is to use either
- the WAIT command or the INKEY() function but not both in combination. For
- example,
-
- * ---Use the WAIT command.
- WAIT TO choice
- DO CASE
- CASE choice = 19
- ...
- CASE choice = 27
- ...
- ENDCASE
-
- ---Use the INKEY() function.
- key = INKEY()
- DO WHILE key = 0
- key = INKEY()
- ENDDO
- DO CASE
- CASE key = 19
- ...
- CASE key = 27
- ...
- ENDCASE
-
- 2. The following program can be used to help you determine the key code for
- each key pressed.
-
- SET ESCAPE OFF
- SET TALK OFF
- esc = 27
- DO WHILE .T.
- key = INKEY()
- DO WHILE key = 0
- key = INKEY()
- ENDDO
- ? key
- IF key = esc
- EXIT
- ENDIF
- ENDDO
- SET TALK ON
- SET ESCAPE ON
- RETURN
-
-
- >>> INKEY()
-
- INKEY() returns the following codes for function keys:
-
- Key Normal Ctrl Alt
- ===============================
- F1 28 94 104
- F2 -1 95 105
- F3 -2 96 106
- F4 -3 97 107
- F5 -4 98 108
- F6 -5 99 109
- F7 -6 100 110
- F8 -7 101 111
- F9 -8 102 112
- F10 -9 103 113
-
-
-
- >>> INPUT
-
- The INPUT command behaves differently in different versions of dBASE III.
- In versions 1.0 and 1.1, it accepts a carriage return as a valid response
- and does not create a variable. If one exists, it is left intact. Control
- is then returned to the calling program or the dot prompt. In the
- Developer's Release and dBASE III PLUS, however, INPUT does not accept a
- carriage return as a valid response. It scrolls the screen up one line and
- awaits valid input each time a carriage return is entered and control is
- not returned to the calling program or dot prompt until a valid input is
- accepted.
-
-
- >>> INSTALL.BAT
-
- The files required to run dBASE III PLUS version 1.1 are not
- documented. They are:
-
- DBASE.EXE
- DBASE.OVL
- DBASEINL.OVL
- DBASE.MSG
- CONFIG.SYS (In the root directory of the boot disk.)
-
- Additional files needed by dBASE III PLUS (version 1.1) to
- function fully but not required to load are:
-
- HELP.DBS
- ASSIST.HLP
- CONFIG.DB
-
-
- >>> Interactive Mode
-
- In dBASE III PLUS, you cannot continue command lines issued at the dot
- prompt with a semicolon. Previous versions supported this feature.
-
- To continue a line beyond the width of the screen keep typing and the
- command will scroll left. In dBASE III PLUS, the command line is an
- editable 254 character, single line, horizontal scroll space. All keys
- that are valid in full-screen modes are valid at command line.
-
-
- >>> Justifying and Centering Strings
-
- BY CHUCK LITZELL
-
- Frequently, there is a need to center or right justify a message on the
- screen or in a report. The usual method is to add to the left of the string
- the number of spaces required to offset the message to the desired
- position. The dBASE III PLUS code to accomplish this is short, though
- somewhat complicated owing to the mathematics involved.
-
- Use this expression to center a string:
-
- string = IIF(width > LEN(string),;
- SPACE((width - LEN(string)) / 2),;
- "") + string
-
- To right justify a string, use
-
- string = IIF(width > LEN(string),;
- SPACE(width - LEN(string)),;
- "") + string`
-
- Often, reports and screen displays have headings that include a
- left-justified string, a centered string, and a right-justified string.
- Title.PRG (Figure 1) is a procedure that builds such a heading. The three
- strings are passed as parameters, along with the width of the desired
- heading. The resulting string is returned in the first parameter.
-
- * Program ...: Title.PRG
- * Versions ..: dBASE III PLUS v1.0, 1.1
- * Note(s) ...: Generates a report or screen title line with text
- * left justified, centered and right justified.
- * The result is returned in the first parameter, ltext.
- *
- * The calling program must ensure that the width
- * specified is sufficient to contain the three
- * strings without overlap. No error will result
- * if there is overlap, but the result string will be
- * erroneous.
- *
- * Example:
- * pagen = 1
- * header = DTOC(DATE())
- * DO Title WITH header, "Employee Master Report",;
- * "Page " + LTRIM(STR(pagen)), 80
- * @ 1, 0 SAY header
- *
- PARAMETERS ltext, ctext, rtext, width
- *
- * ltext ::= text to be left justified.
- * ctext ::= text to be centered.
- * rtext ::= text to be right justified.
- * width ::= width of output string.
- *
- tmpstr = RIGHT(SPACE(width) + TRIM(rtext), width)
- tmpstr = STUFF(tmpstr, (width - LEN(TRIM(RTRIM(ctext)))) / 2,;
- LEN(TRIM(RTRIM(ctext))), TRIM(RTRIM(ctext)))
- ltext = STUFF(tmpstr, 1, LEN(TRIM(RTRIM(ltext))), TRIM(RTRIM(ltext)))
- RETURN
- * EOP Title.PRG
-
-
-
-
- >>> LIST
-
- The LIST command is designed to display "Record in use by another" if a
- record is locked by a different workstation with RLOCK(). This performs
- according to expectation unless record number 1 is locked with RLOCK(), in
- which case blank data is displayed for the record.
-
- There is no work-around for this situation.
-
-
- >>> LIST PROCEDURE
-
- Often, when you are modifying an existing application where you have merged
- a number of command files into a procedure file, you may want to get a list
- of procedures. You can do this easily using the DOS utility, FIND.EXE.
- FIND is a very fast, free text-search program that searches for a specified
- string anywhere in a file, returning the lines where the search argument is
- found. Optionally, FIND will return line numbers as well. Unfortunately,
- searches are case-sensitive and case is not a configurable option. You
- can, however, use this to your advantage by making the use of the command
- verb PROCEDURE always uppercase and any other uses in comments and in the
- SET and CLOSE PROCEDURE commands some combination of case and word length
- to make the PROCEDURE declaration unique.
-
- To list procedures from the DOS prompt use the following command line,
-
- FIND "PROCEDURE" <procedure file name>
-
- You can, off course, RUN this command line from within dBASE III PLUS or
- you can create a command file that calls FIND and constructs the FIND
- command like the following,
-
- PROCEDURE Proc_file
- RUN FIND "PROCEDURE" &Proc_file..PRG
- RETURN
-
- If you want to include line numbers in the listing add /N to the FIND
- command line.
-
-
- >>> LOAD
-
- The explanation of "Table is full" (Using, pages 5-121 and 8-15) states
- that you have attempted to LOAD more than five files. It actually occurs
- if you try to LOAD more than 16 files. Five files was the limitation of
- the Developer's Release. This is corrected in the second edition of the
- documentation.
-
-
- >>> LOCATE/CONTINUE
-
- To use CONTINUE, a search or scope condition must be specified in the
- preceding LOCATE command, although a LOCATE without a FOR or WHILE
- condition does not cause an error and positions the record pointer at the
- top of the file. However, following that LOCATE with CONTINUE returns the
- error message "CONTINUE without LOCATE".
-
- ASSIST does not prevent users from selecting Continue in this way. In
- ASSIST, executing Position:Locate with no condition positions the record
- pointer at the top of the file and activates Position:Continue. Choosing
- Position:Continue returns the error message "CONTINUE without LOCATE."
-
- This occurs in versions 1.0 and 1.1 of dBASE III PLUS.
-
-
- >>> LOOP
-
- The command verb LOOP does not appear in the second edition documentation
- index. An explanation of LOOP can be found on page U5-114 under the DO
- WHILE command.
-
-
-
- >>> MENUBAR.BIN
-
- The documentation for MENUBAR.BIN in the dBASE Programmer's Utilities
- states that the light bar can be moved within the menu with the eight
- cursor-movement keys and that Return and Esc are used to select items from
- the menu. However, it is not documented that the cursor-movement keys can
- be used to select items, as well as navigate through the menu. When Ctrl
- is used in conjunction with a cursor key, the item under the cursor is
- selected and the menu is exited without moving the cursor. These keys and
- their functions are shown in Table 2. The key code returned by MENUBAR
- corresponds to the INKEY() key codes.
-
- Extension Description Commands
-
- BAK Backup MODIFY COMMAND
- MODIFY STRUCTURE
- CAT Catalog CREATE CATALOG
- SET CATALOG TO
- DBF Database file COPY STRUCTURE TO
- COPY TO
- COPY...STRUCTURE EXTENDED
- CREATE
- CREATE FROM
- IMPORT
- JOIN
- TOTAL
- SORT
- DBT Memo field file CREATE
- MODIFY STRUCTURE
- COPY TO
- DIF VisiCalc file COPY TO...TYPE DIF
- FMT Format file CREATE SCREEN
- IMPORT
- FRM Report design
- file CREATE REPORT
- LBL Label design file CREATE LABEL
- MEM Memory variable
- file SAVE
- NDX Index file INDEX
- PRG Program,
- procedure MODIFY COMMAND
- QRY Query file CREATE QUERY
- SCR Screen design
- file CREATE SCREEN
- TBK Memo file backup MODIFY STRUCTURE
- TXT Text file COPY TO...TYPE DELIMITED
- COPY TO...TYPE SDF
- CREATE SCREEN (text image)
- SET ALTERNATE
- <Command> TO FILE
- WKS Lotus 1-2-3 file COPY TO...TYPE WKS
- VUE View file CREATE VIEW
- IMPORT
-
-
- >>> MODIFY STRUCTURE
-
- 1. MODIFY STRUCTURE generates the error "NET 803: Network path not found"
- if the database file is in the root directory of any physical drive or
- logical drive. Even if network drive F: is attached to the subdirectory
- \DBASE on the file server, it is still belongs to the logical root
- directory of drive F:. The work-around is to move the file to a
- subdirectory or
-
- COPY TO Temp
- MODIFY STRUCTURE
-
- After receiving the "NET 803" error message, the user must press A to
- abort. The database file structure will have been modified but zero
- records will remain in file, then
-
- APPEND FROM Temp
-
- 2. MODIFY STRUCTURE generates the error "File is already open" if the
- database structure contains a memo field and there are no records in the
- file.
-
- The work-around is to add one blank record to file.
-
-
- >>> Precedence of File Attributes
-
- Page 3-24 of the Networking section of the dBASE III PLUS Reference Manual
- states that "File and field privileges can be used to override the file
- access read/write attribute established at the operating system or network
- shell level." This is incorrect. Attributes of directories and files
- established at the network level always have precedence over the dBASE
- Administrator Protect mechanism.
-
-
- >>> Printing
-
- dBASE III PLUS handles printing differently from earlier versions of dBASE
- III. Earlier versions of dBASE III relied on DOS to handle printer status
- errors. All error messages were generated and handled by DOS. dBASE III
- PLUS uses a different DOS call to send characters to the printer port.
- This new routine is faster but also returns a printer port time-out error
- quicker. dBASE III PLUS checks the port status at initialization; errors
- occurring after initialization are handled by DOS. Because of these
- differences, it is possible to get error messages in dBASE III PLUS when
- none would not occur in dBASE III. The differences are:
-
- 1. When the print device is activated, dBASE III PLUS checks the printer
- port for two specific conditions: "Invalid printer port" and "Printer is
- either not connected or turned off." If neither condition is true but an
- error is still detected, dBASE III PLUS defaults to the "Printer not ready"
- error message. For example, on a parallel printer, pin 12 is used to
- signal a "paper out" condition. If pin 12 is missing or broken on a cable,
- dBASE III PLUS checks the status of the printer port, finds an error
- condition that does not meet one of the two specific conditions that are
- tested, and returns the default error message, "Printer not ready."
- "Invalid printer port" occurs when redirecting the printer to an invalid
- port, such as LPT4.
-
- "Printer is either not connected or turned off" may occur when redirecting
- the printer to a valid COM port and attempting to print when that port does
- not have a printer attached to it.
-
- 2. Because different DOS versions have different time-out intervals for the
- printer port, some DOS versions time out while waiting for the print buffer
- to empty. This will generate the DOS error message "Printer not ready.
- Retry? (Y/N)." This situation can be corrected by issuing the DOS command
-
- MODE LPT1:,,P
-
- The "P" parameter at the end of the command line above instructs DOS to
- infinitely retry the printer port. This prevents the port from timing
- out. Error conditions (such as paper out or printer not connected) may
- appear to hang the machine while DOS infinitely retries the port. Unless
- the error condition is resolved, a warm boot is required to terminate the
- process.
-
-
- >>> READKEY()
-
- If you terminate a full-screen operation in dBASE III PLUS with a Ctrl-W or
- Ctrl-End, READKEY() always returns 270, regardless of whether the contents
- were altered or not. In the Developer's Release, READKEY() returned a
- value of 14 if the field or variable was not changed. Additionally,
- READKEY() always returns a value of 12 when you terminate a full-screen
- operation with Esc or Ctrl-Q.
-
-
- >>> RENAME
-
- The RENAME command can move files between directories on the same disk
- drive. When the new filename includes a path different from the original
- filename, RENAME moves the file to the directory specified by the new
- path. For example,
-
- RENAME \DBASE\Test.TXT TO \DOS\Test.TXT
-
- Test.TXT is moved from \DBASE to \DOS, provided that the directory \DOS
- exists on the same disk drive. When renaming a file in a directory other
- than the default, the path of the destination filename is required. If the
- destination path is ignored, dBASE III PLUS moves the file to the default
- directory. When the destination drive is different from the source drive,
- dBASE III PLUS returns the error message "File already exists." [7].
-
- This is inconsistent with DOS, which renames files without moving them. The
- error message "Invalid parameter" is produced when a destination path is
- included in the DOS RENAME command.
-
-
- >>> REPLACE
-
- REPLACEing a field of a database file from another work area when the
- record pointer is at EOF() increments the record counter and appends a
- record to the file when the record pointer is moved to the new record.
- For example,
-
- USE Test1
- GO BOTTOM
- SKIP && Sets EOF() true.
- SELECT B
- USE Test2
- REPLACE Test1->Name WITH "XXXX"
- SELECT A
- GO RECNO()
-
- adds a new record to Test1 and the contents of Name are "XXXX".
-
- Issuing multiple REPLACEs to a database file when EOF() is true increments
- the record counter for each REPLACE executed; however, data is added to
- the current record only. Do not trust this method for appending records.
- This process occurs because the record counter is increased; but, the
- original data on the disk is not erased in the fields REPLACEd. This
- means that the information on the disk in the region of the new record
- becomes part of that record. When the data on the disk is from a
- previously DELETEd and PACKed record, the new record is marked for
- deletion. Other characters such as nulls and end-of-file markers can
- become embedded in the record. This will corrupt the database file and
- cause unpredictable results.
-
- When the field REPLACEd is an index key field, the results are slightly
- different. Performing a SEEK or FIND on the new expression returns the
- error message "No find" until REINDEX is issued.
-
- Multiple REPLACEs to the EOF() add only the last expression REPLACEd after
- REINDEX is issued, all other data is lost. DISPLAY STRUCTURE, GO BOTTOM,
- and RECCOUNT() reveal a record count consistent with the number of
- REPLACEs executed. COUNT displays the number of records added previously
- to the REPLACE command until REINDEX is issued. Attempting to GO/GOTO the
- new records produces the error message "Record is out of range" [5]. SKIP
- moves the record pointer through these records as if they were available.
- To reset the database file record count after multiple REPLACEs, issue
- PACK. This occurs in both versions of dBASE III PLUS.
-
- Key Function
-
- Return Select the item under the light bar.
- Esc Select the item under the light bar.
- Home Move the light bar to the first column, first row.
- PgUp Move the light bar to the first column, last row.
- End Move the light bar to the last column, first row.
- PgDn Move the light bar to the last column, last row.
- Ctrl-Home Select the item under the light bar.
- Ctrl-PgUp Select the item under the light bar.
- Ctrl-End Select the item under the light bar.
- Ctrl-PgDn Select the item under the light bar.
-
-
- >>> REPLACE
-
- In addition to the ability to change the contents of fields in work areas
- other than the currently selected one by creating a global field pool with
- SET FIELDS TO <field list> and then REPLACEing into the remote area, you
- can also REPLACE into the remote area by specifying the alias before the
- target field name. For example,
-
- * ---REPLACE with SET FIELDS.
- SELECT 1
- USE Fileone
- SELECT 2
- USE Filetwo
- SET FIELDS TO Fileone->Fieldone, Fieldtwo
- REPLACE Fieldone WITH Fieldtwo
-
- * ---REPLACE without a fields list.
- SELECT 1
- USE Fileone
- SELECT 2
- USE Filetwo
- REPLACE Fileone->Fieldone WITH Fieldtwo
-
-
- >>> REPLICATE()
-
- Once the error message "Execution error on REPLICATE(): String too large."
- [88] is produced, it does not reoccur until a valid numeric expression is
- included in REPLICATE(). For example,
-
- * ---The next line produces the error.
- mvar = REPLICATE("A",32766)
- * ---In the next line no error is produced.
- mvar = REPLICATE("A",32767)
- mvar = REPLICATE("A",10)
- * ---The next line produces the error.
- mvar = REPLICATE("A",32767)
-
- The result of REPLICATE() is a null string whenever the second argument is
- too large, regardless of whether an error message is returned. This is true
- of versions 1.0 and 1.1 of dBASE III PLUS.
-
-
-
- >>> REPORT FORM
-
- CREATE REPORT Options:Double space report causes double spacing between
- records only. All other portions of the REPORT FORM, including wrapped
- fields, are single spaced. This is true of both versions of dBASE III PLUS.
-
-
-
-
- >>> REPORT FORM
-
- In both versions 1.0 and 1.1 of dBASE III PLUS, the width of a REPORT FORM
- total is determined by the value of Contents:Column width. There are
- several conditions to consider:
-
- 1. With a total width greater than the Contents:Column width, the decimal
- portion of the total is truncated to accommodate the integer portion.
-
- 2. When the integer portion of the total exceeds the Contents:Column width,
- the total displays in scientific notation.
-
- 3. If the value of the total is greater than 9E+98, an overflow displays.
-
-
- >>> REPORT FORM (Memo Fields)
-
- If you plan to print a memo field from another work area in a REPORT FORM,
- including the alias as a part of the memo field name will not display the
- memo field information when you execute the REPORT FORM. You must instead
- include a SET FIELDS TO command before you CREATE REPORT and not include
- the memo field alias name in Columns:Field contents. If you select the
- memo field from the field list displayed by F10, delete the automatically
- inserted alias before you exit the Column:Fields contents.
-
- When you are ready to run your report, be sure to SET FIELDS TO the list of
- fields you are using first or you will get the error message "Syntax error
- in field expression" when you execute the REPORT FORM.
-
- In the following exmaple, Test1.DBF contains the memo field Notes.
-
- * ---CREATE a REPORT to printing memo fields from a
- * ---nonactive work area.
- SELECT 2
- USE Test1 INDEX Test1
- SELECT 1
- USE Test2
- SET FIELDS TO Name, Address, Test1->Notes
- CREATE REPORT Test1
-
- In Columns:Field contents enter Notes and do not include the alias name.
-
- This situation occurs in both versions of dBASE III PLUS.
-
-
- >>> REPORT FORM PLAIN
-
- The following are some undocumented notes on REPORT FORM PLAIN. These
- situations arise in both versions 1.0 and 1.1 of dBASE III PLUS.
-
- 1. Selecting PLAIN always reserves the first two lines of the first page of
- the report for a heading, even when the headings are blank.
-
- 2. Setting the Options:Lines per page equal to the printer form length
- causes alternate blank pages to be printed when the report is run. This
- happens because a form feed, CHR(12), is printed at the end of each page.
- When Options:Lines per page equals the form length, the CHR(12) is printed
- at the top of each new page causing a blank to be printed between printed
- pages.
-
- 3. Setting Options:Lines per page equal to one less than the form length
- prints a blank row between pages. This occurs because the CHR(12) is
- printed at the beginning of the last line on a page, skipping that line.
-
- >>> REPORT FORM TO PRINT
-
- To imbed printer control characters in Options:Page title, Group: headings,
- or Column:Heading, enter the control characters from the numeric keypad
- with an Alt-<key sequence> and add 128 to the ASCII value. The high order
- value is necessary as dBASE III PLUS filters low value ASCII characters as
- control keys.
-
- This procedure works only on printers that can strip off the eighth data
- bit with the printer set to strip off the eighth bit. Stripping off the
- eighth bit causes characters whose ASCII values are greater than 127 to be
- interpreted as 128 less than their actual value.
-
- To enter an Alt-<key sequence>, hold down Alt and enter the ASCII decimal
- value of the control code on the numeric keypad. For example, to enter
- CHR(15), enter Alt-143 (15 + 128 = 143). This works in both versions of
- dBASE III PLUS.
-
-
- >>> RETURN
-
- With the ON ESCAPE active, pressing Esc at a WAIT, INPUT, or ACCEPT command
- causes the program to resume at the line following the WAIT, INPUT, or
- ACCEPT command with no error messages.
-
- In version 1.0, pressing Esc in response to an INPUT statement with SET
- ESCAPE OFF hangs the system, while an Esc at a WAIT statement returns to
- the dot prompt.
-
-
-
- >>> RESTORE
-
- The dBASE III Reference Manual for all versions incorrectly states about
- the RESTORE command that any memory variables STOREd as PUBLIC remain
- PUBLIC if the ADDITIVE option is used. The ADDITIVE option to RESTORE will
- allow the user to RESTORE variables as PUBLIC only if they are declared
- PUBLIC before the RESTORE FROM <Filename> ADDITIVE command is issued. If
- the variables are not explicitly declared PUBLIC, they will be RESTOREd as
- PRIVATE variables, regardless of their status when STOREd and SAVEd. For
- example,
-
- PUBLIC one, two
- STORE 1 TO one, two
- SAVE TO Mem
- CLEAR ALL
- RESTORE FROM Mem ADDITIVE <-- Variables are RESTOREd
- without being redeclared PUBLIC.
-
- will create PRIVATE variables "one" and "two," while,
-
- PUBLIC one, two
- STORE 1 TO one, two
- SAVE TO Mem
- CLEAR ALL
- PUBLIC one, two <-- Variable is redeclared PUBLIC.
- RESTORE FROM Mem ADDITIVE
-
- creates PUBLIC variables "one" and "two."
-
-
- >>> RUN / !
-
- RUN / ! produces the error message "Insufficient memory" [43] if the
- maximum number of files (15) are open. To use RUN / !, a file handle must
- be available. However, when ADDFILES.BIN from the dBASE Programmers
- Utilities is loaded and used to open the maximum 20 files, RUN / !
- executes without error. This is true for every version of dBASE III PLUS.
-
-
-
- >>> Scientific Notation
-
- dBASE III PLUS has a limited ability to handle scientific notation.
- Scientific notation is a number followed by the letter "e" followed by an
- integer, where the integer is a power of ten that is multiplied by the
- first number. For example,
-
- 1e4 = 1 * 10^4 = 10000
- -1e4 = -1 * 10^4 = -10000
-
- dBASE III PLUS can use this notation for variable initialization, field
- entry, APPENDing from text files, and in all numeric expressions.
-
- Variable initialization: The command
-
- mem = 1e4
-
- or
-
- mem1 = "1e4" mem = VAL(mem1)
-
- stores 10000 to memory variable "mem."
-
- Field entry: The command
-
- REPLACE <field name> WITH 1e4
-
- stores 10000 to <field name>.
-
- APPENDing FROM text files: If an SDF text file contains the number 1e4,
- APPENDing it into a database file puts 1e4 into a numeric field--not 10000
- as might be expected. Numeric expressions involving this field generate
- valid answers. This method is the only one you can use because scientific
- notation cannot be entered during full-screen editing. To convert fields
- in scientific notation to decimal, use this command syntax:
-
- REPLACE ALL <field name> WITH <field name>
-
- dBASE III PLUS has a numeric accuracy of 15.9 digits, 13 digits when
- comparing non-zero numbers. Operations that exceed the accuracy may
- produce the error message "Numeric overflow (data was lost)."
-
- Numeric expressions:
-
- ? 1e4 * 3
-
- displays 30000.
-
-
- >>> Converting Numbers to Scientific Notation
-
- Although dBASE III PLUS allows you to convert numbers from scientific
- notation to numbers in {decimal} notation (See...), it does not allow you
- convert decimal notation to scientific notation. The following programs,
- Sci.PRG, converts numbers in decimal format to scientific notation.
-
- To use Sci.PRG, call it with the following general syntax:
-
- ret_val = ""
- DO Sci WITH <number>, <decimals>, ret_val
-
- where the arguments are defined as follows:
-
- number ::= integer to be converted
- decimals ::= number of decimal places
- ret_val ::= character variable to accept return value
-
- Also included is a sample program, SciTest.PRG, that demonstrates how to
- use Sci.PRG to list a set of numbers from a database file in scientific
- notation.
-
-
-
- * Program ...: Sci.PRG
- * Author ....: Kenneth N. Getz
- * Date ......: March 1, 1987
- * Version ...: dBASE III PLUS
- * Note(s) ...: Converts x to scientific notation correct to decimal number
- * of decimal places. Works for any positive number within
- * dBASE III PLUS limits.
- *
- PRIVATE ALL
- PARAMETERS x, dec, ret_val
- y = LOG(ABS(x)) / LOG(10) && Find order of magnitude.
- y = IIF(INT(y) = y, INT(y) + 1, INT(y))
- y = IIF(ABS(x) < 1,y - 1,y)
- z = x / 10^y && Normalize the number (0 < z < 10).
- order = 10^dec && Find order of rounding accuracy.
- fudge = IIF(x < 0, -.5, .5)
- q = INT( z * order + fudge)/order
- ret_val = LTRIM(STR(q,15,dec)) + "E" + IIF(ABS(x) < 1,"-","+") +
- LTRIM(STR(ABS(y)))
- RETURN
- * EOP Sci.PRG
-
-
-
- * Program ...: SciTest.PRG
- * Author ....: Kenneth N. Getz
- * Date ......: March 1, 1987
- * Version ...: dBASE III PLUS
- * Note(s) ...: A test program for Sci.PRG. Uses the database SciTest.DBF
- *
- PRIVATE ALL
- PARAMETERS decimals
- STORE SPACE(30) TO ret_val
- USE Scitest
- DO WHILE .NOT. EOF()
- ? num
- DO Sci WITH num, decimals, ret_val
- ?? IIF(num < 0, SPACE(10), SPACE(11)) + ret_val
- SKIP
- ENDDO
- RETURN
- * EOP SciTest.PRG
-
-
- >>> Semicolon
-
- In dBASE III PLUS, you cannot continue commands issued at the dot prompt
- with a semicolon. The dBASE III PLUS command line is a 254-character
- horizontal scroll space. Previous versions of dBASE III allowed you to
- continue a dot prompt command line with a semicolon.
-
-
- >>> SET ALTERNATE TO
-
- You can use the following program, Cpsep.PRG to COPY a database file to a
- flat ASCII file with no separators between either fields or records. Such
- a file differs from the SDF format in that each record is not separated
- with a carriage return/line feed pair.
-
- * Program ...: Cpsep.PRG
- * Author ....: Quinn Wildman
- * Date ......: January 1, 1987
- * Note(s) ...: Creates a text file image of a database file with
- * no record separators.
- *
- SET TALK ON
- ACCEPT "Enter name of text file: " TO txtfile
- ACCEPT "Enter name of database file: " TO dbfile
- USE &dbfile
- SET ALTERNATE TO &txtfile
- SET ALTERNATE ON
- DO WHILE .NOT. EOF()
- cnt = 1
- DO WHILE LEN( FIELD( cnt )) <> 0
- macro = FIELD( cnt )
- ?? ¯o
- cnt = cnt + 1
- ENDDO
- SKIP
- ENDDO
- SET ALTERNATE OFF
- CLOSE ALTERNATE
- CLEAR ALL
- SET TALK ON
- * EOP Cpsep.PRG
-
- >>> SET CATALOG ON
-
- If you assign an ALIAS when you USE a database file, the catalog does not
- store the ALIAS but instead stores the filename as the ALIAS. For example,
-
- SET CATALOG TO <filename>
- USE Test1 ALIAS Testfile
- SELECT 10
- LIST
- ^------ This show the ALIAS as "Test1,"
- not "Testfile."
-
-
- >>> SET CATALOG ON
-
- With an active Catalog and SET CATALOG ON, creating a new index or issuing
- SET INDEX TO an existing index file does not prompt for a file title
- description as documented in the Using dBASE III PLUS manual. Instead,
- dBASE III PLUS places the index key expression in the Catalog field Title.
-
-
- >>> SET CATALOG TO ?
-
- Attempting to open a catalog file that has the same name as an open
- database file or assigned alias name produces the error message "ALIAS name
- already in use." [24]. To avoid the error message, assign a different
- alias to the database file or close the database file before executing SET
- CATALOG TO. For example,
-
-
- USE Test
- SET CATALOG TO Test
-
-
- produces the error message. This occurs in both versions 1.0 and 1.1 of
- dBASE III PLUS.
-
-
- >>> SET COLOR
-
- The SET COLOR TO command changed somewhat in the Developer's Release and
- dBASE III PLUS. Formerly, colors could be referenced by number or letter
- code. With the Developer's Release and dBASE III PLUS, only letter codes
- are accepted. Additionally, there are several new options. Black can now
- be referenced with the letter code N, inverse video with the letter code I,
- and the screen can be blanked with the code X. The following table shows
- all the default color attributes for dBASE III from version 1.0 through
- dBASE III PLUS.
-
- Color Attribute Table
-
- Developer's Release
- dBASE III dBASE III PLUS
- Color Letter Number Letter Only
-
- Black <space> 0 | N or <space>
- Blue B 1 | B
- Green G 2 | G
- Cyan BG 3 | BG
- Red R 4 | R
- Magenta BR 5 | BR
- Brown GR 6 | GR
- White W or RB 7 | W or RB
-
- Other
-
- Blank | X
- Blinking * | *
- High intensity + | +
- Inverse video | I
- Underline U | U
-
- Three other capabilities are added to color in dBASE III PLUS. First, there
- is a new function, ISCOLOR(), that returns a true value (.T.), if your
- monitor is in color mode. Second, SET COLOR supports a toggle syntax,
- ON/OFF, to toggle your monitor between color and monochrome modes, if your
- machine supports both. Lastly, a background option is added for machines
- that cannot set the background of individual characters with the standard
- and enhanced options.
-
-
- >>> SET COLOR TO
-
- It is not documented that the U and I arguments of SET COLOR TO, which are
- for monochrome monitors, set the color to black when used on a color
- monitor. For example, on a color monitor
-
- SET COLOR TO U/I
-
- is equivalent to
-
- SET COLOR TO N/N
-
-
-
- >>> SET COLOR TO
-
- Using an attribute (high intensity or blinking) of colors with SET COLOR TO
- applies to the foreground setting only and has no effect on background
- colors. In fact, if you assign an attribute to a background color, dBASE
- III PLUS passes the attribute to the foreground color instead. Because of
- this, the colors gray (N+) and yellow (GR+) appear as black and brown
- respectively when used for background settings.
-
- Keep in mind that for color settings there are three basic settings
- (display, enhanced, and border) and that within each one there are both
- foreground and background colors.
-
- SET COLOR TO [[<standard>][,<enhanced>][,<border>]]
-
- where
-
- standard ::= [<foreground>][/<background>]
- enhanced ::= [<foreground>][/<background>]
- border ::= [<foreground>][/<background>]
- and
-
- foreground ::= [<letter>[{attribute}]]
- background ::= <letter>
- It appears that the attribute although it affects the color is a
- function of the setting. Each setting, therefore, can have only one
- attribute which is applied to the foreground color. This behavior is in
- contrast to dBASE III version 1.0 and 1.1, where attempting to assign an
- attribute to a background color did not pass the attribute to the
- foreground color.
-
-
- >>> SET DATE FRENCH
-
- The format of date variable display varies between versions 1.1 and the
- Developer's Release and dBASE III PLUS, when SET DATE is FRENCH. For
- example,
-
- dBASE III Developer's Release
- Version 1.1 dBASE III PLUS
-
- SET DATE FRENCH DD.MM.YY DD/MM/YY
-
- The Developer's Release and the dBASE III PLUS displays are identical to
- SET DATE BRITISH.
-
-
- >>> SET DELETED ON
-
- SET DELETED ON can affect the FIND command when there is more than one
- record in the database file with the same index key. For example, suppose
- there are two "Johnsons" in the database file. The first is marked for
- deletion and the second is locked with RLOCK() at a different workstation.
- If SET DELETED is ON, and you try to FIND "Johnson", you will get the
- message "No find" instead of the expected "Record is in use by another."
- Under any other circumstance, a FIND on a record locked with RLOCK()
- returns the message "Record is in use by another" and positions the record
- pointer to that record.
-
- There is no work-around at this time.
-
-
- >>> SET ESCAPE OFF
-
- Esc terminates an active READ regardless of the status of SET ESCAPE in
- both versions of dBASE III PLUS.
-
- Documentation Index
-
- The index for the second edition of the documentation contains incorrect
- page references. The specific references are shown in Figure 2.
-
- Item Incorrect Correct
- --------------------------------------------------------------
- Function keys (Page X-17) U5-224 - U5-225 U5-234
- Memo field (Page X-20)
- adjusting width for output U5-234 U5-243
- editing in programs P5-16 P5-26
-
-
- >>> SET FIELDS TO
-
- Issuing the SET FIELDS TO <Field list> command automatically SETs FIELDS
- ON, regardless of the FIELDS status prior to issuing the SET FIELDS TO
- command.
-
- The dBASE III PLUS Reference Manual states on page 5-169 of the Using
- section, under the SET FIELDS TO command, "The list of fields is not active
- unless the SET FIELDS command is ON." This statement implies that the
- command SET FIELDS ON must be executed explicitly to activate the current
- field list after creating it. Anytime the command SET FIELDS is executed
- either to create a fields list or to add to one, FIELDS are SET ON.
-
-
- >>> SET FILTER TO
-
- It is not documented in any of the dBASE III PLUS reference manuals that
- certain commands ignore the SET FILTER TO condition. Specifically, the
- commands DISPLAY (current record), DISPLAY RECORD <n>, GO/GOTO, or any
- command with the scope RECORD <n> or NEXT <n>. For example, if the SET
- FILTER TO condition excludes record five and GOTO 5 is executed, a
- subsequent DISPLAY reveals the contents of the record.
-
-
- >>> SET HISTORY OFF
-
- Page U5-180 of the original documentation incorrectly states, "The command
- SET HISTORY OFF disables the history feature so that prior commands can't
- be recalled." Page U5-237 of the revised documentation incorrectly states,
- "The command SET HISTORY OFF clears the history buffer."
-
- The command SET HISTORY OFF suppresses the storage of commands into the
- history buffer. Commands entered in HISTORY prior to SET HISTORY OFF may
- still be displayed, edited, and re-executed. To clear the history buffer
- of commands, SET HISTORY TO 0.
-
-
- >>> SET ORDER TO
-
- You must reposition the record pointer after executing SET ORDER TO in
- dBASE III PLUS. The easiest way to do this is to issue the command:
-
- GO RECNO()
-
- This will cause the record pointer to reposition itself to the current
- record position updating the internal record pointer. If, however, EOF()
- returns true (.T.), this won't work. In this case, use the following
- command:
-
- GO IIF(EOF(), RECCOUNT(), RECNO())
-
-
- >>> SET PATH TO
-
- The original documentation does not include the path length limitations for
- the SET PATH TO command. The path is limited to 60 characters. Exceeding
- that limit will produce the error message "Maximum path length exceeded"
- [146].
-
-
- >>> SET PROCEDURE TO
-
- Beginning in Developer's Release, you can have a command file that SETs
- PROCEDURE to itself, effectively allowing you to create single file
- applications such as those you could create with dBCODEing and dBLINKing.
-
- Additionally, you can CLOSE the PROCEDURE within the calling program. Be
- sure, however, you do not CLOSE PROCEDURE within any of the procedures or
- dBASE III PLUS will return the error message "File is already open."
-
- For example,
-
- * ---Sayhello.PRG
- SET PROCEDURE TO Sayhello && SETs PROCEDURE TO itself.
- DO Proc1
- DO Proc2
- CLOSE PROCEDURE
- RETURN
-
- PROCEDURE Proc1
- ? "Hi there, I'm procedure number One and I love black beans."
- RETURN
-
- PROCEDURE Proc2
- ? "Howdy, I'm procedure number Two and I'm a Taurus."
- RETURN
- * EOP Sayhello.PRG
-
- In dBASE III version 1.1, doing this returned the error message "File is
- already open."
-
-
- >>> SET RELATION TO
-
- The description of "Cyclic relation" under Error Messages contains the line
- "SET RELATION, without any parameters, disconnects all relations from the
- currently selected work area." But SET RELATION with no arguments
- produces a "Syntax error." The proper command is SET RELATION TO with no
- argument. This is corrected in the second edition of the documentation.
-
-
- >>> SET RELATION TO
-
- Throughout the documentation for dBASE III PLUS, there is some ambiguity
- about the various ways you can link database files with SET RELATION TO.
-
- SET RELATION TO relates two database files in three different ways.
-
- 1. You can relate two database files with a key expression allowing you to
- create connections between database files based on value. It is important
- to stress that you are not confined to a single common field. The linking
- expression can be any legitimate dBASE III PLUS expression. To work, the
- key expression must return a value from the source work area that matches a
- value in the master index file of the target work area. Because the
- relation is created by an expression, you can take two dissimilar database
- file structures that contain common values and create a relation between
- them. In exactly the same way, you can create a relation between database
- files that have common fields. In both cases, the mechanism is the same:
- the relation is created by an expression.
-
- 2. Another way to relate database files is by record number. This type of
- relation allows you to link two database files having no common field
- values but have a one-to-one relation based on physical position. Record
- one in the source corresponds to record one in the target file and so on.
- Generally, you will use this formulation to create a virtual database file
- where you need a number of fields greater than the dBASE III PLUS limit of
- 128 per database file.
-
- When the record pointer moves in the source database file, the record
- pointer in the target moves to the same record number as the source
- record. For example,
-
- * ---Setup and syntax with a physical relation.
- SELECT B
- USE File2
- SELECT A
- USE File1 INDEX File1
- SET RELATION TO RECNO() INTO File2
- * ---List records from File1 and File2.
- DO WHILE .NOT. EOF()
- ? Field1, Field2, File2->Field1, File2->Field2
- * ---Advance File1 and File2 pointer.
- SKIP
- ENDDO
-
- * ---Setup and syntax with no relation.
- SELECT B
- USE File2
- SELECT A
- USE File1 INDEX File1
- * ---List records from File1 and File2.
- DO WHILE .NOT. EOF()
- ? Field1, Field2, File2->Field1, File2->Field2
- * ---Advance the File1 pointer.
- SKIP
- * ---Advance the File2 pointer.
- recpos = RECNO()
- SELECT B
- GO recpos
- SELECT A
- ENDDO
-
- In order to build various index sort orders, put all of your key fields in
- the master database file as the diagram below indicates. This is important
- since a relation based on RECNO() precludes the use of an index file in the
- target work area.
-
- Master -----> Sub1 ------> Sub2 (Keys)
- (Non-keys) (Non-keys)
-
- 3. The last type of relation is a physical link between database files
- based on a numeric expression. If the linking expression evaluates to
- numeric and the target database file is not INDEXed, then the target record
- pointer moves to the record number returned by the linking expression each
- time the source database file pointer moves.
-
- For example, the following linking expression relates two unINDEXed
- database files so each pair of adjacent records in the source database file
- points to a single record in the target file.
-
- IIF(MOD(RECNO(),2)=1,INT(RECNO()/2)+1,INT(RECNO()/2))
-
- Record numbers one and two in the source point to record number one in the
- target, three and four in the source point to two in the target, and so on.
-
- This type of relation can be used to build virtual data structures based on
- a link that is a combination of value and physical location.
-
- In general, it is important to your mastery of dBASE to understand the
- truly dynamic nature of relating database files with SET RELATION TO.
-
- For more information on SET RELATION TO, refer to the page D3-11 of the
- April 1985 issue of TechNotes.
-
-
- >>> SET RELATION TO
-
- In versions 1.0 and 1.1 of dBASE III, a relation could be released with the
- command SET RELATION. In the Developer's Release and dBASE III PLUS, this
- command returns a syntax error although it releases the RELATION. The
- proper and supported command syntax to release a relation is SET RELATION
- TO.
-
-
- >>> SET SCOREBOARD/SET STATUS
-
- The SET SCOREBOARD ON/OFF and SET STATUS ON/OFF commands will clear the
- entire screen when issued in dBASE III PLUS. In previous versions, SET
- SCOREBOARD ON/OFF would affect only the SCOREBOARD area of the screen.
-
-
- >>> SET VIEW TO
-
- If any change has been made to any of the component parts of a view,
- invoking that view file with SET VIEW TO will return an error message. The
- specific message will depend on the error in the view file.
-
- For example, if the name of field in the fields of the view has been
- changed by MODIFYing the STRUCTURE of one of the constituent database
- files, issuing the SET VIEW TO command will return "Variable not found."
- Once this condition has occurred, there is no way to open the view file and
- modify it, as MODIFY VIEW will return the same error message. The file
- must be deleted and re-created, or the environment must be made consistent
- with the view file once more.
-
-
- >>> STORE
-
- Attempting to STORE a string containing "&&" to a memory variable produces
- the error message "Unterminated string" when executed. This is because the
- double ampersands are interpreted as an in-line comment, effectively
- removing the closing quotation mark from the command line. To work around
- this, split the character expression between the ampersands into two
- expressions and concatenate them when assigning them to the memory
- variable. For example, the following is a successful instance of embedding
- "&&" in a string.
-
- STORE "Before the &" + "& and after." TO mvar
-
-
- >>> Tandy printers
-
- Some older Tandy printers do not recognize CHR(12) as a form feed
- character. To correct this problem, install the device driver LPDRVR.SYS
- in CONFIG.SYS. LPDRVR.SYS is provided with Tandy DOS 3.x. LPDRVR.SYS
- keeps track of the number of carriage return/line feeds sent to the
- printer. When a form feed is transmitted, LPDRVR.SYS sends the remaining
- number of carriage return/line feeds necessary to reach the top of the
- next page. To install LPDRVR.SYS, add the following line to CONFIG.SYS:
- DEVICE = LPDRVR.SYS
-
- If LPDRVR.SYS is not available, it may be obtained from Tandy. The phone
- number for hardware support is (817)338-2394 and the phone number for
- software support: (817)338-2390 and (817)338-2392 or leave a message at
- their main switchboard, (817)390-3011.
-
-
- >>> TRANSFORM()
-
- In both versions 1.0 and 1.1 of dBASE III PLUS, including a TRANSFORM()
- expression with a PICTURE function in the CREATE REPORT Columns:Contents
- may require resetting Contents:Width to a value greater than the default.
- When the expression to be TRANSFORMed is numeric, using the default
- Contents:Width of 10 forces the displays to wrap to a second line.
- Increasing the Contents:Width corrects the problem.
-
- The following is a list of functions and the corresponding minimum values:
-
- Function Width
- -----------------------------------------------
- TRANSFORM(<field name>, "@C") 16
- TRANSFORM(<field name>, "@X") 16
- TRANSFORM(<field name>, "@(") 15
- TRANSFORM(<field name>, "@Z") 13
- TRANSFORM(<field name>, "@B") LEN(<field name>)
-
-
- >>> Trapping the Esc Key
-
- In dBASE III PLUS, version 1.1, SET ESCAPE OFF is ignored by the WAIT,
- INPUT, and ACCEPT commands. If the user presses Esc in response to any of
- these commands, dBASE III PLUS responds with the "Cancel, Ignore, or
- Suspend?" message, and the user can cancel the application program.
-
- The work-around is to add an ON ESCAPE command to the application:
-
- ON ESCAPE DO Esc_back
-
- Esc_back.PRG needs just one line:
-
-
-
- >>> UNINSTAL.BAT
-
- UNINSTAL.BAT deletes CONFIG.SYS, if it exists, in the target drive default
- directory. This is potentially dangerous if the default directory of the
- target disk is the root directory. Some systems, such as older Bernoulli
- drives, require CONFIG.SYS to boot. Use caution when uninstalling dBASE
- III PLUS from a root directory.
-
- >>> UPDATE
-
- If you are trying to UPDATE one database file from another and the relation
- between them is many-to-one, you may have found that the UPDATE command
- does not support this formulation. The UPDATE command only updates the
- first instance in the target database file. This means that the UPDATE
- command is useful only when the relation between the source and the target
- database files is one-to-one. To update your many-instance file from the
- single-instance file, use the REPLACE command in combination with SET
- RELATION. For example,
-
- SELECT 2
- USE <source> INDEX <source index>
- SELECT 1
- USE <target> INDEX <target index>
- SET RELATION TO <key> INTO <source>
- REPLACE ALL <target field1> WITH <source>-><field1>,;
- <target field2> WITH <source>-><field2>,;
- <target field3> WITH <source>-><field3>
-
-
- >>> USE
-
- If byte 15 of a .DBF file header contains a value other than a null, USEing
- the file in dBASE III PLUS produces the error message "Database is
- encrypted." This byte is used by the dBASE Administrator to mark a file as
- encrypted. Earlier versions of dBASE III ignored this byte. If you
- encounter this error message when USEing a database file in single-user
- mode, run NEWHEAD.BAS or use DEBUG to change the byte back to a null. Note
- that in order to use DEBUG, your database file must be smaller in size than
- the amount of free memory available prior to running DEBUG.
-
-