Sample Code for Summing a Field in a Database

ID: Q114253

2.50 2.50a 2.50b 2.60 3.00 | 2.00 2.50 2.50a 2.50b 2.60 | 2.50b

WINDOWS                    | MS-DOS                     | MACINTOSH

The information in this article applies to:
  • Microsoft Visual FoxPro for Windows, version 3.0
  • Microsoft FoxPro for Windows, versions 2.5, 2.5a, 2.5b, 2.6
  • Microsoft FoxPro for MS-DOS, versions 2.0, 2.5, 2.5a, 2.5b, 2.6
  • Microsoft FoxPro for Macintosh, version 2.5b

SUMMARY

FoxPro does not provide a function that sums a field in a database. The closest FoxPro comes is the command SUM <field> TO memvar. Although this command is useful, you may need to call a function that will sum a field for a given condition.

The sample code below is a user-defined function (UDF) that can sum a field in any specified table for any given condition.

MORE INFORMATION

   **************************************************************
   *                                                            *
   *  Function:     DBSUM()                                     *
   *  Parameters:                                               *
   *      fieldname   C   Required                              *
   *      workarea    N   Optional                              *
   *      condition   C   Optional                              *
   *                                                            *
   *                                                            *
   *   Purpose: Sums any field in the current or specified      *
   *            work area for any logical condition.            *
   *                                                            *
   *   NOTE: When summing a field that is not in the current    *
   *   work area, the alias must be supplied in the first       *
   *   parameter.                                               *
   **************************************************************

   PARAMETERS fieldname, workarea, condition

   *******************************
   * Store parameter count and current work area to memory variables
   *******************************

   STORE PARAMETERS() TO parms
   STORE SELECT() TO currselect

   *******************************
   * Verify that the field name passed in is a numeric field
   *******************************

   IF TYPE(fieldname) != 'N'
      WAIT WINDOW "Data type mismatch" NOWAIT
      RETURN ""
   ELSE

   *******************************
   * Store current record and total records to memory variables
   * Initialize m.sum memory variable
   *******************************

   currecord = RECNO(IIF(parms>1,workarea,currselect))
   m.sum = 0

   *******************************
   * Select the correct work area if not current work area
   *******************************

   IF parms > 1
      SELECT (workarea)
   ENDIF

   *******************************
   * Position cursor at top of file
   * Begin summation loop
   *******************************

   GO TOP
   SCAN FOR IIF(parms > 2,EVALUATE(condition),.T.)
     m.sum = m.sum + EVALUATE(fieldname)
     SET MESSAGE TO ALLTRIM(STR(m.sum,10,2))
   ENDSCAN

   *******************************
   * Reset record pointer
   ******************************

   DO CASE
      CASE currecord > reccount()
         GO BOTTOM
         SKIP 1
      CASE currecord < reccount()
         GO TOP
         SKIP -1
      OTHERWISE
         GO currecord
   ENDCASE

   *******************************
   * Select the original work area if necessary
   *******************************

   IF parms > 1
      SELECT (currselect)
   ENDIF

   SET MESSAGE TO
   RETURN m.sum
   ENDIF

To use the DBSUM() function, execute the following commands in the Command window or in a program:

   USE customer IN 1
   SELECT 0
   ? dbsum("customer.ytdpurch",1,"state = 'NC'")

Additional reference words: VFoxWin 3.00 FoxMac FoxDos FoxWin 2.00 2.50 2.50a 2.50b 2.60 total KBCategory: KBSubcategory: FxenvMemory
Keywords          : kbcode FxenvMemory 
Version           : 2.50 2.50a 2.50b 2.60 3.00 | 2.0
Platform          : MACINTOSH MS-DOS WINDOWS


Last Reviewed: May 22, 1998
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.