The Tree View will have three levels, departments, employees and employee notes. All data will be loaded initially.

1.  Create an AddEntry method routine. This needs five input parameters:

     Your code should look like the following:

     Mthroutine Name(AddEntry)
     Define_Map For(*INPUT) Class(#STD_OBJ) Name(#Column1)
     Define_Map For(*INPUT) Class(#STD_desc) Name(#Column2) Mandatory(' ')
     Define_Map For(*INPUT) Class(#STD_descl) Name(#Column3) Mandatory(' ')
     Define_Map For(*INPUT) Class(#prim_bmp) Name(#Image) Mandatory(*NULL) Pass(*BY_REFERENCE)
     Define_Map For(*input) Class(#Prim_tvit) Name(#ParentItem) Mandatory(*Null) Pass(*By_reference)
     Endroutine     

Note: All except the first map have a Mandatory() parameter, meaning the parameter will be given its Mandatory value if not passed. These parameters are optional.

2.  To complete the AddEntry routine, the following logic is required:

     Assign STD_OBJ to Column1
     Assign STD_DESC to Column2
     Assign STD_DESCL to Column3
     Add entry to TreeView
     Set reference to TreeView.CurrentItem.ParentItem from ParentItem
     Set refrence to TreeViewcurrentItem.Image to Image
     Set TreeView.CurrentItem.hasChildren property to Yes for level 1 and 2
     Set TreeView.CurrentItem.hasChildren poperty to No for level 3

     Your code should look like the following:

     Mthroutine Name(AddEntry)
     Define_Map For(*INPUT) Class(#STD_OBJ) Name(#Column1)
     Define_Map For(*INPUT) Class(#STD_desc) Name(#Column2) Mandatory(' ')
     Define_Map For(*INPUT) Class(#STD_descl) Name(#Column3) Mandatory(' ')
     Define_Map For(*INPUT) Class(#prim_bmp) Name(#Image) Mandatory(*NULL) Pass(*BY_REFERENCE)
     Define_Map For(*input) Class(#Prim_tvit) Name(#ParentItem) Mandatory(*Null) Pass(*By_reference)
     #std_obj := #Column1
     #std_desc := #Column2
     #std_descl := #Column3
     Add_Entry To_List(#TreeView)
     #TreeView.Currentitem.ParentItem <= #ParentItem
     #TreeView.Currentitem.image <= #Image
     * Employee notes have no children
     If (#TreeView.currentitem.level = 3)
     #TreeView.CurrentItem.HasChildren := No
     Else
     #TreeView.CurrentItem.HasChildren := Yes
     Endif
     Endroutine

     Note: When an item HasChildren property is No, an expand symbol is not shown. Employee Notes are level 3 and have no children.

3.  Create a LoadDepts method routine, no maps are required. Add logic to perform the following:

     Read all departments from table xDepartments
     For each entry invoke AddEntry, passing xDepartmentCode, xDepartmentDescription, *blank, xImageDepartment32

     Your code should look like the following:

     Mthroutine Name(LoadDepts)
     Select Fields(#xDepartmentCode #xDepartmentDescription) From_File(xDepartments)
     #com_self.addentry( #xDepartmentCode #xDepartmentDescription "" #xImageDepartment32 )
     Endselect
     Endroutine    

Note: xImageDepartment32 is a Repository Bitmap component.

4.  Create a LoadEmploys method routine with input for department code and ParentItem passed by reference.
Mthroutine Name(LoadEmploys)
Define_Map For(*INPUT) Class(#xDepartmentCode) Name(#DeptCode)
Define_Map For(*INPUT) Class(#prim_tvit) Name(#ParentItem) Pass(*BY_REFERENCE)
Endroutine

     Each employee entry must have a parent item reference to a department entry.

5.  Complete LoadEmploys with the following logic. Note that surname and givennames must be passed to AddEntry as a native string.

Read all employees from index xEmployeeeByDepartment with key DeptCode
Invoke AddEntry passing xEmployeeIdentification, xEmployeeSurname, xEmployeeGivenNames, xImageEmployee32 and ParentItem
End Select

     Your code should look like the following:

     Mthroutine Name(LoadEmploys)
     Define_Map For(*INPUT) Class(#xDepartmentCode) Name(#DeptCode)
     Define_Map For(*INPUT) Class(#prim_tvit) Name(#ParentItem) Pass(*BY_REFERENCE)
 
     Select Fields(#xEmployeeIdentification #xEmployeeSurname #xEmployeeGivenNames) From_File(xEmployeeByDepartment) With_Key(#DeptCode)
     #com_self.AddEntry( #xEmployeeIdentification #xEmployeeSurname.asNativeString #xEmployeeGivenNames.asNativeString #xImageEmployee32 #ParentItem )
     Endselect
     Endroutine
 
6.  Invoke LoadEmploys for each department from LoadDepts passing department code and TreeView.currentitem:

     Mthroutine Name(LoadDepts)
     Select Fields(#xDepartmentCode #xDepartmentDescription) From_File(xDepartments)
     #com_self.addentry( #xDepartmentCode #xDepartmentDescription "" #xImageDepartment32 )
     #com_self.LoadEmploys( #xDepartmentCode #TreeView.currentitem )
     Endselect
     Endroutine
 
7.  Create a LoadNotes method routine with input maps for EmployCode and ParentItem passed by reference

     Mthroutine Name(LoadNotes)
     Define_Map For(*INPUT) Class(#xEmployeeIdentification) Name(#EmployCode)
     Define_Map For(*INPUT) Class(#prim_tvit) Name(#ParentItem) Pass(*BY_REFERENCE)
     Endroutine

8.  Add the following logic to LoadNotes:

     Read all employee notes from index xEmployeeNotesByEmployee with key EmployCode
       For each entry, invoke AddEntry passing these parameters:
     xEmployeeNoteCreateUpdate as display string
     xEmployeeNote as native string, trimmed
     *blank
     xImageDetail32
     ParentItem

     Your code should look like the following:

     Mthroutine Name(LoadNotes)
     Define_Map For(*INPUT) Class(#xEmployeeIdentification) Name(#EmployCode)
     Define_Map For(*INPUT) Class(#prim_tvit) Name(#ParentItem) Pass(*BY_REFERENCE)
     Select Fields(#xEmployeeNote) From_File(xemployeenotesbyemployee) With_Key(#EmployCode)
     #com_self.addentry( #xEmployeeNoteCreateUpdate.asdisplaystring #xEmployeeNote.AsNativeString.trim "" #xImageDetails32 #ParentItem )
     Endselect
 
     Endroutine

9.  Add code to invoke LoadNotes from LoadEmploys, passing xEmployeeIdentification and TreeView.CurrentItem.

     Mthroutine Name(LoadEmploys)
     Define_Map For(*INPUT) Class(#xDepartmentCode) Name(#DeptCode)
     Define_Map For(*INPUT) Class(#prim_tvit) Name(#ParentItem) Pass(*BY_REFERENCE)
 
     Select Fields(#xEmployeeIdentification #xEmployeeSurname #xEmployeeGivenNames) From_File(xEmployeeByDepartment) With_Key(#DeptCode)
     #STD_desc := #xEmployeeSurname.AsNativeString
     #std_descl := #xEmployeeGivenNames.AsNativeString
     #com_self.AddEntry( #xEmployeeIdentification #std_desc #std_descl #xImageEmployee32 #ParentItem )
     #com_self.LoadNotes( #xEmployeeIdentification #TreeView.currentitem )
     Endselect
     Endroutine

10. Invoke LoadDepts from form CreateInstance event routine:

     Evtroutine Handling(#com_owner.CreateInstance)
     Set Com(#com_owner) Caption(*component_desc)
     #com_self.LoadDepts
     Endroutine

11. Compile and test the form.