This step will add a new srvroutine to the iiixEmployeeDataServer server module, which returns details for a single employee and a list of the employee's notes. This will enable the required employee data to be retrieved with one trip to the server.
In the web page, you will then create a GetEmployee method, which is invoked from the EmployeeList.ItemGotSelection event.
1. Open the server module iiixEmployeeDataServer in the editor.
2. Define working list xEmployeeNotes, for fields xEmployeeNoteGUID, xEmployeeNoteCreateUpdate and xEmployeeNote, with Entrys(*max).
Def_List Name(#xEmployeeNotes) Fields(#xEmployeeNoteGUID #xEmployeeNoteCreateUpdate #xEmployeeNote) Type(*Working) Entrys(*MAX)
3. Copy the srvroutine Find to create srvroutine FindDetails.
4. Extend FindDetails as follows:
Add an output map for the list xEmployeeNotes
Add a Val_error(*next) parameter to the FETCH statement
If status is OK
Select list xEmployeeNotes from logical xEmployeeNotesByEmployee with key xEmployeeIdentification
Add all entries to list xEmployeeNotes
End select
Your code should look like the following:
Srvroutine Name(FindDetails)
Field_Map For(*Input) Field(#xEmployeeIdentification)
Group_Map For(*Output) Group(#xEmployee)
List_Map For(*OUTPUT) List(#xEmployeeNotes)
Field_Map For(*Output) Field(#IO$STS) Parameter_Name(Status)
* Return all data for the keys provided
Fetch Fields(#xEmployee) From_File(xEmployee) With_Key(#xEmployeeIdentification) Val_Error(*NEXT)
If_Status Is(*OKAY)
Clr_List Named(#xEmployeeNotes)
Select Fields(#xEmployeeNotes) From_File(xEmployeeNotesByEmployee) With_Key(#xEmployeeIdentification)
Add_Entry To_List(#xEmployeeNotes)
Endselect
Endif
Endroutine
5. Copy the working list definition xEmployeeNotes to the Windows clipboard.
6. Compile the server module.
7. Switch to the iiiUpdateFromAList web page in the editor.
8. Paste the list definition xEmployeeNotes to the web page.
9. Create a method routine, GetEmployee to perform the following:
Map for input of class STD_CODEL, name EmployeeID
Define a component for iiixEmployeeDataServer / FindDetails, name GetDetails
Assign xEmployee to null
Clear list NotesList
Execute GetDetails asynchronously exchanging EmployeeID, xEmployee, xEmployeeNotes and IO$STS
Within an event routine for GetDetails.Completed
Select list xEmployeeNotes
Add each entry to NotesList
End Select
End routine
Your code should look like the following:
Mthroutine Name(GetEmployee)
Define_Map For(*INPUT) Class(#std_codel) Name(#EmployeeID)
Define_Com Class(#iiixEmployeeDataServer.finddetails) Name(#GetDetails)
#xEmployee := *null
Clr_List Named(#NotesList)
#GetDetails.ExecuteAsync( #EmployeeID #xEmployee #xEmployeeNotes #IO$STS )
Evtroutine Handling(#GetDetails.Completed)
Selectlist Named(#xEmployeeNotes)
Add_Entry To_List(#NotesList)
Endselect
Endroutine
Endroutine
10. Add code to the EmployeeList.ItemGotSelection event, to invoke GetEmployee, and set up employee details on Label_Details:
Evtroutine Handling(#EmployeeList.ItemGotSelection)
* STD_CODEL contains Employee ID
#com_self.GetEmployee( #std_codel )
#Label_Details := ' Employee: ' + #STD_CODEL + ' ' + #iiiFullName
Endroutine
11. Compile the web page.
12. Test the web page. Perform any search. When the first entry in EmployeeList gets focus, the ItemGotSelection should be triggered, retrieving employee details and list of notes.
Selecting a different employee from the dropdown EmployeeList, should clear and then populate details and the list of notes.