How to Make GENXTAB.PRG Work with Any Table/.DBF

ID: Q113525

2.50 2.50a 2.50b 2.60 | 2.50 2.50a 2.50b 2.60

WINDOWS               | MS-DOS

The information in this article applies to:

SUMMARY

Currently, you can only use GENXTAB.PRG with the first three fields of a database even though the comments in GENXTAB.PRG say otherwise. The comments read as follows:

    Calling example:
    DO genxtab WITH 'XTAB.DBF',.T.,.T.,.T.,1,2,5,.T.

    This command causes GENXTAB to write the output database to
    'XTAB.DBF'. However, XTAB.DBF will be deleted and the output
    stored to a cursor called XTAB. The input database will be closed
    at the conclusion of the program. The rows in XTAB.DBF will
    contain the unique values of field 1 in the database that is
    selected when GENXTAB is called, the columns will contain
    unique values of field 2 in the input database, and the
    cell values will come from field 5 in the input database.
    The thermometer will be shown. A total field will be created.

All the parameters work correctly except the row, column, and cell parameters. GENXTAB.PRG always uses the first field as the row, the second field as the column, and the third field as the cell.

To correct this problem, modify GENXTAB.PRG using the code below and save it as GENXTABX.PRG.

For more information about the meaning of the parameters, please see the following article(s) in the Microsoft Knowledge Base:

   ARTICLE-ID: Q113971
   TITLE     : How to Call GENXTAB.PRG

MORE INFORMATION

To make the modifications, choose Go To from the Edit menu, and then change the lines below.

WARNING: All of the following modifications must be made at the same time in order to maintain the functionality of GENXTABX.PRG.

   Line 238
   ORIGINAL CODE:
      IF inpfields[1,2] $ 'MGP'
   CHANGE TO:
      IF inpfields[m.rowfld,2] $ 'MGP'

   Line 242
   ORIGINAL CODE:
      IF inpfields[2,2] $ 'MGP'
   CHANGE TO:
      IF inpfields[m.colfld,2] $ 'MGP'

   Line 246
   ORIGINAL CODE:
      IF inpfields[3,2] $ 'MGP'
   CHANGE TO:
      IF inpfields[m.cellfld,2] $ 'MGP'

   Line 310
   ORIGINAL CODE:
      outarray[1,1] = mapname(inpfields[1,1])
   CHANGE TO:
      outarray[1,1] = mapname(inpfields[m.rowfld,1])

   Line 311
   ORIGINAL CODE:
      outarray[1,2] = inpfields[1,2]
   CHANGE TO:
      outarray[1,2] = inpfields[m.rowfld,2]

   Line 312
   ORIGINAL CODE:
      outarray[1,3] = inpfields[1,3]
   CHANGE TO:
      outarray[1,3] = inpfields[m.rowfld,3]

   Line 313
   ORIGINAL CODE:
      outarray[1,4] = inpfields[1,4]
   CHANGE TO:
      outarray[1,4] = inpfields[m.rowfld,4]

   Line 317
   ORIGINAL CODE:
      outarray[i,2] = inpfields[3,2]                   && field type
   CHANGE TO:
      outarray[i,2] = inpfields[m.cellfld,2]           && field type

   Line 318
   ORIGINAL CODE:
      outarray[i,3] = inpfields[3,3]                   && field length
   CHANGE TO:
      outarray[i,3] = inpfields[m.cellfld,3]           && field length

   Line 319
   ORIGINAL CODE:
      outarray[i,4] = inpfields[3,4]                   && decimals
   CHANGE TO:
      outarray[i,4] = inpfields[m.cellfld,4]           && decimals

   Line 325
   ORIGINAL CODE:
      outarray[ALEN(coluniq)+2,2] = inpfields[3,2]
   CHANGE TO:
      outarray[ALEN(coluniq)+2,2] = inpfields[m.cellfld,2]

   Line 326
   ORIGINAL CODE:
      outarray[ALEN(coluniq)+2,3] = inpfields[3,3]
   CHANGE TO:
      outarray[ALEN(coluniq)+2,3] = inpfields[m.cellfld,2]

   Line 327
   ORIGINAL CODE:
      outarray[ALEN(coluniq)+2,4] = inpfields[3,4]
   CHANGE TO:
      outarray[ALEN(coluniq)+2,4] = inpfields[m.cellfld,4]

Save the file as GENXTABX.PRG so that the original GENXTAB can be used. This completes the changes necessary to make GENXTABX.PRG work with any database and any character or numeric fields you choose. To test the changes, use the following example, which uses the SALESMAN.DBF file in the TUTORIAL subdirectory off the main FoxPro directory.

Example

   *** CODE BEGINS HERE ***
   CLOSE DATA
   newgxtx=GETFILE('PRG',"Select GENXTABX.PRG","Select")
   oldgxt=_genxtab
   _genxtab=newgxtx
   SELECT 0
   gxtname=GETFILE('DBF',"Chose SALESMAN.DBF","USE")
   USE (gxtname) EXCLUSIVE
   SET SAFETY OFF
   INDEX ON name+state TAG combo
   SET SAFETY ON
   DO (_GENXTAB) WITH 'TEST_GXT',.T.,.T.,.T.,4,9,5,.T.
   BROWSE
   CLOSE DATA
   _genxtab=oldgxt
   *** CODE ENDS HERE ***

To make GENXTABX your default _genxtab, add the following line to your CONFIG.FP or CONFIG.FPW file:

   _GENXTAB=<path to FoxPro directory>\GENXTABX.PRG

Additional reference words: FoxDos FoxWin 2.50 2.50a 2.50b 2.60 crosstab KBCategory: KBSubcategory: FxenvConfigfp
Keywords          : kbcode FxenvConfigfp 
Version           : 2.50 2.50a 2.50b 2.60 | 2.50 2.5
Platform          : MS-DOS WINDOWS

Last Reviewed: May 22, 1998