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.