Article ID: 113175
Article Last Modified on 2/11/2005
USE <database name>
DO colmaker WITH 4 && where 4 is the number of columns desired
REPORT FORM <multiple-column report> PREVIEW
PROCEDURE colmaker
PARAMETER colnum
* Initializes variables
**********************
* Stores fields in database to an array 'repodbf'
=AFIELDS(repodbf)
* Stores number of fields in database to a variable 'numfield'
numfield = ALEN(repodbf,1)
* Stores database name to variable 'dbfname'
dbfname = ALIAS()
* Initializes procedure variables
fldlist = ""
whrclause = ""
totcur = ""
i = 0
* Calculates variables to deal with extra records
extras = RECCOUNT() % colnum
IF extras <> 0
mtracker = CEILING(RECCOUNT()/colnum)
ENDIF
* Generates field list for SELECT statements
FOR i = 1 to numfield
fldlist = fldlist + dbfname+ "."+repodbf(i,1) + ","
ENDFOR
* Adds a field to the resulting SELECT statements to organize
* records
fldlist = fldlist + "CEILING(recno()/"+ALLTRIM(STR(colnum))+") ;
AS TRACKER"
* Deletes any residual temporary databases
oldsaf = SET("SAFETY")
SET SAFETY OFF
FOR i = 1 to colnum
fname = "temp"+ALLTRIM(STR(i)) + ".DBF"
ERASE &fname
ENDFOR
* Creates databases for columns
FOR i = 1 to colnum
curname = "temp" + ALLTRIM(STR(i))
x = IIF(i<colnum,i,0)
SELECT &fldlist FROM (dbfname) INTO TABLE &curname ;
WHERE (RECNO()%colnum)=x
* Creates names for cursors for use in final SELECT
totcur = totcur + curname + ","
ENDFOR
totcur = SUBSTR(totcur,1,LEN(totcur)-1)
* Adds blank records to necessary database to account for extra
* records
IF extras <> 0
FOR i = extras+1 to colnum
fname = "TEMP" + ALLTRIM(STR(i))
SELECT &fname
APPEND BLANK
REPLACE tracker WITH mtracker
ENDFOR
ENDIF
* Builds join condition for resulting databases
FOR i = 1 to colnum-1
whrclause = whrclause + "temp"+ALLTRIM(STR(i)) + ;
".tracker = temp" + ALLTRIM(STR(i+1)) + ;
".tracker AND "
ENDFOR i
whrclause = whrclause + "temp1.tracker = temp" + ;
ALLTRIM(STR(colnum)) + ".tracker"
* Combines resulting database into one final database
SELECT * FROM &totcur INTO CURSOR final ;
WHERE &whrclause
* Deletes residual databases
FOR i = 1 to colnum
fname = "temp"+ALLTRIM(STR(i))
SELECT &fname
USE
fname = fname + ".DBF"
ERASE &fname
ENDFOR
* Returns to resulting cursor
SELECT final
The "final" cursor will contain a copy of each field for the number of
columns specified. For example, using the CUSTOMER database in the FoxPro
TUTORIAL subdirectory, you could create a three-column report by placing
the following expressions in the Detail band:
CNO_A CNO_B CNO_C COMPANY _A COMPANY_B COMPANY _CThe records will appear in order across and down the page. For example:
RECORD 1 RECORD 2 RECORD 3 RECORD 4 RECORD 5 RECORD 6
Additional query words: VFoxWin FoxMac FoxDos FoxWin multi multiple multi- column multicolumn
Keywords: kbcode KB113175