Clear all Rand(-1) #Define MAXDEPTH 200 Create cursor Multilevel (parentid c(10),nodeid c(10), nodedepth i) Local ix For ix=1 to 5 Insert into Multilevel ; (parentid,nodeid,nodedepth) ; values ; ('',sys(2015),1) Endfor For lnDepth=1 to MAXDEPTH InsertNodes(lnDepth) If reccount()>200000 && Don't expect an exit at around 200000 Exit Endif Endfor Select Multilevel Index on parentid Tag parentid Index on nodeid Tag nodeid Locate Brow title 'Press escape on a record - Branch for NodeId will be returned next' lcNodeId = Multilevel.nodeid Start=seconds() GetBranch(lcNodeId) ?seconds()-start locate Brow * You could cut down time if instead of SQL crsNodes had all info *Select * from Multilevel where nodeid in (select nodeid from crsNodes) Return Function InsertNodes Lparameters tnDepth Local ix Select nodeid from Multilevel ; where nodedepth = tnDepth ; into cursor crsTemp Scan For ix=1 to int(rand()*5)+1 && Insert few childs for parentnode Insert into Multilevel ; (parentid,nodeid,nodedepth) ; values ; (crsTemp.nodeid,sys(2015),tnDepth+1) Endfor Endscan Function GetBranch Lparameters tcNodeId Select Multilevel =seek(tcNodeId,'Multilevel','NodeId') && For first rec. get itself scatter memvar Set order to tag parentid Local lnRec, lcNodeId afields(arrStruc) Create cursor crsNodes from array arrStruc Insert into crsNodes from memvar Scan lnRec=recno('crsNodes') lcNodeId = crsNodes.nodeid Select Multilevel Seek crsNodes.nodeid Scan while parentid == lcNodeId scatter memvar Insert into crsNodes from memvar Endscan Select crsNodes Go lnRec EndscanCetin