home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Du Jour
/
SoftwareDuJour.iso
/
BUSINESS
/
DBASE
/
DBASEACC.ARC
/
PAYBILLS.PRG
< prev
next >
Wrap
Text File
|
1979-12-31
|
9KB
|
254 lines
* PAYBILLS.CMD
* Before this procedure can be accessed, the check number and balance must
* be verified in the PAYMENU command file.
* This is one of the longer files, but the individual portions of it are
* not too complicated.. Repetitive procedures in the main loop (controlled
* by the variable "Finished") could have been put in separate command files
* to make this file easier to understand and maintain, but this way it
* minimizes disk accesses and increases speed.
* This file finds bills to be paid in the CostBase, generates the next
* check number, writes a check in the CheckFil and maintains the checkbook
* balance.
* The next check number and checkbook balance are recalled from a file
* called Constant.MEM. The final values for both of these are stored in the
* same file after all the bills have been paid.
* The date is entered once at the start of the procedure, then is
* automatically inserted into each entry. The date is checked to see that
* it is in the YYMMDD format, and that the values are within possible
* limits )month from 1 to 12, day from 1 to 31, year=This Year).
* Entries must include at least the name of the party being paid.
* Balances are automaically computed and shown to the operator.
* Check numbers are automaically assigned by the computer.
* If several entries are made against a single check number (the
* opeeerator has this option), these are added and shown as a single
* item in the printout
RESTORE FROM Constant
DO GetDate
SELECT PRIMARY
USE CostBase INDEX $Supp
* Initialize. "New" is used to determine whether the program should generate
* a new check number or use the old one (where several bills to a single
* supplier are being paid). "Finished" is the control variable that determines
* whether we should run through the procedure again, or are done paying bills.
STORE 'N' TO New
STORE 'N' TO Finished
DO WHILE !(Finished) <> 'F'
STORE "C" TO Entering
DO WHILE !(Entering) = 'C'
ERASE
@ 3, 0 SAY 'CHECK NUMBER: '+NextCheck+' BALANCE: '+STR(MBalance,9,2)
? CHR(7)
@ 4,0
ACCEPT ' MAKE CHECK TO ' TO MName
ACCEPT ' INVOICE NUMBER ' TO MBill:Nmbr
ACCEPT ' ENTER AMOUNT ' TO Temp
STORE !(MName) TO MName
STORE !(MBill:Nmbr) TO MBill:Nmbr
STORE VAL(Temp) TO MAmount
STORE MAmount*1.00 TO MAmount
@ 6,19 SAY MName
@ 7,19 SAY MBill:Nmbr
@ 8,19 SAY MAmount
@ 11, 0 SAY ' C to CHANGE,'
? ' <Return> to continue.'
WAIT TO Entering
ENDDO Entering
IF LEN(MName) > 10
STORE $(MName,1,10) TO Key
ELSE
STORE MName TO Key
ENDIF
IF Key > ' '
STORE T TO Looking
@ 11, 0 SAY "I'M LOOKING, I'M LOOKING!!"
@ 12, 0
@ 13, 0
STORE 0 TO Start
FIND &Key
IF # = 0
?
? " GEE, I CAN'T FIND THE NAME. Please check the spelling."
? " Or Maybe it hasn't been posted to the COSTBASE yet."
? '<Return> to continue.'
WAIT
ERASE
ELSE
DO PayFind
ENDIF there is an unpaid bill for the supplier
* "Start" is brought in from PayFind.CMD. If we started at the first
* entry for a name (had only the name), Start=0. If we had mmore than
* the name, Start contains the record number we started on. Since this
* could be in the middle of the listing, we use "Counter" so that we can
* come back to the top of the listing for the name once.
IF Start > 0
STORE 0 TO Counter
ELSE
STORE 1 TO Counter
ENDIF
STORE ' ' TO Confirm
DO WHILE !(Confirm) <> 'P' .AND. .NOT. Looking
@ 9,0
? 'RECORD NAME AMOUNT BILL #';
+' DATE'
?
DISPLAY ' '+Name, Amount, Bill:Nmbr, Bill:Date
?
? CHR(7)
? ' P to PAY this bill,'
? ' Q to QUIT without paying,'
? ' <Return> to continue.'
ACCEPT ' ' TO Confirm
IF !(Confirm) = 'Q'
IF !(New) = 'S'
STORE STR(VAL(NextCheck)+1,4) TO NextCheck
ENDIF
STORE ' ' TO New
STORE T TO Looking
ELSE
IF !(Confirm) = 'P'
STORE STR(#,5) TO Found
REPLACE Check:Date WITH Date, Check:Nmbr WITH NextCheck
STORE (MBalance-Amount) TO MBalance
SELECT SECONDARY
USE Checkfil
APPEND BLANK
REPLACE Check:Date WITH P.Check:Date, Name WITH P.Name,;
Check:Nmbr WITH P.Check:Nmbr, Balance WITH MBalance,;
Amount WITH P.Amount, Bill:Nmbr WITH P.Bill:Nmbr
SELECT PRIMARY
ERASE
@ 3, 0 SAY 'CHECK WRITTEN: '+NextCheck+;
' NEW BALANCE: '+STR(MBalance,9,2)
?
DISPLAY 'PAYMENT MADE: '+Check:Date, Name, Amount, Bill:Nmbr,;
Bill:Date OFF
?
? ' S for SAME SUPPLIER (Repeats Check#)'
? CHR(7)
ACCEPT ' <Return> to continue.' TO New
IF !(New) <> 'S'
STORE STR(VAL(NextCheck)+1,4) TO NextCheck
ELSE
STORE ' ' TO Confirm
ENDIF
ENDIF
IF !(New) = 'S' .OR. !(Confirm) <> 'P'
* If Confirm <> 'P', we rejected the first unpaid bill that was
* shown. Rather than going back to the beginning, the loop
* below SKIPs to the next INDEXed name until we find an unpaid
* bill, or go beyond the records for the name we are paying.
* The same applies if we want to pay another bill to the
* same supplier (New='S'). Since we are in the file on the
* name we want we SKIP to the next recrods until we find an
* unpaid bill or run out of records for that name.
* If we had only the name and started with the first unpaid
* bill we stop now since we have looked at all the unpaid bills
* for that supplier.
* If we could have entered the list of records for this
* supplier in the middle (more than the name provided0, we look
* at the unpaid bills between where we are and the end of the
* list, then go up to the first entry for that name and check
* all the unpaid bills that we had previously skipped past.
* This is controlled by Counter.
* After the second FIND in the command file (below) we
* stop looking when the record number we are on is greater than
* or equal to the number of the record we start on (Start).
SKIP
DO WHILE Check:Nmbr <> ' ' .AND. Name=Key .AND. .NOT. EOF
SKIP
ENDDO
* We enter this loop when we reach the end of the records with
* names that match the one we are looking for. If we started
* with the first unpaid bill, the record number is greater than
* Start (because Start=0) and Counter=1 (because we set it to
* that value). The second IF below is True and we terminate
* the search.
* If Start>0, Counter=0 the first time we run out of
* records with a matching name, so the program does the ELSE
* commands below.
* Start is still >0 and Count is now 1, so the last term in
* the first IF applies. On this second pass when we get to a
* record number >=Start, we drop into the loop and do the IF to
* terminate the search because we have now looked at all the
* unpaid bills for the name we entered.
IF EOF .OR. Name <> Key .OR. (# >= Start .AND. Start <> 0;
.AND. Counter >0)
IF (# >= Start .AND. Counter > 0)
STORE T TO Looking
@ 4, 0
? CHR(27)+CHR(121)
? ' We have now looked at all the entries for '+MName
? ' <Return> to continue.'
? CHR(7)
IF !(New)='S'
STORE STR(VAL(NextCheck)+1,4) TO NextCheck
STORE 'N' TO New
ENDIF
WAIT
ELSE
STORE Counter + 1 TO Counter
@ 13, 0
@ 16, 0 SAY "I'M WORKING AS FAST AS I CAN...HANG ON!"
FIND &Key
DO WHILE Check:Nmbr <> ' '
SKIP
ENDDO
ENDIF
ENDIF
ENDIF is it the right record
ENDIF
ENDDO Confirm the record
ENDIF
IF !(New) <> 'S'
@ 4,0
? CHR(27)+CHR(121)
? ' F if FINISHED, '
? CHR(7)
ACCEPT ' <Return> to continue.' TO Finished
ENDIF
ENDDO Finished
RELEASE Mname, MBill:Nmbr, Key, MAmount, Start, Found, Looking, New, Change,;
Entering, Counter, Temp, Abort, Continue, Finished, Confirm, Date
SAVE TO Constant
USE Checkfil
COUNT FOR .NOT. * TO Any
ERASE
@ 3,0
IF Any=0
? ' No new checks in the checkfile.'
? ' <Return> to continue.'
WAIT
ELSE
? 'There are '-STR(Any,5)+' new checks in the CheckFile.'
? 'Do you want to print the checkstubs now (Y or N)?'
?
WAIT TO Hardcopy
IF !(Hardcopy) = 'Y'
DO NameTest
DO CheckStu
ENDIF
ENDIF
RELEASE All
RETURN