home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug044.ark / LEDGER1.BAS < prev    next >
BASIC Source File  |  1984-04-29  |  7KB  |  170 lines

  1. REM                        LEDGER1.BAS
  2. REM
  3. REM  This is a source program in CBASIC version 2 for use under CP/M
  4. REM  with 32+ K memory and dual floppy discs.  Written by Patrick Cun-
  5. REM  ningham, 235 Sharon Drive, San Antonio, TX  78216.  Commercial re-
  6. REM  production is prohibited.  This program will read budget entries
  7. REM  entered on disc with the BUDGET1.BAS program, sum like entries and
  8. REM  output updated totals for a given data file.  It then stores the
  9. REM  monthly totals in an annual total file, named TOTALS.Ynn
  10. REM
  11.      FOR I%=1 TO 15   REM a little fancy output
  12.           PRINT
  13.           NEXT I%
  14. PRINT TAB(10);  "This program reads and totals monthly expense entries."
  15. PRINT TAB(10);  ":::::::::::::::::::::::::::::::::::::::::::::::::::::"
  16.      FOR I%=1 TO 15   REM  more of the same
  17.           PRINT
  18.           NEXT I%
  19.    OPEN.OUT.FILE%=0   REM used in case of iteration
  20. 10 INPUT "Do you want an update [U] or disc total entry [D]?";QUES$
  21.    IF QUES$="" THEN 10
  22.    IF QUES$="U" THEN UPDATE%=-1 : GOTO 10.1
  23.    IF QUES$="D" THEN UPDATE%=0 : GOTO 10.1
  24.    PRINT "Your response is not recognizeable." : GOTO 10
  25. 10.1 INPUT "What expense file are you accessing?"; LINE RESP$
  26. REM
  27. REM  Now we see if the file name is valid
  28. REM
  29.    IF LEN(RESP$)=0 THEN GOTO 10.1
  30.    IF LEN(RESP$)>12 THEN PRINT "** NAME TOO LONG **" : GOTO 10.1
  31.    CH.CHAR$= RIGHT$(RESP$,4)
  32.    CHAR.ONE$=LEFT$(CH.CHAR$,1)
  33.    IF CHAR.ONE$<>"." THEN PRINT CHR$(07);TAB(20);"INVALID FILE NAME" :\
  34.                           GOTO 10.1
  35.    FILN$ = UCASE$(RESP$)
  36. 11 INPUT "Do you want data printed as it is read {Y/N}";LINE RR$
  37.    IF RR$="" THEN 11
  38.    IF RR$="Y" THEN PRINT.FLAG%=1 : GOTO 12
  39.    IF RR$="N" THEN PRINT.FLAG%=0 : GOTO 12
  40.    PRINT "Your response is not recognizeable" : GOTO 11
  41. 12 IF END # 1 THEN 10
  42.    IF UPDATE% OR OPEN.OUT.FILE% THEN GOTO 13.1
  43. REM
  44. REM  This next routine sets up the annual output file
  45. REM
  46.    INPUT "Does the totals file already exist on the disc {Y/N}?";LINE RS$
  47.    IF RS$="" THEN 12
  48.    IF RS$="Y" THEN FILE.NEW%=0  : GOTO 13
  49.    IF RS$="N" THEN FILE.NEW%=-1 : GOTO 13
  50.    PRINT "Your response is not recognizeable" : GOTO 12
  51. 13 INPUT "What year is it?"; LINE YEAR$
  52.    IF LEN(YEAR$)<>4 THEN 13
  53.    OUT.FILE.NAME$ = "EXP"+ YEAR$ +".TOT"
  54.    IF END # 2 THEN 10
  55.    IF FILE.NEW% THEN CREATE OUT.FILE.NAME$ RECL 64 AS 2
  56.    IF NOT FILE.NEW% THEN OPEN OUT.FILE.NAME$ RECL 64 AS 2
  57.    PRINT "MONTH'S TOTALS TO BE OUTPUT TO FILE ";OUT.FILE.NAME$
  58.    OPEN.TWO%=-1
  59. REM
  60. REM  we now calculate the number of records in either file
  61. REM
  62. 13.1 OPEN FILN$ RECL 64 AS 1
  63.    FALSE%=0
  64.    TRUE%=-1
  65.    DEF FN.CALCULATE.FILE.NO%(FILE.NAME$,REC.SIZE%,FILE.NUM%,POSITION%)
  66.        FN.CALCULATE.FILE.NO% = FALSE%
  67.        FILE.SIZE%=SIZE(FILE.NAME$)
  68.        IF FILE.SIZE%=0 THEN \   FALSE IF NO FILE
  69.             RETURN \
  70.             ELSE FN.CALCULATE.FILE.NO% = TRUE%
  71.        IF END # FILE.NUM% THEN 14
  72.        POSITION%=INT%(FLOAT(FILE.SIZE%)* 128/REC.SIZE%)
  73.        PRINT "locating file at end"
  74.        READ # FILE.NUM%,POSITION%;
  75.        WHILE TRUE%
  76.            READ # FILE.NUM%; LINE DUMMY$
  77.            POSITION% = POSITION% + 1
  78.            WEND
  79. 14     PRINT "There are";POSITION%;"entries in this data file."
  80.        FN.CALCULATE.FILE.NO%=POSITION%
  81.        RETURN
  82.    FEND         REM end of defined function
  83. POSN%=0
  84. FILE.RECORD.LENGTH%=FN.CALCULATE.FILE.NO%(FILN$,128,1,POSN%)
  85. CLOSE 1
  86. REM 
  87. REM  We now read in the various expense entries from the disc
  88. REM
  89. OPEN FILN$ RECL 64 AS 1
  90. DIM EXPENSE(FILE.RECORD.LENGTH%,4)
  91. DIM EXPENSE.CAT$(FILE.RECORD.LENGTH%,4)
  92. DIM PAYEE$(FILE.RECORD.LENGTH%)
  93. DIM DATE%(FILE.RECORD.LENGTH%)
  94. FOR I%=1 TO FILE.RECORD.LENGTH%
  95.           IF END # 1 THEN 25
  96.           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)
  97.           NEXT I%
  98. 25  IF PRINT.FLAG%=0 THEN GOTO 26
  99.     FOR I%=1 TO FILE.RECORD.LENGTH%
  100.           PRINT PAYEE$(I%);" ";
  101.           FOR J%=1 TO 4
  102.           PRINT EXPENSE.CAT$(I%,J%);"|";EXPENSE(I%,J%);
  103.           NEXT J%
  104.        PRINT
  105.        NEXT I%
  106. 26  REM all data has been read in and printed, if that was desired.
  107.     PRINT.FLAG%=0
  108.     REM we will now sum up like data and output it in readable form
  109.     DIM CATEGORY.NAME$(19)
  110.     DIM CATEGORY.CODE$(19)
  111.     FOR H%=1 TO 19
  112.          READ CATEGORY.NAME$(H%),CATEGORY.CODE$(H%)
  113.          NEXT H%
  114.     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
  115.     DATA Savings,S,Utility,U,Gas(personal),E,Auto parts(personal),X,Auto repair,W,SALES TAX,T
  116.     RESTORE
  117.     MONTH.TOTAL=0.0
  118.     DIM CATEGORY.SUM(19)
  119.     FOR H%=1 TO 19
  120.          CATEGORY.TOTAL=0.0
  121.          PRINT TAB(20);"............."
  122.          PRINT TAB(20);CATEGORY.NAME$(H%)
  123.          PRINT
  124.          FOR I%=1 TO FILE.RECORD.LENGTH%
  125.               FOR J%=1 TO 4
  126.                    WHILE EXPENSE.CAT$(I%,J%)=CATEGORY.CODE$(H%)
  127.                         CATEGORY.TOTAL=CATEGORY.TOTAL+ EXPENSE(I%,J%)  
  128.                         IF LEN(PAYEE$(I%))<10 THEN \
  129.                               PAYEE$(I%)=PAYEE$(I%)+"     "
  130.                         PRINT TAB(09); DATE%(I%);TAB(13);":";PAYEE$(I%),
  131.                         PRINT USING "$$####.## ";EXPENSE(I%,J%)  
  132.                         GOTO 30  REM logically, we take next I%
  133.                         WEND
  134.                    IF EXPENSE.CAT$(I%,J%+1)="" THEN GOTO 30
  135.                    NEXT J%
  136. 30            NEXT I%
  137.         CATEGORY.SUM(H%)=CATEGORY.TOTAL
  138.         IF LEN(CATEGORY.NAME$(H%))<13 THEN \
  139.              CATEGORY.NAME$(H%)=CATEGORY.NAME$(H%)+"         "
  140.         PRINT TAB(44);"--------"
  141.         PRINT "TOTAL FOR ";CATEGORY.NAME$(H%),
  142.         PRINT USING "$$#####.## ";CATEGORY.SUM(H%)
  143.         MONTH.TOTAL=MONTH.TOTAL+CATEGORY.TOTAL  
  144.         NEXT H%
  145. PRINT
  146. PRINT "TOTAL EXPENSES FOR THIS MONTH ARE: ";
  147. PRINT USING "$$######.## "; MONTH.TOTAL
  148. REM
  149. REM   We now output the month's totals to the annual totals disc file.
  150. REM
  151.       IF UPDATE% THEN UPDATE%=0 : GOTO 45
  152. 40    IF END # 2 THEN 42
  153.       OUT.FILE.LENGTH%=FN.CALCULATE.FILE.NO%(OUT.FILE.NAME$,64,2,0)
  154. 42    MONTH.CODE$=RIGHT$(FILN$,3)
  155.       PRINT # 2; "*", MONTH.CODE$,YEAR$
  156.       FOR H%=1 TO 19
  157.            PRINT # 2; " ", CATEGORY.CODE$(H%),CATEGORY.SUM(H%)
  158.            PRINT "disc entered:";CATEGORY.NAME$(H%);":";CATEGORY.SUM(H%)
  159.            NEXT H%
  160.       PRINT # 2; "=",MONTH.TOTAL
  161.       PRINT "disc entered total for ";MONTH.CODE$;",";YEAR$
  162. 45    INPUT "Any other files to process{Y/N}?"; RSS$
  163.       IF RSS$="" THEN 45
  164.       IF RSS$="Y" THEN CLOSE 1 : OPEN.OUT.FILE%=-1 : GOTO 10
  165.       IF RSS$="N" THEN 50
  166.       PRINT "Your response is not recognizeable" : GOTO 45
  167. 50    PRINT TAB(20); "end of this routine."
  168.       IF OPEN.TWO% THEN CLOSE 2
  169. END   REM: Really, isn't Algol much neater?
  170. EOF