dimension paLen[4], paSql[4] SELECT; MAX(LEN(GETWORDNUM(TRIM(Cur2_1.cName),1,'.'))) ; , MAX(LEN(GETWORDNUM(TRIM(Cur2_1.cName),2,'.'))) ; , MAX(LEN(GETWORDNUM(TRIM(Cur2_1.cName),3,'.'))) ; , MAX(LEN(GETWORDNUM(TRIM(Cur2_1.cName),4,'.'))) ; FROM curSource AS Cur2_1; into Array paLen Select MyFunc(cName) as v1; , paSql[2] as v2; , paSql[3] as v3; , paSql[4] as v4; from FROM curSource ; order by 1,2,3,4 function MyFunc(tcName) local lnRun, lcWord for lnRun = 1 to Alen(paLen) lcWord = getWordNum(tcName, m.lnRun, ".") paSql[m.lnRun] = icase( empty(m.lcWord), Space(2*paLen[m.lnRun]) ; , IsDigit(Alltrim(m.lcWord)), Str(Val(m.lcWord), paLen[m.lnRun]) + Padr(StripLeftDigits(Alltrim(m.lcWord)), paLen[m.lnRun]) ; , Replicate("x", PaLen[m.lnRun]) + Padr(m.lcWord, paLen[m.lnRun]) ) next return paSql[1] Function StripLeftDigits(tcWord) local lnRun *-- as the func should only be called with leading digits for lnRun = 2 to len(m.tcWord) if !isdigit(Substr(m.tcWord, m.lnRUn, 1)) exit endif next return Stuff(m.tcWord, 1, m.lnRUn-1, "")