*/***************************************************************************
*# Get CDX Structure of a DBF
*/Program : SI_CDXPRG
*/System : Fox Library
*/Purpose : Place cdx information in a memo field in the SYSINDEX.DBF
*/Syntax : do sysindex
*/Returns : nothing
*/Parameter : none
*/Defaults : none
*/Requires : There Must Be A Database SYSINDEX in the default directory
*/Changes : SYSINDEX.CDXPRG FIELD
*/Calls : Nothing
*/Version : 1.0
*/Dated : 12/03/96
*/Written By: David W. Grewe
*/***************************************************************************
*& Utility - Reindex maintenance
*/***************************************************************************
*/ Record Of Change
*/
*/***************************************************************************
LPARAMETERS plTest
*
* set up enviroment
*
IF plTest
SET STEP ON
ENDIF
*
PUBLIC lcOnError,lcDbf1,lcTXT1,lcTXT2
PUBLIC lcDbf
lcOnError = ON('ERROR')
*
SET TALK OFF
*
* open database to collect info from
*
CLOSE TABLES ALL
CLOSE DATABASES ALL
USE sysindex
GOTO TOP
SCAN ALL
*
* check to make sure your not going to open sysindex.dbf a 2nd time
*
lcDbf = ALLTRIM(UPPER(sysindex.NAME))
IF lcDbf = "SYSINDEX"
LOOP
ENDIF
WAIT "Working on file " + lcDbf WINDOW NOWAIT NOCLEAR
*
* define loop memvars
*
*
* open dbf and get the status to a temp file
*
SELECT 0
ON ERROR *
USE (lcDbf)
*
* Create the output file
*
DO CASE
CASE VAL(VERSION(4)) => 7
DO VFP_V7
CASE VAL(VERSION(4)) => 5
DO VFP_V5
OTHERWISE
DO VFP_V3
ENDCASE
*
ENDSCAN
*
ON ERROR &lcOnError
CLEAR
WAIT CLEAR
RETURN
*
* define local procedures
*
*************************************************************
*this is a routine that can be used if no Index ASC file is created
*
*
*
PROCEDURE VFP_V3
LOCAL lcString,lnTag,lnKey,lcClause
*
* make sure the temp files do not exist
*
lcDbf1 = lcDbf + ".DBF"
lcTXT1 = lcDbf + ".TXT"
lcTXT2 = lcDbf + ".TTX"
DELETE FILE (lcTXT1)
DELETE FILE (lcTXT2)
LIST STATUS TO FILE (lcTXT1)
USE
*
* open the temp status file and check to see if it is big enought to play with
*
lnIntxt = FOPEN(lcTXT1 ,12)
L_SIZE = FSEEK(lnIntxt , 0 , 2)
IF L_SIZE > 1
= FSEEK(lnIntxt , 0)
lnOuttxt = FCREATE(lcTXT2)
ON ERROR
DO WHILE !FEOF(lnIntxt)
lcString = FGETS(lnIntxt)
lcString = UPPER(ALLTRIM(lcString))
IF lcString = "INDEX "
lcString = STRTRAN(lcString , " " , " ")
lcString = STRTRAN(lcString , " " , " ")
lcString = STRTRAN(lcString , " " , " ")
lcString = STRTRAN(lcString , " COLLATE: MACHINE" , "")
lcString = STRTRAN(lcString , ":" , "")
lcString = STRTRAN(lcString," KEY "," ON ")
lcString = STRTRAN(lcString , " " , " ")
=FPUTS(lnOuttxt,lcString)
ENDIF
IF lcString = "FILE SEARCH PATH:"
EXIT
ENDIF
ENDDO
*
= FCLOSE(lnOuttxt)
= FCLOSE(lnIntxt)
*
* bring the output file into the database
*
SELECT sysindex
APPEND MEMO sysindex.CDXPRG FROM (lcTXT2) OVERWRITE
ELSE
= FCLOSE(lnIntxt)
ENDIF
DELETE FILE (lcTXT1)
DELETE FILE (lcTXT2)
RELEASE pnInTxt,pnOutTxt,lcString,lnTag,lnKey,lcClause
RETURN
*
*
*
PROCEDURE VFP_V5
LOCAL lcString AS CHARACTER
LOCAL lnTags AS NUMBER
*
* get all indexes on table
*
lnTags = TAGCOUNT()
FOR x = 1 TO lnTags
lcString = ''
IF !EMPTY(TAG(x)) && Checks for index tags
lcString = "INDEX ON " + SYS(14,x) + " TAG "+ TAG(x) + " "
lcFilter = SYS(2021,x)
IF !EMPTY(lcFilter)
lcString = lcString + "FOR "+lcFiler+" "
ENDIF
lcString = lcString + IIF(DESCENDING(x) , "DESCENDING " , "ASCENDING ")
DO CASE
CASE UNIQUE(x)
lcString = lcString + "UNIQUE "
CASE CANDIDATE(x)
lcString = lcString + "CANDIDATE "
ENDCASE
IF x = 1
REPLACE sysindex.CDXPRG WITH lcString+CHR(13)+CHR(10)
ELSE
REPLACE sysindex.CDXPRG WITH lcString+CHR(13)+CHR(10) ADDITIVE
ENDIF
ELSE
EXIT
ENDIF
ENDFOR
USE
SELECT sysindex
RELEASE lnTags,lcString,x
RETURN
*
*
*
PROCEDURE VFP_V7
LOCAL lcString AS CHARACTER
LOCAL lnTags AS NUMBER
*
* Get Tag Information In an Array
*
lnTags=ATAGINFO(laCdxTag)
IF lnTags > 0
FOR x = 1 TO lnTags
lcString = "INDEX ON " + laCdxTag[x,3] + " TAG " +laCdxTag[x,1] + " "
IF !EMPTY(laCdxTag[x,4])
lcString = lcString + "FOR " + laCdxTag[x,4] + " "
ENDIF
IF !EMPTY(laCdxTag[x,5])
lcString = lcString + laCdxTag[x,5] + " "
ENDIF
IF laCdxTag[x,2] <> "REGULAR"
lcString = lcString + laCdxTag[x,2] + " "
ENDIF
IF x = 1
REPLACE sysindex.CDXPRG WITH lcString+CHR(13)+CHR(10)
ELSE
REPLACE sysindex.CDXPRG WITH lcString+CHR(13)+CHR(10) ADDITIVE
ENDIF
ENDFOR
ENDIF
*
USE
SELECT sysindex
RELEASE lcString,lnTags,laCdxTag,x
RETURN