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.