======================================================================
     SUMMING IN FORMS
     ======================================================================
     PRODUCT:  R:BASE             VERSION :  4.0
     AREA   :  FORMS              CATEGORY:  SUMMING        DOCUMENT#:  652
     ======================================================================
 
 
     Over the years many Exchange articles have explained how to sum the
     rows in a region of a form and display the total on the screen. None
     of the methods worked really well because of the limitations of regions
     in forms and the programming commands available. The desired visual
     result was usually something like the following example below, where
     you would have the total located once and it would accumulate as each
     row was entered into the region.
 
     Until now, this format was next to impossible to achieve because the
     total always had to be a located field. The new SCREEN RESTORE command
     available in R:BASE 4.0 allows for greater versatility when writing
     entry/exit procedures (EEPs). SCREEN RESTORE lets you turn off the
     screen refresh when you return from the EEP to your form. Now, values
     displayed on the screen (form) using WRITE or SHOW VARIABLE commands
     in an EEP stay on the form when you include SCREEN RESTORE OFF in the
     EEP. This new command makes easy work of displaying a running total of
     rows in a region.
 
     The total is calculated in the EEP much the same way as the Summing in
     Forms EEP shown in the May/June 1990 Exchange. The difference is in how
     the total is returned to the form. Prior to R:BASE 4.0, you had to
     return the value in a variable or through a playback file. In R:BASE
     4.0, using SCREEN RESTORE OFF, you can simply write the value to a
     location on the screen.
 
     An Example
     ==========
     This example uses a form based on the transmaster and transdetail
     tables. Design it as shown below.
 
     +======================================================================+
     ||                                                                    ||
     ||    Transid: [       ]     Date: [         ]                        ||
     ||                                                                    ||
     ||    Model  Description            Units  Price      Extended Price  ||
     ||  +---------------------------------------------------------------+ ||
     ||  | [    ] [                    ] [    ] [        ] [           ] | ||
     ||  | [    ] [                    ] [    ] [        ] [           ] | ||
     ||  | [    ] [                    ] [    ] [        ] [           ] | ||
     ||  | [    ] [                    ] [    ] [        ] [           ] | ||
     ||  | [    ] [                    ] [    ] [        ] [           ] | ||
     ||  +---------------------------------------------------------------+ ||
     ||                                  Invoice Total:  $ [           ]   ||
     ||                                                                    ||
     +======================================================================+
 
 
 
 
 
 
 
 
 
 
 
 
 
     The transdetail table is a region and has these expressions defined
     for the table:
 
    1.  INTEGER :  vtransid     =    transid
    2.  INTEGER :  vdetailnum   =    detailnum
    3.  TEXT    :  vextprice    =    (price*units)
    4.  INTEGER :  vunits       =    units
    5.  CURRENCY:  vprice       =    price
 
     You still need to define expressions to pass values to an EEP; that's
     what these expressions (except for vextprice) are doing.  Locate the
     columns from the transdetail table in the region; you don't need to
     locate variables except for the variable vextprice.
 
     Place sum1.eep (listed below) as an entry procedure on the first field
     of table 1 in the form (the transid column of table transmaster). When
     you add data with the form, this EEP displays $0.00 in the total until
     detail records are added. When you edit data with the form, this EEP
     displays the correct total for the detail records while moving through
     the rows in transmaster.
 
     *( SUM1.EEP )
 
     SET MESSAGES OFF
     SET ERROR MESSAGES OFF
     SET VAR vsum CURRENCY,vtemp CURRENCY=NULL
     SELECT SUM(price * units) INTO vsum FROM transdetail +
      WHERE transid = .vtransid
     SET VAR vtemp =.vsum
     WRITE .vtemp AT 19,54 USING '99,999,999.00' black ON cyan
     CLEAR VAR vsum,vtemp
     SCREEN RESTORE OFF
     RETURN
 
     The EEP uses the SELECT command to compute the total and the SCREEN
     RESTORE command to not clear the screen when the form is redisplayed.
     This leaves the total displayed with the WRITE command on the screen.
     Note that the WRITE command uses a picture format and colors to display
     the total.
 
     Place SUM2.EEP (listed below) as an exit procedure on the field to
     total; in this example it's placed as an exit procedure on the price
     column even though it is actually totaling extprice (a non-editable
     field).
 
     *( SUM2.EEP )
 
     SET MESSAGES OFF
     SET ERROR MESSAGES OFF
     SET VAR vp CURRENCY, vu INTEGER, vsum CURRENCY
     SELECT SUM(price * units) INTO vsum FROM transdetail +
      WHERE transid = .vtransid
     SELECT price,units INTO vp,vu FROM transdetail +
      WHERE transid=.vtransid AND detailnum=.vdetailnum
     IF (.vp*.vu) < > (.vprice*.vunits) THEN
       SET V vtemp = (.vsum + (.vprice * .vunits) - (.vp * .vu))
     ELSE
       SET VAR vtemp=.vsum
     ENDIF
     WRITE .vtemp AT 19,54 USING '99,999,999.00' black ON cyan
     CLEAR VAR vp,vu,vsum,vtemp
     SCREEN RESTORE OFF
     RETURN
 
 
 
     The EEP uses the SELECT command to compute the total. By subtracting
     VP and VU, the EEP allows for the possibility that the region might
     have only one row or that you have moved up and down to different rows
     in the region. Also, because the EEP is evaluated every time you leave
     the field, you need to make sure that it doesn't re-add values and make
     the total larger than it should be. The IF statement checks to see
     whether the price or units fields have been changed; if so, a new total
     is calculated using the variables from the form.
 
     Note the use of the SCREEN RESTORE command in the EEP to not clear the
     screen when the form is redisplayed. This leaves the total displayed
     with the WRITE command on the screen when you return to the form.
 
     To figure out the correct screen coordinates for the WRITE command,
     modify the form and position your cursor at the location where you
     want the total to display. The lower right corner of the screen shows
     the current row and column location of the cursor. Add 1 to the first
     coordinate (the row), and use those two numbers as the coordinates in
     the AT section of the WRITE command.
 
     This form works well for both Add data (ENTER) and Edit data (EDIT
     USING). Although your database might not fit exactly into this struc-
     ture, you can adapt these ideas using the SCREEN RESTORE feature to
     display totals and other information on your forms easily from within
     an EEP.