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.