>Field Name Type Width >LVLCODE Numeric 2 >PRCODE Numeric 2 >NAME Character 20 >>
> SELECT LPAD(' ',3*LVLCODE) || Name, > LVLCODE, PRCODE > FROM LEVELMST > CONNECT BY PRIOR LVLCODE = PRCODE > START WITH PRCODE = 0 >>
> SELECT LPAD(' ',3*LVLCODE) || Name, > LVLCODE, PRCODE > FROM LEVELMST > CONNECT BY LVLCODE = PRIOR PRCODE > START WITH LVLCODE = 17 >>
Select first_Name-(' '+last_Name) As Name,; INT(Val(emp_id)) As lvlCode, ; INT(Val(reports_to)) As prCode ; FROM (_samples+'data\employee') ; INTO Cursor myTable nofilter Use In 'employee' Index On lvlCode Tag lvlCode Select Padr(Name,250) As Name,lvlCode,prCode ; FROM myTable ; WHERE .F. ; INTO Cursor crsResult ; readwrite Select myTable Scan For prCode = 0 Scatter Name oRoot Insert Into crsResult From Name oRoot GetChildren('lvlCode','prCode',lvlCode,'crsResult','myTable','lvlCode',1) ENDSCAN Select crsResult locate BROWSE NAME oResult nowait oResult.AutoFit() Procedure GetChildren(tcPKey,tcFKey,tuFkey,tcTarget,tcSource,tcTag,tnPad) Local oRecord,ix Local Array aChildren[1] Select &tcPKey ; FROM (m.tcSource) ; WHERE &tcFKey == m.tuFkey ; INTO Array aChildren If _Tally > 0 For ix = 1 To Alen(aChildren,1) Select (m.tcSource) =(Seek(aChildren[m.ix,1],m.tcSource,m.tcTag)) Scatter Name oRecord oRecord.Name = Space(m.tnPad*3)+oRecord.Name Insert Into (m.tcTarget) From Name oRecord GetChildren(m.tcPKey,m.tcFKey,aChildren[m.ix,1],m.tcTarget,m.tcSource,m.tcTag, m.tnPad+1) Endfor Endif EndprocGetting root from child is much easier.