home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpmug
/
cpmug044.ark
/
LEDGER1.BAS
< prev
next >
Wrap
BASIC Source File
|
1984-04-29
|
7KB
|
170 lines
REM LEDGER1.BAS
REM
REM This is a source program in CBASIC version 2 for use under CP/M
REM with 32+ K memory and dual floppy discs. Written by Patrick Cun-
REM ningham, 235 Sharon Drive, San Antonio, TX 78216. Commercial re-
REM production is prohibited. This program will read budget entries
REM entered on disc with the BUDGET1.BAS program, sum like entries and
REM output updated totals for a given data file. It then stores the
REM monthly totals in an annual total file, named TOTALS.Ynn
REM
FOR I%=1 TO 15 REM a little fancy output
PRINT
NEXT I%
PRINT TAB(10); "This program reads and totals monthly expense entries."
PRINT TAB(10); ":::::::::::::::::::::::::::::::::::::::::::::::::::::"
FOR I%=1 TO 15 REM more of the same
PRINT
NEXT I%
OPEN.OUT.FILE%=0 REM used in case of iteration
10 INPUT "Do you want an update [U] or disc total entry [D]?";QUES$
IF QUES$="" THEN 10
IF QUES$="U" THEN UPDATE%=-1 : GOTO 10.1
IF QUES$="D" THEN UPDATE%=0 : GOTO 10.1
PRINT "Your response is not recognizeable." : GOTO 10
10.1 INPUT "What expense file are you accessing?"; LINE RESP$
REM
REM Now we see if the file name is valid
REM
IF LEN(RESP$)=0 THEN GOTO 10.1
IF LEN(RESP$)>12 THEN PRINT "** NAME TOO LONG **" : GOTO 10.1
CH.CHAR$= RIGHT$(RESP$,4)
CHAR.ONE$=LEFT$(CH.CHAR$,1)
IF CHAR.ONE$<>"." THEN PRINT CHR$(07);TAB(20);"INVALID FILE NAME" :\
GOTO 10.1
FILN$ = UCASE$(RESP$)
11 INPUT "Do you want data printed as it is read {Y/N}";LINE RR$
IF RR$="" THEN 11
IF RR$="Y" THEN PRINT.FLAG%=1 : GOTO 12
IF RR$="N" THEN PRINT.FLAG%=0 : GOTO 12
PRINT "Your response is not recognizeable" : GOTO 11
12 IF END # 1 THEN 10
IF UPDATE% OR OPEN.OUT.FILE% THEN GOTO 13.1
REM
REM This next routine sets up the annual output file
REM
INPUT "Does the totals file already exist on the disc {Y/N}?";LINE RS$
IF RS$="" THEN 12
IF RS$="Y" THEN FILE.NEW%=0 : GOTO 13
IF RS$="N" THEN FILE.NEW%=-1 : GOTO 13
PRINT "Your response is not recognizeable" : GOTO 12
13 INPUT "What year is it?"; LINE YEAR$
IF LEN(YEAR$)<>4 THEN 13
OUT.FILE.NAME$ = "EXP"+ YEAR$ +".TOT"
IF END # 2 THEN 10
IF FILE.NEW% THEN CREATE OUT.FILE.NAME$ RECL 64 AS 2
IF NOT FILE.NEW% THEN OPEN OUT.FILE.NAME$ RECL 64 AS 2
PRINT "MONTH'S TOTALS TO BE OUTPUT TO FILE ";OUT.FILE.NAME$
OPEN.TWO%=-1
REM
REM we now calculate the number of records in either file
REM
13.1 OPEN FILN$ RECL 64 AS 1
FALSE%=0
TRUE%=-1
DEF FN.CALCULATE.FILE.NO%(FILE.NAME$,REC.SIZE%,FILE.NUM%,POSITION%)
FN.CALCULATE.FILE.NO% = FALSE%
FILE.SIZE%=SIZE(FILE.NAME$)
IF FILE.SIZE%=0 THEN \ FALSE IF NO FILE
RETURN \
ELSE FN.CALCULATE.FILE.NO% = TRUE%
IF END # FILE.NUM% THEN 14
POSITION%=INT%(FLOAT(FILE.SIZE%)* 128/REC.SIZE%)
PRINT "locating file at end"
READ # FILE.NUM%,POSITION%;
WHILE TRUE%
READ # FILE.NUM%; LINE DUMMY$
POSITION% = POSITION% + 1
WEND
14 PRINT "There are";POSITION%;"entries in this data file."
FN.CALCULATE.FILE.NO%=POSITION%
RETURN
FEND REM end of defined function
POSN%=0
FILE.RECORD.LENGTH%=FN.CALCULATE.FILE.NO%(FILN$,128,1,POSN%)
CLOSE 1
REM
REM We now read in the various expense entries from the disc
REM
OPEN FILN$ RECL 64 AS 1
DIM EXPENSE(FILE.RECORD.LENGTH%,4)
DIM EXPENSE.CAT$(FILE.RECORD.LENGTH%,4)
DIM PAYEE$(FILE.RECORD.LENGTH%)
DIM DATE%(FILE.RECORD.LENGTH%)
FOR I%=1 TO FILE.RECORD.LENGTH%
IF END # 1 THEN 25
READ # 1,I%; DATE%(I%), PAYEE$(I%), EXPENSE.CAT$(I%,1),EXPENSE(I%,1),EXPENSE.CAT$(I%,2),EXPENSE(I%,2),EXPENSE.CAT$(I%,3),EXPENSE(I%,3),EXPENSE.CAT$(I%,4),EXPENSE(I%,4)
NEXT I%
25 IF PRINT.FLAG%=0 THEN GOTO 26
FOR I%=1 TO FILE.RECORD.LENGTH%
PRINT PAYEE$(I%);" ";
FOR J%=1 TO 4
PRINT EXPENSE.CAT$(I%,J%);"|";EXPENSE(I%,J%);
NEXT J%
PRINT
NEXT I%
26 REM all data has been read in and printed, if that was desired.
PRINT.FLAG%=0
REM we will now sum up like data and output it in readable form
DIM CATEGORY.NAME$(19)
DIM CATEGORY.CODE$(19)
FOR H%=1 TO 19
READ CATEGORY.NAME$(H%),CATEGORY.CODE$(H%)
NEXT H%
DATA Charity,C,Drugs & Pharmacy,D,Clothing/Garments,G,Food,F,Household/hardware,H,Inventoried(mortgage),I,Insurance,J,Medical,Y,Miscellaneous taxable,M,Miscellaneous non-tax,N,Phone(pers.),P,Phone(business),B,Phone(Special.),R
DATA Savings,S,Utility,U,Gas(personal),E,Auto parts(personal),X,Auto repair,W,SALES TAX,T
RESTORE
MONTH.TOTAL=0.0
DIM CATEGORY.SUM(19)
FOR H%=1 TO 19
CATEGORY.TOTAL=0.0
PRINT TAB(20);"............."
PRINT TAB(20);CATEGORY.NAME$(H%)
PRINT
FOR I%=1 TO FILE.RECORD.LENGTH%
FOR J%=1 TO 4
WHILE EXPENSE.CAT$(I%,J%)=CATEGORY.CODE$(H%)
CATEGORY.TOTAL=CATEGORY.TOTAL+ EXPENSE(I%,J%)
IF LEN(PAYEE$(I%))<10 THEN \
PAYEE$(I%)=PAYEE$(I%)+" "
PRINT TAB(09); DATE%(I%);TAB(13);":";PAYEE$(I%),
PRINT USING "$$####.## ";EXPENSE(I%,J%)
GOTO 30 REM logically, we take next I%
WEND
IF EXPENSE.CAT$(I%,J%+1)="" THEN GOTO 30
NEXT J%
30 NEXT I%
CATEGORY.SUM(H%)=CATEGORY.TOTAL
IF LEN(CATEGORY.NAME$(H%))<13 THEN \
CATEGORY.NAME$(H%)=CATEGORY.NAME$(H%)+" "
PRINT TAB(44);"--------"
PRINT "TOTAL FOR ";CATEGORY.NAME$(H%),
PRINT USING "$$#####.## ";CATEGORY.SUM(H%)
MONTH.TOTAL=MONTH.TOTAL+CATEGORY.TOTAL
NEXT H%
PRINT
PRINT "TOTAL EXPENSES FOR THIS MONTH ARE: ";
PRINT USING "$$######.## "; MONTH.TOTAL
REM
REM We now output the month's totals to the annual totals disc file.
REM
IF UPDATE% THEN UPDATE%=0 : GOTO 45
40 IF END # 2 THEN 42
OUT.FILE.LENGTH%=FN.CALCULATE.FILE.NO%(OUT.FILE.NAME$,64,2,0)
42 MONTH.CODE$=RIGHT$(FILN$,3)
PRINT # 2; "*", MONTH.CODE$,YEAR$
FOR H%=1 TO 19
PRINT # 2; " ", CATEGORY.CODE$(H%),CATEGORY.SUM(H%)
PRINT "disc entered:";CATEGORY.NAME$(H%);":";CATEGORY.SUM(H%)
NEXT H%
PRINT # 2; "=",MONTH.TOTAL
PRINT "disc entered total for ";MONTH.CODE$;",";YEAR$
45 INPUT "Any other files to process{Y/N}?"; RSS$
IF RSS$="" THEN 45
IF RSS$="Y" THEN CLOSE 1 : OPEN.OUT.FILE%=-1 : GOTO 10
IF RSS$="N" THEN 50
PRINT "Your response is not recognizeable" : GOTO 45
50 PRINT TAB(20); "end of this routine."
IF OPEN.TWO% THEN CLOSE 2
END REM: Really, isn't Algol much neater?
EOF