"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" PRINTING BILLS WHEN THE RATE VARIES DEPENDING ON USAGE """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" PRODUCT : R:BASE VERSION : 3.1 CATEGORY : PROGRAMMING SUBCATEGORY : TOOLS """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Here's a report that prints monthly bills by account when the hourly rate varies depending on customer usage during the month--the more hours used, the lower the hourly rate. The database has two tables--USAGE (with accounts, service dates, and hours used), and RATES (with the rate schedule). The problem is how do you get a correct total bill amount for all accounts when you can't determine the correct rate until after you add up all the hours for a given account. Sample Data in USAGE """""""""""""""""""" ACCOUNT SERVICE QUANTITY ------- -------- -------- AA-0001 12/01/90 2 AA-0002 12/02/90 3 AA-0001 12/03/90 6 AA-0002 12/03/90 1 AA-0001 12/04/90 8 Rate Schedule in RATES """""""""""""""""""""" H_MIN H_MAX H_RATE ----- ----- ------ 0 10 $15.00 10 20 $14.50 20 50 $14.00 50 100 $13.00 100 1000000 $12.00 Step by Step Instructions """"""""""""""""""""""""" STEP 1--Before defining the report issue the following SET VAR command to initialize the variables: SET VAR vtotalprev CURRENCY = $0, vacctotal CURRENCY = $0, + vcorrectbill CURRENCY = $0, vtotalbill CURRENCY = $0 STEP 2--Bring up Reports, name the report, and base it on USAGE. Define the following expressions in this order: vsumhours = SUM OF quantity vrate = h_rate IN rates WHERE h_min <= .vsumhours AND h_max > .vsumhours vaccprev CURRENCY = .vtotalbill vacctotal = (.vrate * .vsumhours) vtotalbill = (.vtotalbill + .vacctotal) vtotalprev = (IFEQ(.vaccprev,0,.vcorrectbill,.vtotalprev)) vcorrectbill = (IFEQ(.vaccprev,0,(.vtotalprev + .vacctotal), (.vtotalprev + (.vtotalbill - .vaccprev)))) STEP 3--Define one breakpoint on ACCOUNT, and reset the variables VSUMHOURS, VACCTOTAL, and VTOTALBILL at that breakpoint. STEP 4--Locate VACCTOTAL in the break footer section to print the account total, and locate VCORRECTBILL in the report footer section to print the correct total bill for all accounts. STEP 5--Each time before printing the report, use the SET VAR shown in step 1 to initialize VTOTALPREV, VACCTOTAL, VCORRECTBILL, and VTOTALBILL. Final Report Output """"""""""""""""""" The final report might look like this: Account AA-0001 Hours Service Date 2 12/01/90 6 12/03/90 8 12/04/90 ===== 16 hours at $14.50 per hour: $232.00 Account AA-0002 Hours Service Date 3 12/02/90 1 12/03/90 ===== 4 hours at $15.00 per hour: $60.00 Total billings: $292.00 This works because a report, unlike a form, evaluates its expressions only once for each row and evaluates them in the order they appear. By playing with the expression order, you can have a variable (VACCPREV) save a value from the previous row (.VTOTALBILL) to use in lower expressions (VTOTALPREV and VCORRECTBILL).