|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 48768 (0xbe80)
Types: TextFile
Names: »EXAMPLES.DOC«
└─⟦ea621760d⟧ Bits:30005267 dBase II - uoriginal diskette
└─⟦this⟧ »EXAMPLES.DOC«
CHECKBOOK BALANCING SYSTEM
This example illustrates how a dBASE system can be designed for
checkbook balancing and check register maintenance. The program
helps automate the procedure we all experience when we receive
the monthly statement from the bank. This system could be used
for personal or business applications.
The system uses an user defined database file and six associated
command files. The six dBASE command files and their functions
are:
1. XMENU - System controller.
2. XNEWENTR - Enters new checks into user database file.
3. XDEPOSIT - Enters new deposits into user database
file.
4. XCANCEL - Enters cancelled checks into user database
file.
5. XDEPCANC - Enters cancelled deposits into user
database file.
6. XBALANCE - Sums the total outstanding checks and
deposits. Ask for ending balance from bank
statement and computes the current
checkbook balance.
The following conventions are used in the text that follows. The
character > sigifies the system prompt. (cr) signifies a user
keyboard carriage return. Lower case text enclosed in square
brackets ÆÅ denotes document explanatory text and is not part of
any file or run stream and should not be entered into the user's
runstream.
Prior to using the system a user specified database file must be
available for the command files to access. In any database
project, one must plan the data fields that will be required. For
this example, the following fields are selected:
NO - The check number, INTEGER
TO - The recipient of the check, CHARACTER
CAN - The cancelled/not-cancelled status of a check or
deposit, LOGICAL.
DATE - Date when the check was written, CHARACTERS
MEMO - Code for users accounting files:
A-Advertising B-Bank Charges
C-Car + Truck D-Dues + Publications
F-Freight I-Insurance
L-Legal Expenses O-Office Supplies
P-Postage R-Rent
T-Telephone X-Taxes
.PA
Enter the following to CREATE the database structure. The
database file name is CHECKER.
>DBASE(cr) Æinitiate the dBASE system to begin processingÅ
ENTER TODAYS DATE AS MM/DD/YY OR RETURN FOR NONE : (cr)
*** dBASE II VER 2.xx
.CREATE(cr) Ætells dBASE you want to create a fileÅ
FILENAME:CHECKER(cr) Æasks what you want to name fileÅ
ENTER RECORD STRUCTURE AS FOLLOWS:
FIELD NAME,TYPE,WIDTH,DECIMAL PLACES
001 NO,N,4(cr) Æfield name is NO with 4 Numeric charsÅ
002 TO,C,30(cr) Æfield name is TO with 30 CharactersÅ
003 AMT,N,10,2(cr) Æsimilar explanations for rest of fileÅ
004 CAN,L(cr)
005 DATE,C,8(cr)
006 MEMO,C,10(cr)
007 (cr)
INPUT NOW?:N Æindicates not going to enter data to file nowÅ
.QUIT(cr) Æexit the dBASE systemÅ
*** END RUN dBASE II *** ÆdBASE message to userÅ
.pa
The dBASE command files that are used to do the checkbook
processing are listed below. These were built with a text editor
(a word processor can be used). The CP/M extension should be
specified. For dBASE command files, it is ".CMD". For example,
the first command file is XMENU, it is entered into the text
processor as "XMENU.CMD".
Things to especially notice in this example are:
1. How the menu entries are distinguished by the DO CASE
programming structure.
2. A "DO WHILE T" is used to repeat the menu. DO WHILE T
essentially says "DO this segment of commands WHILE the value of
T is .TRUE.". Since T is a literal .TRUE., its value is always
TRUE and the loop will never terminate. Well almost never, there
is a CANCEL command inside the DO WHILE that aborts the entire
command file. This is called a "DO FOREVER" in some structured
languages.
3. In general, command files should not be written that make
explicit references to specific database files. This is avoided
in this example. The database name is supplied by the user in
response to the line 'ACCEPT "Enter check database name" to DBF'
and the subsequent 'USE &DBF' instead of something like 'USE
B:CHECKS'. This permits this system of command files to be used
with any number of seperate checkbook databases.
4. In general, command files should not be written that make
explicit references to specific disk drives. This is avoided in
this example by the lines 'ACCEPT "Enter disk drive containing
command files as 'A:' or 'B:'" to DISK' and 'SET DEFAULT TO
&DISK'.
NOTE - EXAMPLE dBASE CHECK BALANCER COMMAND FILE PROGRAM
*
*
* - turn off display of commands to screen
SET TALK OFF
* - enter user database file name
ACCEPT "Enter check database name" to DBF
* - access database file
USE &DBF
* - specify disk containing command files
ACCEPT "Enter disk drive containing command files as 'A:' or 'B:'" to DISK
SET DEFAULT TO &DISK
* - this is text that is displayed on the screen
DO WHILE T
* DO WHILE T means DO WHILE TRUE I.E. DO FOREVER
* The DO WHILE will be terminated by a CANCEL command internally
?
?
?
? ' CHECK BOOK BALANCER MENU'
?
? ' 0 - EXIT'
? ' 1 - ENTER NEW CHECKS'
? ' 2 - ENTER DEPOSIT'
? ' 3 - ENTER CANCELLED CHECKS'
? ' 4 - ENTER CANCELLED DEPOSITS'
? ' 5 - BALANCE'
?
? ' ENTER DESIRED ACTION'
* - reading user response
WAIT TO ACTION
DO CASE
* - testing to exit
CASE ACTION='0'
SET TALK ON
* - return to dBASE system
CANCEL
* - test for new checks
CASE ACTION='1'
* - enter new check data
DO XNEWENTR
* - test for new deposits
CASE ACTION='2'
* - enter new deposit data
DO XDEPOSIT
* - test for cancelled checks
CASE ACTION='3'
* - enter cancelled check data
DO XCANCEL
* - test for cancelled deposits
CASE ACTION='4'
* - enter cancelled deposit data
DO XDEPCANC
* - test for balancing check book
CASE ACTION='5'
* - compute ending balance
DO XBALANCE
* - non-valid entry to the menu
OTHERWISE
? 'Invalid entry, re-enter'
ENDCASE
ENDDO
RETURN
.pa
The XNEWENTR command file is analogous to recording the name and
amount of the check in our checkbook as we write them.
Notice the '@' commands that "paint" a picture on the screen
NOTE - EXTENDED NEWENTR COMMAND FILE TO ENTER NEW CHECKS
*
* - clear screen
ERASE
* - position to bottom of database file
GO BOTTOM
* - initialize date
STORE '01/01/81' TO CH:DAT
DO WHILE T
* initialize memory variables so that READ will have a length to mark
STORE ' ' TO CH:TO
STORE 0.00 TO M:AMT
STORE ' ' TO CH:MEMO
STORE NO+1 TO M:NO
* - this is text to read check data
@ 5,0 SAY 'CHECK ENTRY ENTER CHECK NUMBER OF ZERO TO EXIT'
@ 6,0 SAY 'IF CHECK NUMBER=0, ENTER CARRIAGE RETURNS FOR OTHER ENTRIES'
@ 7,0 SAY 'CHECK NUMBER ' GET M:NO
@ 8,0 SAY 'PAY TO THE ORDER OF ' GET CH:TO
@ 9,0 SAY 'AMOUNT OF CHECK ' GET M:AMT
@ 10,0 SAY 'DATE WRITTEN ' GET CH:DAT PICTURE '99/99/99'
@ 11,0 SAY 'PURPOSE OF CHECK'
@ 13,0 SAY 'A - ADVERTISING B - BANK CHARGES C - CAR + TRUCK'
@ 14,0 SAY 'D - DUES + PUBLICATIONS F - FREIGHT I - INSURANCE'
@ 15,0 SAY 'L - LEGAL EXPENSES S - OFFICE SUPPLIES P - POSTAGE'
@ 16,0 SAY 'R - RENT T - TELEPHONE X - TAXES'
@ 18,0 SAY 'ENTER PURPOSE LETTER' GET CH:MEMO
READ
IF M:NO=0
RETURN
ENDIF
* - put blank card into database file
APPEND BLANK
* - put check data into database file
REPLACE NO WITH M:NO,TO WITH CH:TO,AMT WITH M:AMT;
DATE WITH CH:DAT,CAN WITH F,MEMO WITH !(CH:MEMO)
ENDDO
.pa
The XDEPOSIT command file records the date and amount of any
deposits to the checkbook.
NOTE - DEPOSIT COMMAND FILE TO ENTER NEW DEPOSITS
*
REMARK ENTER DEPOSIT AMOUNT OF 0 TO EXIT
* - initialize date value
STORE '01/01/81' TO C:DAT
DO WHILE T
?
?
* - reading deposit entries
INPUT "Amount of Deposit " TO C:AMT
* - if deposit amount equals 0, exit command file
IF C:AMT=0
RETURN
ENDIF
STORE C:DAT TO OLD:DATE
* - read date of deposit
ACCEPT "Date of Deposit as MM/DD/YY " TO C:DAT
* - if date is blank, use current date
IF C:DAT=' '
STORE OLD:DATE TO C:DAT
ENDIF
* - ask if all fields are correct
INPUT "ARE ALL FIELDS CORRECT ? " TO GO:NOGO
* - test for correct data
IF .NOT.GO:NOGO
LOOP
ENDIF
* - put blank card into database file
APPEND BLANK
* - put deposit data into database structure
REPLACE NO WITH 0,TO WITH 'DEPOSIT',AMT WITH C:AMT
REPLACE DATE WITH C:DAT,CAN WITH F
ENDDO
.pa
The XCANCEL command file is analogous to checking off the
canceled checks we receive with the bank statement.
NOTE - CANCELS COMMAND FILE TO ENTER CANCELLED CHECKS
*
* - message to be displayed on screen
REMARK ENTER CHECK NUMBER OF 0 TO EXIT
* - loop while check number not equal to zero
DO WHILE T
?
INPUT "ENTER CANCELLED CHECK NO" TO C:CAN
* - testing for zero check number
IF C:CAN=0
RETURN
ENDIF
* - position to top of database file
GO TOP
* - search for cancelled check number
LOCATE FOR C:CAN=NO
* - testing to see if at end of database file
IF .NOT.EOF
* - if not at end of file
?
`* - display check data
DISP OFF 'Payed to ',TO,' on ',DATE
DISP OFF 'Amount of check is ',AMT
* - ask if this is right check
INPUT 'Is this the one? (Y/N)' to ANSWER
IF ANSWER
* - change logical flag for cancelled check
REPLACE CAN WITH T
ENDIF
ELSE
* - message to tell user his check is not in file.
DISP OFF 'Check ',C:CAN,' cannot be found'
ENDIF
ENDDO
RETURN
.pa
The XDEPCANC command file enters the cancelled deposit data
furnished on the bank statement.
note - DEPOSIT CANCELLATION PROGRAM
*
* - position to top of database file
GO TOP
DO WHILE T
* - find first uncancelled deposit
LOCATE FOR NO=0 .AND. .NOT. CAN NEXT 65000
* - if not at end of character field
IF .NOT.EOF
?
* - display date and amount of deposit
* MAKE SURE THIS IS THE THE RIGHT ONE
DISP OFF 'Deposited on ',DATE,' Amount = ',AMT
INPUT ' Cancel this one? (Y/N)' TO ANSWER
* - ask if deposit is to be cancelled
IF ANSWER
* - change logical flag for cancelled deposit
REPLACE CAN WITH T
ENDIF
ELSE * END OF FILE
?
* - tell user there are not more deposits
? 'No more uncancelled deposits'
RETURN
ENDIF * IF NOT EOF
?
INPUT 'Any more deposits to cancel? (Y/N)' to ANSWER
IF .NOT. ANSWER
RETURN
ENDIF
ENDDO
RETURN
.pa
The XBALANCE command file does the final reconciliation of the
bank statement with the user checkbook.
NOTE - BALANCE COMMAND FILE TO BALANCE CHECKBOOK
*
SUM AMT TO OUTSTAND FOR .NOT. CAN .AND. NO>0
SUM AMT TO T:OUT FOR .NOT. CAN .AND. NO=0
?
?
* - display total of outstanding checks
DISP OFF ' TOTAL OUTSTANDING CHECKS = $',OUTSTAND
?
* - display total of outstanding deposits
DISP OFF ' TOTAL OUTSTANDING DEPOSITS = $'T:OUT
?
* - request ending balance form check book
INPUT "ENTER ENDING BALANCE FROM BANK STATEMENT" TO BEGIN
DISP OFF 'CURRENT BALANCE = $',BEGIN+T:OUT-OUTSTAND
WAIT
RETURN
.PA
CHECKBOOK REPORTING SYSTEM
This dBASE sample illustrates the use of the INDEX and REPORT
commands. This dBASE system uses the database file generated by
the XMENU check balancing system discussed previously. The
system list the checks by MEMO type and their subtotals and
totals. The system uses a command file, a database file and a
report form file. The files associated with this system and
their names are:
1. CHREPORT - System controller.
2. CHREPORT - Report forms file generated when the user
uses the REPORT dialog.
3. CHECKER - Database file generated by XMENU system.
The data base structure is presumed to have already been created
for using this system. A listing of the file structure follows.
FIELD NAME,TYPE,WIDTH,DECIMAL PLACES
001 NO,N,4(cr) Æfield name is NO with 4 Numeric charsÅ
002 TO,C,30(cr) Æfield name is TO with 30 CharactersÅ
003 AMT,N,10,2(cr) Æsimilar explanations for rest of fileÅ
004 CAN,L(cr)
005 DATE,C,8(cr)
006 MEMO,C,10(cr)
007 (cr)
.pa
A text editor is then executed and the following command file
sources with the extention ".CMD" are entered:
The CHREPORT command file:
NOTE - report on the checks in a database
* - this dBASE II system uses the database file generated by the
* - check balancing system initiated by XMENU. This check report
* - system reads the XMENU data base and report the subtotals for
* - each of the various user memos.
*
* note: uses database with structure same as XMENU
*
? 'THIS PROGRAM IS SET TO RUN ON YOUR PRINTER. IF PRINTER IS NOT READY'
? ' THE PROGRAM MAY HANG UP.'
* - enter name of database file from XMENU
ACCEPT 'Enter check database name' to DBNAME
* - assign data base file to this command system
* - database has name of xxxx.DBF
USE &DBNAME
* - index on variable MEMO in database file
INDEX ON MEMO TO &DBNAME
* - enter title to be printed at top of each output page
ACCEPT 'Enter report title (up to 60 chars)' to TITLE
* - set header to title value
SET HEAD TO &TITLE
* - generate report form using CHREPORT.FRM
REPORT FORM CHREPORT FOR NO#0 TO PRINT
RETURN
.pa
The CHREPORT.FRM file is listed here. The notations in square
brackets indicate the REPORT prompts being answered.
Y Æpage heading? (y/n)Å
Checks subtotalled by type Æenter page heading:Å
n Ædouble space report? (y/n)Å
y Æare totals required? (y/n)Å
y Æsubtotals in report? (y/n)Å
MEMO Æenter subtotals field:Å
N Æsummary report only? (y/n)Å
N Æeject page after subtotals? (y/n)Å
Check type : Æenter subtotals heading:Å
5,NO Æwidth, contentsÅ
CHECKNO Æenter headingÅ
N Æare totals required? (y/n)Å
33,TO Æwidth, contentsÅ
PAY TO THE ORDER OF Æenter headingÅ
10,$(DATE,3,2)+'/'+$(DATE,5,2)+'/'+$(DATE,1,2) Æwidth,contentsÅ
DATE;WRITTEN Æenter headingÅ
12,AMT Æwidth,contentÅ
>AMOUNT Æenter headingÅ
Y Æare totals required? (y/n)Å
.pa
A sample run using these command files follows. First the user
is presumed to have "CREATEd" a database file called CHECKER.
>DBASE Æinitiate the dBASE systemÅ
ENTER TODAYS DATE AS MM/DD/YY OR RETURN FOR NONE: 11/04/81(cr)
*** dBASE II VER 2.xx
.DO CHREPORT(cr) Æinitiate the check report systemÅ
THIS PROGRAM IS SET TO RUN ON YOUR PRINTER. IF THE PRINTER IS NOT READY
THE PROGRAM MAY HANG UP.
Enter check databse name:CHECKER(cr) Æenter name of database fileÅ
Enter report title (up to 60 chars): THIS IS A SAMPLE CASE(cr)
.pa
PAGE NO. 00001 THIS IS A SAMPLE CASE
Checks subtotalled by type
CHECK PAY TO THE ORDER OF DATE AMOUNT
NO WRITTEN
* Check type : A
1008 PRESSURE ADVERTIZING AGENCY 04/05/80 500.00
** SUBTOTAL **
500.00
* Check`type : B
1003 FIRST NATIONAL BANK 05/07/80 55.10
** SUBTOTAL **
55.10
* Check type : D
1005 HARVEY MUDD 01/01/81 169.34
** SUBTOTAL **
169.34
* Check type : F
1004 NEWTON PHYSICS LAB 01/01/81 1000.00
** SUBTOTAL **
1000.00
* Check type : I
1007 PIECES OF ROCK INSURANCE 01/05/81 40.00
** SUBTOTAL **
40.00
* Check type : L
1006 SHUSTER LEGAL CLINIC 01/05/81 333.22
** SUBTOTAL **
333.22
* Check type : P
1002 POSTMASTER 05/05/80 22.41
** SUBTOTAL **
22.41
* Check Type : R
1009 SMITH OFFICE RENTAL 01/25/81 239.56
** SUBTOTAL **
239.56
.pa
PAGE NO. 00002 THIS IS A SAMPLE CASE
Checks subtotalled by type
CHECK PAY TO THE ORDER OF DATE AMOUNT
NO WRITTEN
* Check type : S
1001 MITCHELL OFFICE SUPPLY 04/05/80 77.34
** SUBTOTAL **
77.34
* Check type : X
1010 GOV MEDFLY STATE TAX BOARD 01/25/81 7.76
** SUBTOTAL **
7.76
** TOTAL ** 2444.73
.QUIT Æleaving dBASE systemÅ
*** END RUN dBASE II ***
.PA
SIMPLE ACCOUNTS PAYABLE SYSTEM
This is a check printer system. This example demonstrates direct
formatting of printer output and the usage of PRIMARY and
SECONDARY databases. This system uses the CHECKS data base file
generated by the check balancing system discussed earlier. The
system accesses a database file called ACCNTS and asks the user
if he wants to pay any checks to the accounts in the file. When
a check is paid, a record of the check is made in the CHECKS
database file. The system also allows the user to write checks
to accounts not in the ACCNTS database. The system uses a
command file and two database files. The files associated with
this system and their names are:
1. ACCNTPAY - System controller.
2. ACCNTS - Database file used to display the accounts
to be paid.
3. CHECKS - Database file generated by check balancing
system.
Prior to using the system, user specified database files must be
available for the command files to access. In any database
project, one should consider what data fields will be required.
For the CHECK file, the following fields were selected:
NO - The check number, INTEGER
TO - The recipient of the check, CHARACTER
CAN - The cancelled/not-cancelled status of a check or
deposit, LOGICAL.
DATE - Date when the check was written, CHARACTERS
MEMO - Code for users accounting files:
A-Advertising B-Bank Charges
C-Car + Truck D-Dues + Publications
F-Freight I-Insurance
L-Legal Expenses O-Office Supplies
P-Postage R-Rent
T-Telephone X-Taxes
The data base structure is presumed to have already been created
for using this system. A listing of the file structure follows.
STRUCTURE FOR FILE: CHECKS.DBF
NUMBER OF RECORDS: 00010
DATE OF LAST UPDATE: 00/00/00
PRIMARY USE DATABASE
FLD NAME TYPE WIDTH DEC
001 NO C 004
002 TO C 030
003 AMT N 010 002
004 CAN L 001
005 DATE C 008
006 MEMO C 010
** TOTAL ** 00064
.pa
For the ACCNTS file the following fields were selected:
PNAME - Payees name
AMT - Amount outstanding in account
DDATE - Date account was opened
LDATE - Last date a payment was made
LAMT - Last amount still owed
TYPE - Account memo
PERIOD - Payment period
VARIABLE- Logical flag
The structue of the database file is a follows:
STRUCTURE FOR FILE: ACCNTS.DBF
NUMBER OF RECORDS: 00007
DATE OF LAST UPDATE: 00/00/00
PRIMARY USE DATABASE
FLD NAME TYPE WIDTH DEC
001 PNAME C 030
002 AMT N 010 002
003 DDATE C 006
004 LDATE C 006
005 LAMT N 008 002
006 TYPE C 010
007 PERIOD N 001
008 VARIABLE L 001
** TOTAL ** 00073
.pa
A text editor is then executed and the following command file
source with the extention "CMD" is entered:
NOTE - THIS IS THE ACCOUNT PAYING COMMAND FILE
*
*
* - explanatory text
? 'THIS PROGRAM USES THE PRINTER. IF YOUR PRINTER IS NOT READY IT'
? ' MAY HANG UP AT THIS POINT. FURTHER DOWN IN THIS FILE'
? ' YOU WILL FIND A SECTION OF CODE TO SET UP AN ANADEX PRINTER FOR'
? ' PRINTING CHECKS. USE YOUR TEXT EDITOR TO MODIFY THIS FOR YOUR'
? ' PRINTER. '
* - turn off printing commands to screen
SET TALK OFF
* - send results of @ statements to printer
SET FORMAT TO PRINT
* - echo output to printer
SET PRINT ON
* - turn off console
SET CONSOLE OFF
* - go to top of page on printer
EJECT
* - this is the ANADEX 9500 text
* SET`FORM LENGTH TO 22 LINES ON ANADEX 9500
* ESC 4 022
* - create ASCII string of esc4022
? CHR(27)+CHR(52)+CHR(48)+CHR(50)+CHR(50)
* - turn off echo
SET PRINT OFF
* - echo output to console
SET CONSOLE ON
* - set loop variable true
STORE T TO STAY
* - request current date
ACCEPT "Enter Today's Date (YYMMDD)" TO TODAY
* - ask for beginning check number for this run
INPUT 'Enter Beginning Check No. ' TO NNO
* - ask for disk drive with database files
ACCEPT 'Enter Data Disk Drive ' TO DRV
* - set system default to database disk drive
SET DEFAULT TO &DRV
USE CHECKS
* - select primary database file
SELE SECO
USE ACCNTS
* - set up program loop
DO WHILE STAY
* - select seconary file ACCNTS
SELECT SECONDARY
?
?
* - list data from ACCNTS
LIST PNAME,S.AMT,DDATE
?
?
?
? ' ENTER OPTION YOU WANT'
? ' -1 - EXIT'
? ' 0 - WRITE CHECK TO ACCOUNT NOT IN DATABASE'
? ' N - NUMBER OF ACCOUNT TO WRITE CHECK FOR'
* - ask for account number to print check for
INPUT 'Which Account' TO ACCNT
* - check to see if exit
IF ACCNT<0
* - set loop variable false to exit program
STORE F TO STAY
LOOP
ENDIF
* - check to see if writing check not in ACCNTS
IF ACCNT=0
* - request data for check
ACCEPT 'Enter Payee ' TO NAME
INPUT 'Enter Amount ' TO MAMT
ELSE
* - locate account number in ACCNTS file
GOTO ACCNT
* - store payee name to variable NAME
STORE PNAME TO NAME
* - is check hasn't been canceled
IF .NOT.VARIABLE
* - check to get amount still owed
STORE S.AMT TO MAMT
IF TODAY>=LDATE
STORE S.AMT+LAMT TO MAMT
ENDIF
ELSE
* - user option on amount to pay this time
INPUT 'Enter Amount To Pay ' TO MAMT
ENDIF
IF PERIOD>0
IF (VAL($(DDATE,3,2))+PERIOD)>12
STORE VAL(DDATE)+((88+PERIOD)*100) TO NDATE
ELSE
STORE VAL(DDATE)+100*PERIOD TO NDATE
ENDIF
REPLACE DDATE WITH STR(NDATE,6)
ENDIF
ENDIF
* - store variables to be printed on check
STORE STR(NNO,4) TO XNO
STORE STR(MAMT,10,2) TO XAMT
* - show user on screen proposed check values
DISP OFF 'Check #',XNO,' Pay ',XAMT,' To ',NAME
* - ask if you want to print this check
? 'OK? (Y/N)'
WAIT TO X
* - see if check is to be written
IF X=$('Yy',1,1) .OR. X=$('Yy',2,1)
* - select primary file
SELE PRIMARY
APPEND BLANK
* - put check data into primary file
REPLACE TO WITH NAME,NO WITH NNO,AMT WITH MAMT,CAN WITH F
REPLACE DATE WITH TODAY,MEMO WITH TYPE
STORE NNO+1 TO NNO
* NOW PRINT CHECK ON PRINTER
@ 3,67 SAY 'Check No.'
@ 3,77 SAY XNO
@ 5,67 SAY 'Date:'
@ 5,73 SAY $(TODAY,3,2)+'/'+$(TODAY,5,2)+'/'+$(TODAY,1,2)
@ 10,1 SAY 'Pay to the'
@ 11,1 SAY 'Order of'
@ 11,12 SAY NAME
@ 11,68 SAY MAMT USING '$$,$$$,$$$.99'
@ 17,12 SAY INT(MAMT) USING '$$,$$$,$$$'
@ 1wl23 SAY 'D O L L A R S and '
@ 17,44 SAY (MAMT-INT(MAMT))*100 USING '99'
@ 17,47 SAY 'C E N T S'
@ 20,12 SAY 'Type: '
@ 20,18 SAY TYPE
@ 20,41 SAY '----------------------------------------'
EJECT
ENDIF
ENDDO
RETURN
.pa
A sample run using these files follows. First the user is
presumed to have "CREATE"d a database file called CHECKS and a
database file call ACCNTS.
>DBASE Æinitiate the dBASE systemÅ
ENTER TODAYS DATE AS MM/DD/YY OR RETURN FOR NONE: 11/04/81(cr)
*** dBASE II VER 2.xx
.DO ACCNTPAY(cr) Æinitiate the check report systemÅ
THIS PROGRAM USES THE PRINTER. IF YOUR PRINTER IS NOT READY IT
MAY HANG UP AT THIS POINT. 5 LINES FURTHER DOWN IN THIS FILE
YOU WILL FIND A SECTION OF CODE TO SET UP AN ANADEX PRINTER FOR
PRINTING CHECKS. USE YOU TEXT EDITOR TO MODIFY THIS FOR YOUR
PRINTER.
Enter Today's Date (YYMMDD):811130(cr)
Enter Beginning Check No. :1025(cr)
Enter Data Disk Drive :B:(cr)
0001 SMITH OFICE RENTAL 234.56 800901
0002 HURTZ BUSINESS CAR LEASING 300.00 800620
0003 PRESSURE ADVERTIZING AGENCY 500.00 800723
0004 TIDY LAUNDRY 40.00 800701
0005 MUNICIPAL WATER DEPARTMENT 10.00 800705
ENTER ACCOUNT OPTION
-1 - EXIT
0 - WRITE CHECK TO ACCOUNT NOT IN DATABASE
N - NUMBER OF ACCOUNT TO WRITE CHECK FOR
Which Account: 1(cr)
Check # 1025 Pay 234.56 to SMITH OFFICE RENTAL
OK? (Y/N)
WAITING Y
0001 SMITH OFFICE RENTAL 234.56 801001
0002 HURTZ BUSINESS CAR LEASING 300.00 800620
0003 PRESSURE ADVERTIZING AGENCY 500.00 800723
0004 TIDY LAUNDRY 40.00 800701
0005 MUNICIPAL WATER DEPARTMENT 10.00 800705
ENTER ACCONT OPTON
-1 - EXIT
0 - WRITE CHECK TO ACCOUNT NOT IN DATABASE
N - NUMBER OF ACCOUNT TO WRITE CHECK FOR
Which Account: 0(cr)
Enter Payee: CLIPUM MOTORS
Enter Amount: 123.45
Check # 1026 Pay 123.45 to CLIPUM MOTORS
OK? (Y/N)
WAITING Y
0001 SMITH OFFICE RENTAL 234.56 801001
0002 HURTZ BUSINESS CAR LEASING 300.00 800620
0003 PRESSURE ADVERTIZING AGENCY 500.00 800723
0004 TIDY LAUNDRY 40.00 800701
0005 MUNICIPAL WATER DEPARTMENT 10.00 800705
ENTER ACCOUNT OPTION
-1 - EXIT
0 - WRITE CHECK TO ACCOUNT NOT IN DATABASE
N - NUMBER OF ACCOUNT TO WRITE CHECK FOR
Which Account: -1(cr)
. QUIT Æexiting dBASE systemÅ
*** END RUN dBASE ***
.pa
The following is the printed output from the ACCNTPAY system.
-----------------------------------------------------------------
Check No. 1025
Date: 11/30/81
Pay to the
Order of SMITH OFFICE RENTAL $$$$$$$$234.56
$$$$$$$$$234 D O L L A R S and 56 C E N T S
--------------------------
Type: R
-------mm--------------------------------------------------------
Check No. 1026
Date: 11/30/81
Pay to the
Order of CLIPUM MOTORS $$$$$$$$$123.45
$$$$$$123.45 D O L L A R S AND 56 C E N T S
----------------------------
Type: R
-----------------------------------------------------------------
.PA
MAILING SYSTEM
This example illustrates a dBASE II system for mailing list
generation, mail label printing or form letter printing. The
system does not have provisions for modifying the mailing list.
The user can change entries in the mailing list using the dBASE
II commands DELETE and/or EDIT. This system illustrates the use
of format files, text files and the SET ALTERNATE command.
The system uses a user defined mailing list database file, five
command files, a dBASE II format file and generates and text
file. The files and their functions are:
1. MAIL.DBF - Database file containing mailing list
2. MAIL.CMD - System controller.
3. MAILENTR.CMD - Enters names and addresses to mailing
list file MAIL.DBF
4. MAILLAB.CMD - Prints mailing labes from mailing
list file MAIL.DBF
5. MAILLTTR.CMD - Generates form letter to be printed.
6. MAILINFO.CMD - Contains text of form letter to be
printed.
7. MAILFMT.FMT - Format file for reading in name and
address data in MAILENTR.CMD
8. PRINT.TXT - Output file containing form letters.
Prior to using the system a mailing list database file must be
available for the command files to access. The following
variable names are accessed by the system presented here.
TITLE - Title code of person, Mr, Mrs, etc.
NAME - Name of person in mailing list.
OF - Name of addressee's company.
ADDR - Address of person and/or company.
CITY - City of residence.
STATE - Postal abbreviation of state.
ZIP - Zip code.
.pa
Enter the following to CREATE the mailing list database
structure. The database file name is MAIL.
>DBASE(cr) Æinitiate the dBASE system to begin processingÅ
ENTER TODAYS DATE AS MM/DD/YY OR RETURN FOR NONE : (cr)
*** dBASE II VER 2.xx
.CREATE
FILENAME:MAIL(cr) Æasks what you want to name the fileÅ
ENTER RECORD STRUCTURE AS FOLLOWS:
FIELD NAME,TYPE,WIDTH,DECIMAL PLACES
001 TITLE,N,1
002 NAME,C,30
003 OF,C,30
004 ADDR,C,30
005 CITY,C,20
006 STATE,C,2
007 ZIP,C,6
008 (cr)
INPUT NOW?:N Æindicates not going to enter data to file nowÅ
. QUIT Æleaving dBASE system for now
*** END RUN dBASE II *** ÆdBASE message to userÅ
A text editor is then executed and the follwoing command file
sources with the extention "CMD" are entered:
First the MAIL commmand file:
NOTE Example dBASE Command file program
*
* - this is a sample form letter generator and mailing label
* - dBASE II system. The system allows the user to add new
* - entries to a mailing list, print the mailing list on gummed
* - labels or print a form letter addressed to all the people
* - in the mailing list. No provision is made to modify the
* - mailing list. The user can use the dBASE commands EDIT and/or
* - DELETE to modify the database file MAIL.DBF to change the
* - mailing list.
*
* - turn off display of commands to screen
SET TALK OFF
* - assign database file to command stream.
USE MAIL
* - enter current date to print on form letter
ACCEPT 'Enter date as mm/dd/yy' TO DATE
* - select system option
DO WHILE T
?
?
?
? ' Form Letter Writing System'
?
?
? ' 0 - EXIT'
? ' 1 - Enter new entries'
? ' 2 - Make Labels'
? ' 3 - Write Letters'
?
? ' enter desired action'
* - wait for user response
WAIT TO ACTION
* - test for exit
IF ACTION='0'
SET TALK on
CANCEL
ENDIF
* - test for new entries
IF ACTION='1'
* - add new names to MAIL.DBF
DO MAILENTR
ENDIF
* - test to make labels
IF ACTION='2'
* - print mail labels
DO MAILLAB
ENDIF
* - test to write form letters
IF ACTION='3'
* - print form letter to names in MAIL.DBF
DO MAILLTTR
ENDIF
ENDDO
RETURN
.pa
The MAILENTR command file add names to the MAIL.DBF file using
the MAILFMT.FMT format file.
NOTE - MAIL SYSTEM NAME AND ADDRESS ENTRY PROGRAM
*
* - move pointer to bottom of MAIL.DBF
GO BOTTOM
* - send output of @ commands to MAILFMT.FMT
SET FORMAT TO MAILFMT
* - read name and address data
DO WHILE T
* - initialize address variables to blank
STORE ' ' TO MTTL
STORE ' ' TO MSTATE
STORE ' ' TO MZIP
STORE ' ' TO MSNAM,MCITY
STORE ' ' TO MGNAME
STORE ' ' TO MOF,MADDR
* - read format file
READ
* - check to see if ready to exit this command file
IF MTTL=' '
RETURN
ENDIF
* - combine first and last name and store
STORE MSNAM+MGNAME TO MNAME
* - add blank card to MAIL.DBF
APPEND BLANK
* - store name and address data to MAIL.DBF
* - substitute input variables for database file variables
REPLACE TITLE WITH &MTTL,NAME WITH MNAME,OF WITH MOF,ADDR WITH MADDR
REPLACE CITY WITH MCITY,STATE WITH !(MSTATE),ZIP WITH MZIP
ENDDO
RETURN
.pa
The format file MAILFMT follows:
This file reads the mail list input data
@ 1,1 SAY ' 1 = "Mr."'
@ 2,1 SAY ' 2 = "Mrs."'
@ 3,1 SAY ' 3 = "Ms."'
@ 4,1 SAY ' 4 = "Dr."'
@ 5,1 SAY ' BLANK to exit entry program'
@ 6,1 SAY ' After BLANK, enter carriage return for entries'
Æenter title codeÅ
@ 7,1 SAY 'Enter title code ' GET MTTL
Æenter surnameÅ
@ 8,1 SAY 'Enter Surname ' GET MSNAM
Æenter given and middle namesÅ
@ 9,1 SAY 'Enter other names ' GET MGNAME
Æenter company nameÅ
@ 10,1 SAY 'Enter Co. name ' GET MOF
Æenter street addressÅ
@ 11,1 SAY 'Enter Address ' GET MADDR
Æenter city nameÅ
@ 12,1 SAY 'Enter City ' GET MCITY
Æenter two letter postal abbreviation for state nameÅ
@ 13,1 SAY 'Enter State ' GET MSTATE
Æenter zip code numberÅ
@ 14,1 SAY 'Enter ZIP code ' GET MZIP
.pa
The MAILLAB command file print the mailing list onto the system
printer. The text of the file follows:
NOTE - THIS COMMAND FILE PRINTS MAILING LABELS ON THE PRINTER
*
REMARK WHEN LABELS ARE IN PLACE, HIT CARRIAGE RETURN
WAIT
* - echo printed information to screen
SET PRINT ON
* - position to top of MAIL.DBF
GO TOP
* - print labels
DO WHILE .NOT.EOF
* - print name
DISP OFF $(NAME,13,17)-(' '+$(NAME,1,12))
* - checking to see if office address
IF OF#' '
* - print office name
DISP OFF OF
* - print address
DISP OFF ADDR
* - print city, state, zip
DISP OFF $(CITY,1,20)-(', '+$(STATE,1,2))-(' '+$(ZIP,1,5))
ELSE
* - print home address
DISP OFF ADDR
* - print city, state, zip
DISP OFF $(CITY,1,20)-(', '+$(STATE,1,2))-(' '+$(ZIP,1,5))
?
ENDIF
?
SKIP
ENDDO
* - turn off echo of labels
SET PRINT OFF
REMARK ALL DONE
RETURN
.pa
The MAILLTTR command file generates the form letter for the
system. The text of the file follows.
NOTE - THIS COMMAND FILE WRITES THE FORM LETTER
*
* - position pointer at top of MAIL.DBF
GO TOP
* - sets up to store everything that appears on the screen into
* - a file called PRINT.TXT which the user can later list using
* - his work processor.
SET ALTERNATE TO PRINT
SET ALTERNATE ON
* PUT PRINT FORMATTER SETUP DIRECTIVES HERE, SUCH AS PAGE NUMBERING,
* PRINTER PITCH, PAGE OFFSET, LINE HEIGHT, AND FOOTNOTES
* EXAMPLE:
* ? '.OFFSET = 8'
* ? '.CHARACTER WIDTH = 12/INCH'
* etc.
* - print letter
DO WHILE .NOT.EOF
? ' Your Company'
? ' 8080 Micro St.'
? ' Silicon, CA 93002'
? ' (213) 555-1234'
? ' '+DATE
* - print name and address of client
? $(NAME,13,18)-(' '+$(NAME,1,12))
IF OF#' '
? OF
ENDIF
? ADDR
IF VAL(ZIP)=0
? CITY-(', '+STATE)
ELSE
? CITY-(', '+STATE)-(' '+ZIP)
ENDIF
?
?
* - print salutation
IF TITLE=1
? 'Dear Mr. '+$(NAME,1,12)
ENDIF
IF TITLE=2
? 'Dear Mrs. '+$(NAME,1,12)
ENDIF
IF TITLE=3
? 'Dear Ms. '+$(NAME,1,12)
ENDIF
IF TITLE=4
` ? 'Dear Dr. '+$(NAME,1,12)
ENDIF
?
* - print text of letter
DO MAILINFO
*
* PUT A WORD PROCESSOR COMMAND TO SKIP TO THE NEXT PAGE HERE
* EXAMPLE
* ? '.SKIP'
* - this is a WordStar (tm) page skip
? '.pa'
SKIP
ENDDO
SET ALTERNATE OFF
RETURN
.pa
The MAILINFO command file accessed by this file contains the text
of the form letter. A sample MAILINFO file follows.
NOTE - THIS IS THE TEXT FOR THE USER FORM LETTER
*
* - the text presented here describes how to generate the
* - letter. The user will put in own text.
? 'This is the body of a form letter. It was first written with a word'
? 'processor and then modified to become a command file. The modifications'
? 'are: placement of question marks at the beginning of each line and'
? 'enclosing the text in single quotes or square brackets. In this way,'
? 'each line of text is written to the ALTERNATE file by means of the SET'
? 'ALTERNATE commands in MAILLTTR.CMD (which calls this command file).'
?
? 'The text of the letter can be altered based on the database data fields.'
? 'For instance, if the content of the letter should change for different'
? 'states, then this condition can be checked and the appropriate action'
? 'can be taken.'
?
?
? ' Yours truly'
?
?
?
?
? ' Mike R. O. Chip'
?
? 'Example:'
?
IF STATE='CA'
? 'California residents add 6% sales tax'
ENDIF
RETURN
.pa
A sample run using these command files follows. First the user
is presumed to have "CREATE"d a database file called MAIL using
the commands presented in the database discussion.
>DBASE(cr) Æinitiate the dBASE systemÅ
ENTER TODAYS DATE AS MM/DD/YY OR RETURN FOR NONE : (cr)
*** dBASE II VER 2.xx
.MAIL Æinitiate mailing list systemÅ
Enter date as mm/dd/yy:11/29/81(cr)
Form Letter Writing System
0 - EXIT
1 - Enter new entries
2 - Make Labels
3 - Write Letters
enter desired action
WAITING 1 Æentering names to mailing listÅ
1 = "Mr."
2 = "Mrs."
3 = "Ms."
4 = "Dr."
BLANK to exit entry program
After BLANK, enter carriage return for entries
Enter title code :1:
Enter Surname :Jones(cr) :
Enter other names :John J.(cr) :
Enter Co. name :Micro Enterprises(cr) :
Enter Address :1234 Chip Road(cr) :
Enter City :Silicon(cr):
Enter State :CA:
Enter ZIP code :90002(cr):
1 = "Mr."
2 = "Mrs."
3 = "Ms."
4 = "Dr."
BLANK to exit entry program
After BLANK, enter carriage return for entries
Enter title code :1:
Enter Surname :Brown(cr) :
Enter other names :Thomas(cr) :
Enter Co. name :(cr) :
Enter Address :1234 West Winchester Dr.(cr) :
Enter City :Boston(cr):
Enter State :CA:
Enter ZIP code :10024(cr):
1 = "Mr."
2 = "Mrs."
3 = "Ms."
4 = "Dr."
BLANK to exit entry program
After BLANK, enter carriage return for entries
Enter title code :2:
Enter Surname :Franklin(cr) :
Enter other names :Josephine(cr) :
Enter Co. name :(cr) :
Enter Address :12 Country Club Dr.(cr) :
Enter City :Chino(cr):
Enter State :CA:
Enter ZIP code :9l710(cr):
1 = "Mr."
2 = "Mrs."
3 = "Ms."
4 = "Dr."
BLANK to exit entry program
After BLANK, enter carriage return for entries
Enter title code : :Æexiting this command fileÅ
Enter Surname :(cr) :
Enter other names :(cr) :
Enter Co. name :(cr) :
Enter Address :(cr) :
Enter City :(cr) :
Enter State :(cr):
Enter ZIP code :(cr) :
Form Letter Writing System
0 - EXIT
1 - Enter new entries
2 - Make Labels
3 - Write Letters
enter desired action
WAITING 2 Æprinting mailing labelsÅ
WHEN LABELS ARE IN PLACE, HIT CARRIAGE RETURN
WAITING (cr)
John J. Jones
Micro Enterprises
1234 Chip Road
Silicon, CA 90002
Thomas Brown
1234 West Winchester Dr.
Boston, MA 10024
Josephine Franklin
12 Country Club Dr.
Chino, CA 9l710
Form Letter Writing System
0 - EXIT
1 - Enter new entries
2 - Make Labels
3 - Write Letters
enter desired action
WAITING 3 Æwriting form lettersÅ
Form Letter Writing System
0 - EXIT
1 - Enter new entries
2 - Make Labels
3 - Write Letters
Enter desired action
WAITING 0 Æexiting MAIL systemÅ
DO CANCELLED
. QUIT Æexit from dBASE processorÅ
*** END RUN dBASE II ***
At the end of processing the form letters are in a file called
PRINT.TXT. The user needs to print this file using his system
word processor. When the printing is completed, he should delete
the TXT file from his disk. A sample form letter for this
version of the MAIL system follows:
.pa
Your Company
8080 Micro St.
Silicon, CA 93002
(213) 555-1234
11/29/81
Josephine Franklin
12 Country Club Dr.
Chino, CA 9l710
Dear Mrs. Franklin
This is the body of a form letter. It was first written with a word
processor and then modified to become a command file. The modifications
are: placement of question marks at the beginning of each line and
enclosing the text in single quotes or square brackets. In this way,
each line of text is written to the ALTERNATE file by means of the SET
ALTERNATE commands in MAILLTTR.CMD (which call this command file).
The text of the letter can be altered based on the database data fields.
For instance, if the content of the letter should change for different
states, then this codition can be checked and the appropriate action can
be taken.
Yours truly
Mike R. O. Chip
Example:
California Residents add 6% sales tax
.PA
DATE MANAGEMENT SYSTEM
The following example demonstrates the capability to use dBASE to
perform computations without using a database file. This program
allows the listing of dates that are a specified number of days
apart, such as treatment dates at a hospital or payroll dates.
The system consists of three command files. The three dBASE
command files and their functions are:
1. DATER - System controller
2. CALJUL - Computes pseudo-Julian date from user input
calendar date.
3. JULCAL - Computes calendar date from pseudo-Julian
date.
First the DATER command file:
NOTE - DRIVER program for date calculation
*
* - turn off display of commands to screen
SET TALK OFF
* - ask user for start date
DO CALJUL
INPUT 'Enter interval in days between dates' TO DELTA
?
?
INPUT 'Enter number of times you want interval' TO TOT
* - initialize counter
INPUT 'Do you want output to printer? (Y/N)' TO ANSWER
STORE 1 TO CNT
IF ANSWER
SET PRINT ON
? ' START DATE = '
?? DATE
SET PRINT OFF
ELSE
? ' START DATE = '
?? DATE
ENDIF
DO WHILE CNT<=TOT
* - increment date
STORE X+DELTA TO X
DO JULCAL
STORE 1+CNT TO CNT
LOOP
ENDDO
.pa
The CALJUL command file calculates the pseudo-Julian day date
from the user input calendar date.
NOTE - PSEUDO-JULIAN DAY COMMAND FILE PROGRAM
* - ask user for start date
ACCEPT 'ENTER DATE AS MM/DD/YY' TO DATE
* - strip off month from date
STORE VAL($(DATE,1,2)) TO M
* - strip off day from date
STORE VAL($(DATE,4,2)) TO D
* - strip off year from date
STORE VAL($(DATE,7,2))+1900 TO Y
* - calculate integer julian date
STORE INT(30.57*M)+INT(365.25*Y-395.25)+D TO X
* - perform leap year calculation
IF M>2
IF INT(Y/4)=Y/4
STORE X-1 TO X
ELSE
STORE X-2 TO X
ENDIF
ENDIF
RETURN
.pa
The JULCAL command file computes the calendar date from the
pseudo-Julian day date.
NOTE - CALCULATE CALENDAR DATE FROM PSEUDO-JULIAN DATE
*
* - strip off year
STORE INT(X/365.26)+1 TO Y
* - strip off day
STORE X+INT(395.25-365.25*Y) TO D
* - do leap year adjustment
IF INT(Y/4)*4=Y
STORE 1 TO D1
ELSE
STORE 2 TO D1
ENDIF
IF D>(91-D1)
STORE D+D1 TO D
ENDIF
* - do month computation
STORE INT(D/30.57) TO M
STORE D-INT(30.57*M) TO D
IF M>12
STORE 1 TO M
STORE Y+1 TO Y
ENDIF
STORE Y-1900 TO Y
* - create output format for date
STORE STR(M,2)+'/'+STR(D,2)+'/'+STR(Y,2) TO DATE
IF ANSWER
SET PRINT ON
ENDIF
? 'CALENDAR DATE ='
?? DATE
IF ANSWER
SET PRINT OFF
ENDIF
RETURN
.pa
A sample run using the command files follows. This case is to
compute the payroll date for a company that pays every two weeks
starting on New Years day 1981.
>DBASE Æinitiate the dBASE systemÅ
ENTER TODAYS DATE AS MM/DD/YY OR RETURN FOR NONE : (cr)
*** dBASE II VER 2.xx
.DO DATER(cr)
ENTER DATE AS MM/DD/YY:01/01/81(cr) Ærequest for start dateÅ
Enter interval in days between dates:14(cr) Ætwo weeksÅ
Enter number of times you want interval:26(cr) Æ# of weeks/yrÅ
Do you want output to printer? (Y/N):Y(cr)
START DATE = 01/01/81
CALENDAR DATE = 1/15/81
CALENDAR DATE = 1/29/81
CALENDAR DATE = 2/12/81
CALENDAR DATE = 2/26/81
CALENDAR DATE = 3/12/81
CALENDAR DATE = 3/26/81
CALENDAR DATE = 4/ 9/81
CALENDAR DATE = 4/23/81
CALENDAR DATE = 5/ 7/81
CALENDAR DATE = 5/21/81
CALENDAR DATE = 6/ 4/81
CALENDAR DATE = 6/18/81
CALENDAR DATE = 7/ 2/81
CALENDAR DATE = 7/16/81
CALENDAR DATE = 7/30/81
CALENDAR DATE = 8/13/81
CALENDAR DATE = 8/27/81
CALENDAR DATE = 9/10/81
CALENDAR DATE = 9/24/81
CALENDAR DATE =10/ 8/81
CALENDAR DATE =10/22/81
CALENDAR DATE =11/ 5/81
CALENDAR DATE =11/19/81
CALENDAR DATE =12/ 3/81
CALENDAR DATE =12/17/81
CALENDAR DATE =12/31/81
. QUIT
*** END RUN dBASE II ***
«eof»