INT003 - Using the LANSA User Agent
In this step, you will write the LANSA RDMLX server function that will receive the data from the User Agent, process it, and return data to the User Agent.
1. Using the Visual LANSA development environment, sign on to the partition nominated for the exercises.
2. Create a new LANSA process named iiiPRO03 User Agent Server Test Process, where iii is your unique 3 characters. (If the process already exists, select a different set of characters for iii.)
3. Create a new RDMLX enabled function named iiiFN03 Receive and Process Salary Amendments, belonging to process iiiPRO03, where iii is your unique 3 characters. Note that the RDMLX checkbox must be checked.
4. From the list of templates, select the template called JSMXSKEL and click on the Create button.
5. Answer the template questions as shown in the table below.
|
6. Edit the RDMLX code of function iiiFN03.
This function will require two working lists:
The RDMLX code might appear as follows:
DEF_LIST NAME(#S_RECEIVE) FIELDS(#EMPNO #SALARY) TYPE(*WORKING)
DEFINE FIELD(#S_ERROR) TYPE(*CHAR) LENGTH(132) INPUT_ATR(LC)
DEF_LIST NAME(#S_SEND) FIELDS(#EMPNO #GIVENAME #SURNAME #SALARY #S_ERROR)TYPE(*WORKING)
7. Modify the SERVICE_LOAD command. Add code which uses the KEYWRD subroutine to add the following keywords to the SERVICE_LOAD command
|
The SERVICE_CONTENT(*HTTP) is required to receive HTTP posted content .
The TRACE(*YES) may be useful for testing purposes. You should remove trace before deploying to a production system.
Your completed code should look like the following. Changes are shown in red.
* BUILD THE SERVICE LOAD COMMAND
#JSMXCMD := 'SERVICE_LOAD'
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'SERVICE' 'HTTPSERVICE')
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'SERVICE_CONTENT' '*HTTP')
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'TRACE' '*YES')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG)
EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)
8. Locate the comment around the middle of the RDMLX source that says YOUR OWN LOGIC HERE.
In the Design group on the Home ribbon, click on the Templates button and use the BBJSMXCMD template to write the RDMLX code to RECEIVE the list of employee numbers and their new salaries from the CSV file. When prompted to type in the name of the Service List, type S_RECEIVE. Use this table to answer the template questions.
|
Enclose *USE in single quotes, as shown.
For more detailed information on using the BBJSMXCMD template, refer to INT002 – Using the FTP Service, Step 1. Build the basic JSM Functions.
The RDMLX code might appear as follows:
* BUILD THE JSM COMMAND
#JSMXCMD := RECEIVE
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD HANDLER InboundSeparatedValue)
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD SVMODE '*USE')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG #S_RECEIVE)
EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXCMD)
9. Continue the YOUR OWN LOGIC SECTION by writing the code to achieve the following functions:
SELECTLIST all the entries from the received list S_RECEIVE.
FETCH GIVENAME and SURNAME from PSLMST with key EMPNO.
Check the I/O status.
If not okay, CHANGE the error field S_ERROR to say that the employee was not found.
Else UPDATE SALARY in PSLMST.
Check the I/O status of the UPDATE, and CHANGE the error field S_ERROR accordingly.
Add an entry to the working list S_SEND to be returned the LANSA User Agent.
ENDSELECT
The code might appear as follows:
SELECTLIST NAMED(#S_RECEIVE)
CHANGE FIELD(#GIVENAME #SURNAME) TO(*NULL)
FETCH FIELDS(#SURNAME #GIVENAME) FROM_FILE(PSLMST) WITH_KEY(#EMPNO)
IF_STATUS IS_NOT(*OKAY)
#S_ERROR := 'Unsuccesful: Employee not found'
ELSE
UPDATE FIELDS(#SALARY) IN_FILE(PSLMST) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)
IF_STATUS IS_NOT(*OKAY)
#S_ERROR := 'Unsuccesful: Employee found but update failed'
ELSE
#S_ERROR := 'Succesful: Salary of employee ' + #EMPNO + 'succesfully updated'
ENDIF
ENDIF
ADD_ENTRY TO_LIST(#S_SEND)
ENDSELECT
10.Position below the above code, use the BBJSMXCMD template to write the code to SEND the response list back to the User Agent. The list will contain employee details and a success/failure message. When prompted to type in the name of the Service List, enter S_SEND. Use this table to answer the template questions.
|
The code might appear as follows:
* BUILD THE JSM COMMAND
#JSMXCMD := SEND
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD HANDLER InboundSeparatedValue)
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG #S_SEND)
EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)
11.Delete the SERVICE_UNLOAD command.
Make sure that you leave the JSMX_CLOSE command in place.
Your finished code might appear as follows:
FUNCTION OPTIONS(*DIRECT)
DEF_LIST NAME(#S_RECEIVE) FIELDS(#EMPNO #SALARY) TYPE(*WORKING)
DEFINE FIELD(#S_ERROR) TYPE(*CHAR) LENGTH(132) INPUT_ATR(LC)
DEF_LIST NAME(#S_SEND) FIELDS(#EMPNO #GIVENAME #SURNAME #SALARY #S_ERROR) TYPE(*WORKING)
*
* OPEN JSM AND VERIFY STATUS
USE BUILTIN(JSMX_OPEN) TO_GET(#JSMSTS #JSMMSG #JSMXHDLE1)
EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)
*
* BUILD THE SERVICE LOAD COMMAND
#JSMXCMD := 'SERVICE_LOAD'
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'SERVICE' 'HTTPSERVICE')
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'SERVICE_CONTENT' '*HTTP')
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'TRACE' '*YES')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG)
EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)
*
* YOUR OWN LOGIC HERE
* BUILD THE JSM COMMAND
#JSMXCMD := RECEIVE
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD HANDLER InboundSeparatedValue)
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD SVMODE '*USE')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG #S_RECEIVE)
EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXCMD)
*
SELECTLIST NAMED(#S_RECEIVE)
CHANGE FIELD(#GIVENAME #SURNAME) TO(*NULL)
FETCH FIELDS(#SURNAME #GIVENAME) FROM_FILE(PSLMST) WITH_KEY(#EMPNO)
IF_STATUS IS_NOT(*OKAY)
#S_ERROR := 'Unsuccesful: Employee not found'
ELSE
UPDATE FIELDS(#SALARY) IN_FILE(PSLMST) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)
IF_STATUS IS_NOT(*OKAY)
#S_ERROR := 'Unsuccesful: Employee found but update failed'
ELSE
#S_ERROR := 'Succesful: Salary of employee ' + #EMPNO + 'succesfully updated'
ENDIF
ENDIF
ADD_ENTRY TO_LIST(#S_SEND)
ENDSELECT
*
* BUILD THE JSM COMMAND
#JSMXCMD := SEND
EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD HANDLER InboundSeparatedValue)
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG #S_SEND)
EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)
*
* CLOSE JSM AND VERIFY STATUS
USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMSTS #JSMMSG)
EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)
RETURN
*
* Subroutine to build JSM commands. existing JSM command
*
SUBROUTINE NAME(KEYWRD) PARMS((#W_CMDX *BOTH) (#W_KEYWRD *RECEIVED) (#W_KEYVAL *RECEIVED))
DEFINE FIELD(#W_CMDX) REFFLD(#JSMXCMD)
DEFINE FIELD(#W_KEYWRD) REFFLD(#STD_TEXT)
DEFINE FIELD(#W_KEYVAL) REFFLD(#STD_TEXTL)
#W_CMDX += ' ' + #W_KEYWRD + '(' + #W_KEYVAL + ')'
ENDROUTINE
*
* Check the status of the JSM command issued
*
SUBROUTINE NAME(CHECK_STS) PARMS(#W_HDLE)
DEFINE FIELD(#MSGDTA) TYPE(*CHAR) LENGTH(132)
DEFINE FIELD(#W_HDLE) TYPE(*CHAR) LENGTH(4)
*
IF COND('#JSMSTS *NE OK')
*
#MSGDTA := 'Error Status Code: ' + #JSMSTS
MESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
#MSGDTA := 'Error Message: ' + #JSMMSG
MESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
ENDIF
*
ENDROUTINE
12.Compile function iiiFN03.
13.If you are using a JSM Server on an IBM i server, check in and compile your process and function on the IBM i.