procedure mygrid.column1.header1.click do tag_it with this.parent.parent.RecordSource, justext(this.parent.ControlSource) thisform.refresh() endproc procedure tag_it lparameters tcAlias, tcField, tcTag *===== tcAlias --------- Alias to be indexed *======= tcField --------- dField to be indexed by *===== tcTag --------- Index Tag tcField = lower(alltrim(tcField)) if type(tcField) $ 'MG' return endif if !empty(tcTag) and type('tcTag')='C' tcTag = lower(alltrim(tcTag)) else tcTag = '' endif local lnOldArea, lnTags, lnTag, lcTagName, lnTagNo, lnRow, lcTagToUse, i private paTags[1,2] lnOldArea = select() select (tcAlias) lcCDX = cdx(1,tcAlias) lnTags = tagcount(lcCDX) if lnTags<1 return endif dimension paTags[lnTags,2] for i=1 to lnTags lcTagName = tag(lcCDX,i) lnTagNo = tagno(lcTagName,lcCDX,tcAlias) if !empty(lnTagNo) lcExpr = key(lcCDX,lnTagNo,tcAlias) else lcExpr = [] endif paTags[i,1] = lcTagName paTags[i,2] = lcExpr endfor if !empty(tcTag) and type('tcTag') = 'C' lnTag = ascan(paTags,tcTag) if lnTag = 0 select (lnOldArea) return '' endif lnRow = asubscript(paTags, lnTag, 1) lcTagToUse = paTags[lnRow,1] else lcTagToUse = FindCreateTag(tcAlias, tcField, tcTag) if empty(lcTagToUse) select (lnOldArea) return '' endif endif if !empty(lcTagToUse) set order to &lcTagToUse endif return endproc function FindCreateTag(tcAlias, tcField, tcTag) local lcExpr, i, lcReturn, lcTag lcReturn = '' for i=1 to alen(paTags,1) lcExpr = lower(alltrim(paTags[i,2])) * Just first word lcExpr = iif(at(' ',lcExpr)>0,substr(lcExpr,1,at(' ',lcExpr)-1),lcExpr) lcExpr = iif(at('+',lcExpr)>0,substr(lcExpr,1,at('+',lcExpr)-1),lcExpr) lcExpr = iif(at('-',lcExpr)>0,substr(lcExpr,1,at('-',lcExpr)-1),lcExpr) * Get rid of all closing brackets in one shot lcExpr = iif(at(')',lcExpr)>0,substr(lcExpr,1,at(')',lcExpr)-1),lcExpr) * Get rid of all opening brackets in one shot lcExpr = strtran(lcExpr,'(','') if tcField = lower(alltrim(lcExpr)) && Tag found lcTag = paTags[i,1] * set order to &lcTag lcReturn = lcTag exit endif endfor return lcReturn endfunc