MDX( ) example
The following utility function generates a program file that will recreate all indexes from scratch. This generated program also documents the index tags. It uses the MDX( ) function to get the name of the .MDX file that contains the active index tag. If there is no active index tag, the production .MDX is used. Please note that this program does not take into account primary and distinct indexes.
PROCEDURE GenMDX( cFile )
local cMdx, cMdxFile
cMdx = mdx( )
if cMdx == ""
*-- If no active index tag, try production .MDX
cMdx = mdx( 1 )
if cMdx == ""
msgbox( "No MDX file", "Nothing to do", 48 )
return
endif
endif
*-- Set OF clause for non-production .MDX
cMdxFile = iif( cMdx == mdx( 1 ), "", [ of "] + cMdx + ["] )
*-- Remove drive and/or path from .MDX filename
*-- (after setting OF clause, because that checks cMdx)
cMdx = substr( cMdx, max( rat( ":", cMdx ), rat( "\", cMdx ) ) + 1 )
local lSafety
lSafety = ( set( "SAFETY" ) == "ON" )
set safety on
if argcount( ) < 1
cFile = left( cMdx, rat( ".", cMdx ) - 1 ) + "X.PRG"
endif
set alternate to ( cFile )
set console off
?
set alternate on
??"* " + cFile
? "*"
? "* Index file for " + cMdx
if cMdxFile == ""
?? " (production .MDX)"
endif
? "*"
? "* Generated on " + dtoc( date( ) ) + " " + time( )
? "*"
?
? [*-- Delete all current tags from specific .MDX only]
? [do while "" # tag( "] + cMdx + [", 1 )]
? [ delete tag tag( "] + cMdx + [", 1 )]
? [enddo]
?
nNdx = 1
do while "" # key( cMdx, nNdx )
? [index tag ] + transform( tag( cMdx, nNdx ), "@! XXXXXXXXXX" ) + ;
cMdxFile + [ on ] + key( cMdx, nNdx )
if "" # for( cMdx, nNdx )
?? [ for ] + for( cMdx, nNdx )
endif
if descending( cMdx, nNdx )
?? [ descending]
endif
if unique( cMdx, nNdx )
?? [ unique]
endif
nNdx = nNdx + 1
enddo
close alternate
if .not. lSafety
set safety off
endif
The function uses the KEY( ), FOR( ), DESCENDING( ), and UNIQUE( ) functions to get the definition of each index.