SAP Portal上账号管理,在Portal UME管理中,如果采用的是ABAP系统,那么ABAP系统上创建账号、授予权限后,用户信息、角色信息会自动同步到Portal上,但是如果UME管理里面采用的是独立的用户管理模式,也就是用户在Portal上单独创建,那么修改用户密码、修改用户信息等就没有参考了,最近项目上刚好研究了下,还是可以做到的。
先参考下以下两个文档: SPML
接下来详细解释如何实现:
1. ABAP 系统上定义RFC
登录、安全上设置下Portal的账号和密码,测试下RFC,必须是这样的:
SPML Provider successfully installed and configured (full access)
2. Portal上给RFQ用户增加授权
Portal上新增角色 ZSPML, Action 上把SPML* 相关的权限都加给这个角色,然后把这个角色加给RFC用户
3. 显示用户例子
*&---------------------------------------------------------------------*
*& Report ZTEST002
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTEST002.
DATA: IV_DESTINATION TYPE RFCDEST.
DATA: IV_REQUEST TYPE XSTRING.
DATA:
LV_RLEN TYPE I,
LV_RLEN_STR TYPE STRING,
LV_CONTENT_TYPE_VALUE TYPE STRING VALUE 'text/xml; charset=utf-8', "#EC NOTEXT
LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
LV_RESPONSE TYPE XSTRING,
LO_MSG_RESP TYPE REF TO IF_SPML_MESSAGE,
LV_RESULT TYPE STRING,
LV_ERROR_CODE TYPE STRING, "#EC NEEDED
LT_ERROR_MSGS TYPE TABLE OF STRING,
LV_STR TYPE STRING,
LR_STR TYPE REF TO STRING,
LO_CX TYPE REF TO CX_ROOT
.
DATA: LO_SPML_CLIENT TYPE REF TO CL_SPML_CLIENT,
LO_SPML_SERVICE TYPE REF TO CL_SPML_SERVICE.
DATA:LO_SPML_MESSAGE TYPE REF TO IF_SPML_MESSAGE.
DATA: LV_XREQUEST TYPE XSTRING.
DATA: GS_IDM_INTEG_CUST TYPE SPML_ST_IDM_INTEG_CUST.
DATA: LV_XRESPONSE TYPE XSTRING.
SELECT SINGLE * FROM IDM_INTEG_CUST INTO CORRESPONDING FIELDS OF GS_IDM_INTEG_CUST.
GS_IDM_INTEG_CUST-BGRFC_DEST = 'SPML'.
CREATE OBJECT LO_SPML_CLIENT
EXPORTING
IS_IDM_INTEG_CUST = GS_IDM_INTEG_CUST.
CREATE OBJECT LO_SPML_SERVICE
EXPORTING
IO_SPML_CLIENT = LO_SPML_CLIENT.
* TRY.
CALL METHOD CL_SPML_CLIENT=>CREATE_MESSAGE
EXPORTING
IV_MESSAGE_TYPE = 'SPMLREQ'
* IV_SPML_MESSAGE_STR =
* IV_SPML_MESSAGE_XSTR =
* IO_SPML_MESSAGE_DOM =
RECEIVING
RO_SPML_MESSAGE = LO_SPML_MESSAGE.
.
* CATCH CX_SPML_EXCEPTION .
* ENDTRY.
LO_SPML_MESSAGE->SET_ATTRIBUTE( IV_NAME = 'logonname' IV_VALUE = '' ).
LO_SPML_MESSAGE->SET_IDENTIFIER( IV_IDENTIFIER = 'sapuser' ).
LO_SPML_MESSAGE->SET_PROPERTY( IV_NODE_NAME = 'dsml:present' IV_PROP_NAME = 'logonname' IV_PROP_VALUE = '' ).
LO_SPML_MESSAGE->SET_PROPERTY( IV_NODE_NAME = 'equalityMatch' IV_PROP_NAME = 'logonname' IV_PROP_VALUE = 'DEV02' ).
LV_XREQUEST = LO_SPML_CLIENT->CREATE_SOAP_ENVELOPE( LO_SPML_MESSAGE ).
IV_DESTINATION = 'SPML'.
CL_HTTP_CLIENT=>CREATE_BY_DESTINATION(
EXPORTING
DESTINATION = IV_DESTINATION
IMPORTING
CLIENT = LO_HTTP_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
DESTINATION_NOT_FOUND = 2
DESTINATION_NO_AUTHORITY = 3
PLUGIN_NOT_ACTIVE = 4
INTERNAL_ERROR = 5
OTHERS = 6 ).
* Calculating request length
LV_RLEN = XSTRLEN( LV_XREQUEST ).
MOVE LV_RLEN TO LV_RLEN_STR.
* Filling in the parameters
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = '~request_method' VALUE = 'POST' ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = '~server_protocol' VALUE = 'HTTP/1.1' ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Content-Type'
VALUE = LV_CONTENT_TYPE_VALUE ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Content-Length'
VALUE = LV_RLEN_STR ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'X-Requested-With'
VALUE = 'XMLHttpRequest' ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_DATA( DATA = LV_XREQUEST LENGTH = LV_RLEN ) .
LO_HTTP_CLIENT->SEND(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
HTTP_INVALID_TIMEOUT = 4 ).
IF SY-SUBRC = 4.
RAISE HTTP_INVALID_TIMEOUT.
ELSEIF SY-SUBRC = 0.
ELSE.
RAISE COMMUNICATION_FAILURE.
ENDIF.
LO_HTTP_CLIENT->RECEIVE(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3 ).
IF SY-SUBRC <> 0.
RAISE COMMUNICATION_FAILURE.
ENDIF.
TRY.
LV_RESPONSE = LO_HTTP_CLIENT->RESPONSE->GET_DATA( ).
LO_MSG_RESP = LO_SPML_CLIENT->OPEN_SOAP_ENVELOPE( LV_RESPONSE ).
* Check operation result
CALL METHOD LO_SPML_CLIENT->GET_SPML_STATUS
EXPORTING
IO_SPML_MSG = LO_MSG_RESP
IMPORTING
EV_RESULT = LV_RESULT
EV_ERROR_CODE = LV_ERROR_CODE
ET_ERROR_MSG = LT_ERROR_MSGS.
CASE lv_result.
WHEN 'success'.
* Parse output
"TRY.
lo_msg_resp->set_root_element( ).
WHILE lo_msg_resp->set_next_element( ) NE abap_true.
lv_str = lo_msg_resp->get_attribute( iv_name = 'logonname' ).
* lv_str_id = iv_logon_id.
* TRANSLATE lv_str_id TO UPPER CASE.
* IF lv_str EQ lv_str_id.
* rv_exists = abap_true.
* ENDIF.
ENDWHILE.
* CATCH /sapsrm/cx_spml_message INTO lo_ex.
* lv_str = lo_ex->get_text( ).
* RAISE EXCEPTION TYPE /sapsrm/cx_spml_service
* EXPORTING
* textid = /sapsrm/cx_spml_service=>service_error
* mv_error = lv_str.
* ENDTRY.
when OTHERS.
ENDCASE.
**
*** Remove SOAP envelope and get response message
** lo_msg_resp = cl_spml_client=>open_soap_envelope( lv_response ).
**
*** Check operation result
** cl_spml_client=>get_spml_status(
** EXPORTING
** io_spml_msg = lo_msg_resp
** IMPORTING
** ev_result = lv_result
** ev_error_code = lv_error_code
** et_error_msg = lt_error_msgs ).
**
** CATCH cx_root INTO lo_cx. "#EC CATCH_ALL
*** DATA: conv TYPE REF TO cl_abap_conv_in_ce.
*** IF lv_response IS NOT INITIAL.
*** conv = cl_abap_conv_in_ce=>create( input = lv_response ).
*** conv->read( IMPORTING data = lv_str ).
*** else.
*** lv_str = lo_cx->get_text( ).
*** ENDIF.
** DATA: exc_text LIKE lo_cx->textid.
** exc_text = lo_cx->textid.
**
** IF exc_text = cx_spml_exception=>dom_not_initialized.
** RAISE dom_not_initialized.
** ELSEIF exc_text = cx_spml_exception=>attribute_not_found.
** RAISE attribute_not_found.
** ELSE.
** RAISE others.
** ENDIF.
"RAISE EXCEPTION TYPE cx_spml_exception
" EXPORTING
" textid = cx_spml_exception=>dummy_text
" mv_error = lv_str.
ENDTRY.
DATA: LO_CONV TYPE REF TO CL_ABAP_CONV_IN_CE.
CALL METHOD CL_ABAP_CONV_IN_CE=>CREATE
EXPORTING
INPUT = LV_RESPONSE
ENCODING = 'UTF-8'
REPLACEMENT = '?'
IGNORE_CERR = ABAP_TRUE
RECEIVING
CONV = LO_CONV.
TRY.
CALL METHOD LO_CONV->READ
IMPORTING
DATA = LV_RESULT.
CATCH CX_SY_CONVERSION_CODEPAGE.
CATCH CX_SY_CODEPAGE_CONVERTER_INIT.
CATCH CX_PARAMETER_INVALID_TYPE.
CATCH CX_PARAMETER_INVALID_RANGE.
ENDTRY.
IF NOT LV_RESULT IS INITIAL.
* NOT lv_result = cl_spml_client=>co_result_success.
*
* CASE lv_result.
** On failure - pass error message
* WHEN cl_spml_client=>co_result_failure.
* CLEAR lv_str.
* LOOP AT lt_error_msgs REFERENCE INTO lr_str.
* lv_str = lv_str && lr_str->*.
* ENDLOOP.
*
* "RAISE EXCEPTION TYPE cx_spml_exception
* " EXPORTING
* " textid = cx_spml_exception=>service_error
* " mv_error = lv_str.
* RAISE service_error.
*
* WHEN OTHERS.
* "RAISE EXCEPTION TYPE cx_spml_exception
* " EXPORTING
* " textid = cx_spml_exception=>invalid_status.
* RAISE invalid_status.
* ENDCASE.
ENDIF.
4. 显示用户清单例子
REPORT ZTEST003.
DATA: IV_DESTINATION TYPE RFCDEST.
DATA: IV_REQUEST TYPE XSTRING.
DATA:
LV_RLEN TYPE I,
LV_RLEN_STR TYPE STRING,
LV_CONTENT_TYPE_VALUE TYPE STRING VALUE 'text/xml; charset=utf-8', "#EC NOTEXT
LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
LV_RESPONSE TYPE XSTRING,
LO_MSG_RESP TYPE REF TO IF_SPML_MESSAGE,
LV_RESULT TYPE STRING,
LV_ERROR_CODE TYPE STRING, "#EC NEEDED
LT_ERROR_MSGS TYPE TABLE OF STRING,
LV_STR TYPE STRING,
LR_STR TYPE REF TO STRING,
LO_CX TYPE REF TO CX_ROOT
.
* Only allow the destination from the IdMgmt integration to be used
* SELECT COUNT( * ) FROM idm_integ_cust
* WHERE is_idm_active = 'X' AND
* idm_stag_area = iv_destination.
*
* IF sy-subrc = 4.
* RAISE INVALID_DESTINATION.
* ENDIF.
*
** Check if user has RFC authorizations for this function group
* CALL FUNCTION 'AUTHORITY_CHECK_RFC'
* EXPORTING
* USERID = sy-uname
* FUNCTIONGROUP = 'SPML_CLIENT'
* EXCEPTIONS
* RFC_NO_AUTHORITY = 1.
*
* IF sy-subrc = 1.
* RAISE NO_AUTHORIZATION.
* ENDIF.
DATA: LO_SPML_CLIENT TYPE REF TO CL_SPML_CLIENT,
LO_SPML_SERVICE TYPE REF TO CL_SPML_SERVICE.
DATA:LO_SPML_MESSAGE TYPE REF TO IF_SPML_MESSAGE.
DATA: LV_XREQUEST TYPE XSTRING.
DATA: GS_IDM_INTEG_CUST TYPE SPML_ST_IDM_INTEG_CUST.
DATA: LV_XRESPONSE TYPE XSTRING.
SELECT SINGLE * FROM IDM_INTEG_CUST INTO CORRESPONDING FIELDS OF GS_IDM_INTEG_CUST.
GS_IDM_INTEG_CUST-BGRFC_DEST = 'SPML'.
CREATE OBJECT LO_SPML_CLIENT
EXPORTING
IS_IDM_INTEG_CUST = GS_IDM_INTEG_CUST.
CREATE OBJECT LO_SPML_SERVICE
EXPORTING
IO_SPML_CLIENT = LO_SPML_CLIENT.
* TRY.
CALL METHOD CL_SPML_CLIENT=>CREATE_MESSAGE
EXPORTING
IV_MESSAGE_TYPE = 'SPMLREQ'
* IV_SPML_MESSAGE_STR =
* IV_SPML_MESSAGE_XSTR =
* IO_SPML_MESSAGE_DOM =
RECEIVING
RO_SPML_MESSAGE = LO_SPML_MESSAGE.
.
* CATCH CX_SPML_EXCEPTION .
* ENDTRY.
LO_SPML_MESSAGE->SET_IDENTIFIER( IV_IDENTIFIER = 'sapuser' ).
LO_SPML_MESSAGE->SET_PROPERTY( IV_NODE_NAME = 'dsml:present' IV_PROP_NAME = 'logonname' IV_PROP_VALUE = '' ).
LO_SPML_MESSAGE->SET_ATTRIBUTE( IV_NAME = 'logonname' IV_VALUE = '' ).
LO_SPML_MESSAGE->set_attribute( iv_name = 'islocked' iv_value = '' ).
"LO_SPML_MESSAGE->SET_PROPERTY( IV_NODE_NAME = 'equalityMatch' IV_PROP_NAME = 'logonname' IV_PROP_VALUE = 'DEV02' ).
LV_XREQUEST = LO_SPML_CLIENT->CREATE_SOAP_ENVELOPE( LO_SPML_MESSAGE ).
*
*ENDIF.
*
*
IV_DESTINATION = 'SPML'.
CL_HTTP_CLIENT=>CREATE_BY_DESTINATION(
EXPORTING
DESTINATION = IV_DESTINATION
IMPORTING
CLIENT = LO_HTTP_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
DESTINATION_NOT_FOUND = 2
DESTINATION_NO_AUTHORITY = 3
PLUGIN_NOT_ACTIVE = 4
INTERNAL_ERROR = 5
OTHERS = 6 ).
* Calculating request length
LV_RLEN = XSTRLEN( LV_XREQUEST ).
MOVE LV_RLEN TO LV_RLEN_STR.
* Filling in the parameters
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = '~request_method' VALUE = 'POST' ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = '~server_protocol' VALUE = 'HTTP/1.1' ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Content-Type'
VALUE = LV_CONTENT_TYPE_VALUE ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Content-Length'
VALUE = LV_RLEN_STR ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'X-Requested-With'
VALUE = 'XMLHttpRequest' ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_DATA( DATA = LV_XREQUEST LENGTH = LV_RLEN ) .
LO_HTTP_CLIENT->SEND(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
HTTP_INVALID_TIMEOUT = 4 ).
IF SY-SUBRC = 4.
RAISE HTTP_INVALID_TIMEOUT.
ELSEIF SY-SUBRC = 0.
ELSE.
RAISE COMMUNICATION_FAILURE.
ENDIF.
LO_HTTP_CLIENT->RECEIVE(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3 ).
IF SY-SUBRC <> 0.
RAISE COMMUNICATION_FAILURE.
ENDIF.
TRY.
LV_RESPONSE = LO_HTTP_CLIENT->RESPONSE->GET_DATA( ).
LO_MSG_RESP = LO_SPML_CLIENT->OPEN_SOAP_ENVELOPE( LV_RESPONSE ).
* Check operation result
CALL METHOD LO_SPML_CLIENT->GET_SPML_STATUS
EXPORTING
IO_SPML_MSG = LO_MSG_RESP
IMPORTING
EV_RESULT = LV_RESULT
EV_ERROR_CODE = LV_ERROR_CODE
ET_ERROR_MSG = LT_ERROR_MSGS.
CASE lv_result.
WHEN 'success'.
* Parse output
"TRY.
lo_msg_resp->set_root_element( ).
WHILE lo_msg_resp->set_next_element( ) NE abap_true.
lv_str = lo_msg_resp->get_attribute( iv_name = 'logonname' ).
* lv_str_id = iv_logon_id.
* TRANSLATE lv_str_id TO UPPER CASE.
* IF lv_str EQ lv_str_id.
* rv_exists = abap_true.
* ENDIF.
ENDWHILE.
* CATCH /sapsrm/cx_spml_message INTO lo_ex.
* lv_str = lo_ex->get_text( ).
* RAISE EXCEPTION TYPE /sapsrm/cx_spml_service
* EXPORTING
* textid = /sapsrm/cx_spml_service=>service_error
* mv_error = lv_str.
* ENDTRY.
when OTHERS.
ENDCASE.
"RAISE EXCEPTION TYPE cx_spml_exception
" EXPORTING
" textid = cx_spml_exception=>dummy_text
" mv_error = lv_str.
ENDTRY.
DATA: LO_CONV TYPE REF TO CL_ABAP_CONV_IN_CE.
CALL METHOD CL_ABAP_CONV_IN_CE=>CREATE
EXPORTING
INPUT = LV_RESPONSE
ENCODING = 'UTF-8'
REPLACEMENT = '?'
IGNORE_CERR = ABAP_TRUE
RECEIVING
CONV = LO_CONV.
TRY.
CALL METHOD LO_CONV->READ
IMPORTING
DATA = LV_RESULT.
CATCH CX_SY_CONVERSION_CODEPAGE.
CATCH CX_SY_CODEPAGE_CONVERTER_INIT.
CATCH CX_PARAMETER_INVALID_TYPE.
CATCH CX_PARAMETER_INVALID_RANGE.
ENDTRY.
IF NOT LV_RESULT IS INITIAL.
ENDIF.
5. 创建用户
REPORT ZCHUCKTEST006.
DATA: IV_DESTINATION TYPE RFCDEST.
DATA: IV_REQUEST TYPE XSTRING.
DATA:
LV_RLEN TYPE I,
LV_RLEN_STR TYPE STRING,
LV_CONTENT_TYPE_VALUE TYPE STRING VALUE 'text/xml; charset=utf-8', "#EC NOTEXT
LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
LV_RESPONSE TYPE XSTRING,
LO_MSG_RESP TYPE REF TO IF_SPML_MESSAGE,
LV_RESULT TYPE STRING,
LV_ERROR_CODE TYPE STRING, "#EC NEEDED
LT_ERROR_MSGS TYPE TABLE OF STRING,
LV_STR TYPE STRING,
LR_STR TYPE REF TO STRING,
LO_CX TYPE REF TO CX_ROOT
.
DATA: IV_FIRSTNAME TYPE STRING,
IV_LASTNAME TYPE STRING,
IV_EMAIL TYPE STRING,
IV_PASSWORD TYPE STRING,
IV_VALIDFROM TYPE STRING,
IV_VALIDTO TYPE STRING.
* Only allow the destination from the IdMgmt integration to be used
* SELECT COUNT( * ) FROM idm_integ_cust
* WHERE is_idm_active = 'X' AND
* idm_stag_area = iv_destination.
*
* IF sy-subrc = 4.
* RAISE INVALID_DESTINATION.
* ENDIF.
*
** Check if user has RFC authorizations for this function group
* CALL FUNCTION 'AUTHORITY_CHECK_RFC'
* EXPORTING
* USERID = sy-uname
* FUNCTIONGROUP = 'SPML_CLIENT'
* EXCEPTIONS
* RFC_NO_AUTHORITY = 1.
*
* IF sy-subrc = 1.
* RAISE NO_AUTHORIZATION.
* ENDIF.
DATA: LO_SPML_CLIENT TYPE REF TO CL_SPML_CLIENT,
LO_SPML_SERVICE TYPE REF TO CL_SPML_SERVICE.
DATA:LO_MSG_REQ TYPE REF TO IF_SPML_MESSAGE.
DATA: LV_XREQUEST TYPE XSTRING.
DATA: GS_IDM_INTEG_CUST TYPE SPML_ST_IDM_INTEG_CUST.
DATA: LV_XRESPONSE TYPE XSTRING.
SELECT SINGLE * FROM IDM_INTEG_CUST INTO CORRESPONDING FIELDS OF GS_IDM_INTEG_CUST.
GS_IDM_INTEG_CUST-BGRFC_DEST = 'SPML'.
CREATE OBJECT LO_SPML_CLIENT
EXPORTING
IS_IDM_INTEG_CUST = GS_IDM_INTEG_CUST.
CREATE OBJECT LO_SPML_SERVICE
EXPORTING
IO_SPML_CLIENT = LO_SPML_CLIENT.
* TRY.
CALL METHOD CL_SPML_CLIENT=>CREATE_MESSAGE
EXPORTING
IV_MESSAGE_TYPE = 'SPMLADD'
* IV_SPML_MESSAGE_STR =
* IV_SPML_MESSAGE_XSTR =
* IO_SPML_MESSAGE_DOM =
RECEIVING
RO_SPML_MESSAGE = LO_MSG_REQ.
.
* CATCH CX_SPML_EXCEPTION .
* ENDTRY.
* Pass Object Class
LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'objectclass' IV_VALUE = 'sapuser' ).
* Pass Logon ID
LV_STR = 'TEST00B'.
LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'logonname' IV_VALUE = LV_STR ).
* Pass First Name
IV_FIRSTNAME = 'Chuck'.
LV_STR = IV_FIRSTNAME.
LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'firstname' IV_VALUE = LV_STR ).
* Pass Last Nam
IV_LASTNAME = 'Chen'.
LV_STR = IV_LASTNAME.
LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'lastname' IV_VALUE = LV_STR ).
* Pass E-Mail
IV_EMAIL = 'test@qq.com'.
LV_STR = IV_EMAIL.
LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'email' IV_VALUE = LV_STR ).
* Pass Password
IV_PASSWORD = 'Abcd12345'.
LV_STR = IV_PASSWORD.
LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'password' IV_VALUE = LV_STR ).
** Pass "Valid from" date
* IV_VALIDFROM = '20230101'.
* LV_STR = IV_VALIDFROM.
* CONCATENATE '000000Z' INTO LV_STR.
* LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'validfrom' IV_VALUE = LV_STR ).
*
** Pass "Valid to" date
* IV_VALIDTO = '20231231'.
* LV_STR = IV_VALIDTO.
* CONCATENATE '000000Z' INTO LV_STR.
* LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'validto' IV_VALUE = LV_STR ).
LV_XREQUEST = LO_SPML_CLIENT->CREATE_SOAP_ENVELOPE( LO_MSG_REQ ).
** Sending creation request
*CALL METHOD LO_SPML_CLIENT->SEND_SPML_REQUEST
* EXPORTING
* IV_REQUEST = LV_XREQUEST
* IMPORTING
* EV_RESPONSE = LV_XRESPONSE.
*
*
*LO_MSG_RESP = LO_SPML_CLIENT->OPEN_SOAP_ENVELOPE( LV_XRESPONSE ).
*
** Check operation result
*CALL METHOD LO_SPML_CLIENT->GET_SPML_STATUS
* EXPORTING
* IO_SPML_MSG = LO_MSG_RESP
* IMPORTING
* EV_RESULT = LV_RESULT
* EV_ERROR_CODE = LV_ERROR_CODE
* ET_ERROR_MSG = LT_ERROR_MSGS.
*
*IF NOT LV_RESULT IS INITIAL.
*
*ENDIF.
*
*
IV_DESTINATION = 'SPML'.
CL_HTTP_CLIENT=>CREATE_BY_DESTINATION(
EXPORTING
DESTINATION = IV_DESTINATION
IMPORTING
CLIENT = LO_HTTP_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
DESTINATION_NOT_FOUND = 2
DESTINATION_NO_AUTHORITY = 3
PLUGIN_NOT_ACTIVE = 4
INTERNAL_ERROR = 5
OTHERS = 6 ).
* Calculating request length
LV_RLEN = XSTRLEN( LV_XREQUEST ).
MOVE LV_RLEN TO LV_RLEN_STR.
* Filling in the parameters
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = '~request_method' VALUE = 'POST' ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = '~server_protocol' VALUE = 'HTTP/1.1' ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Content-Type'
VALUE = LV_CONTENT_TYPE_VALUE ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Content-Length'
VALUE = LV_RLEN_STR ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'X-Requested-With'
VALUE = 'XMLHttpRequest' ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_DATA( DATA = LV_XREQUEST LENGTH = LV_RLEN ) .
LO_HTTP_CLIENT->SEND(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
HTTP_INVALID_TIMEOUT = 4 ).
IF SY-SUBRC = 4.
RAISE HTTP_INVALID_TIMEOUT.
ELSEIF SY-SUBRC = 0.
ELSE.
RAISE COMMUNICATION_FAILURE.
ENDIF.
LO_HTTP_CLIENT->RECEIVE(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3 ).
IF SY-SUBRC <> 0.
RAISE COMMUNICATION_FAILURE.
ENDIF.
TRY.
LV_RESPONSE = LO_HTTP_CLIENT->RESPONSE->GET_DATA( ).
LO_MSG_RESP = LO_SPML_CLIENT->OPEN_SOAP_ENVELOPE( LV_RESPONSE ).
* Check operation result
CALL METHOD LO_SPML_CLIENT->GET_SPML_STATUS
EXPORTING
IO_SPML_MSG = LO_MSG_RESP
IMPORTING
EV_RESULT = LV_RESULT
EV_ERROR_CODE = LV_ERROR_CODE
ET_ERROR_MSG = LT_ERROR_MSGS.
CASE LV_RESULT.
WHEN 'success'.
* Parse output
"TRY.
LO_MSG_RESP->SET_ROOT_ELEMENT( ).
WHILE LO_MSG_RESP->SET_NEXT_ELEMENT( ) NE ABAP_TRUE.
LV_STR = LO_MSG_RESP->GET_ATTRIBUTE( IV_NAME = 'logonname' ).
* lv_str_id = iv_logon_id.
* TRANSLATE lv_str_id TO UPPER CASE.
* IF lv_str EQ lv_str_id.
* rv_exists = abap_true.
* ENDIF.
ENDWHILE.
* CATCH /sapsrm/cx_spml_message INTO lo_ex.
* lv_str = lo_ex->get_text( ).
* RAISE EXCEPTION TYPE /sapsrm/cx_spml_service
* EXPORTING
* textid = /sapsrm/cx_spml_service=>service_error
* mv_error = lv_str.
* ENDTRY.
WHEN OTHERS.
ENDCASE.
**
*** Remove SOAP envelope and get response message
** lo_msg_resp = cl_spml_client=>open_soap_envelope( lv_response ).
**
*** Check operation result
** cl_spml_client=>get_spml_status(
** EXPORTING
** io_spml_msg = lo_msg_resp
** IMPORTING
** ev_result = lv_result
** ev_error_code = lv_error_code
** et_error_msg = lt_error_msgs ).
**
** CATCH cx_root INTO lo_cx. "#EC CATCH_ALL
*** DATA: conv TYPE REF TO cl_abap_conv_in_ce.
*** IF lv_response IS NOT INITIAL.
*** conv = cl_abap_conv_in_ce=>create( input = lv_response ).
*** conv->read( IMPORTING data = lv_str ).
*** else.
*** lv_str = lo_cx->get_text( ).
*** ENDIF.
** DATA: exc_text LIKE lo_cx->textid.
** exc_text = lo_cx->textid.
**
** IF exc_text = cx_spml_exception=>dom_not_initialized.
** RAISE dom_not_initialized.
** ELSEIF exc_text = cx_spml_exception=>attribute_not_found.
** RAISE attribute_not_found.
** ELSE.
** RAISE others.
** ENDIF.
"RAISE EXCEPTION TYPE cx_spml_exception
" EXPORTING
" textid = cx_spml_exception=>dummy_text
" mv_error = lv_str.
ENDTRY.
DATA: LO_CONV TYPE REF TO CL_ABAP_CONV_IN_CE.
CALL METHOD CL_ABAP_CONV_IN_CE=>CREATE
EXPORTING
INPUT = LV_RESPONSE
ENCODING = 'UTF-8'
REPLACEMENT = '?'
IGNORE_CERR = ABAP_TRUE
RECEIVING
CONV = LO_CONV.
TRY.
CALL METHOD LO_CONV->READ
IMPORTING
DATA = LV_RESULT.
CATCH CX_SY_CONVERSION_CODEPAGE.
CATCH CX_SY_CODEPAGE_CONVERTER_INIT.
CATCH CX_PARAMETER_INVALID_TYPE.
CATCH CX_PARAMETER_INVALID_RANGE.
ENDTRY.
IF NOT LV_RESULT IS INITIAL.
* NOT lv_result = cl_spml_client=>co_result_success.
*
* CASE lv_result.
** On failure - pass error message
* WHEN cl_spml_client=>co_result_failure.
* CLEAR lv_str.
* LOOP AT lt_error_msgs REFERENCE INTO lr_str.
* lv_str = lv_str && lr_str->*.
* ENDLOOP.
*
* "RAISE EXCEPTION TYPE cx_spml_exception
* " EXPORTING
* " textid = cx_spml_exception=>service_error
* " mv_error = lv_str.
* RAISE service_error.
*
* WHEN OTHERS.
* "RAISE EXCEPTION TYPE cx_spml_exception
* " EXPORTING
* " textid = cx_spml_exception=>invalid_status.
* RAISE invalid_status.
* ENDCASE.
ENDIF.
6. 修改用户密码
REPORT ZCHUCKTEST007.
DATA: IV_DESTINATION TYPE RFCDEST.
DATA: IV_REQUEST TYPE XSTRING.
DATA:
LV_RLEN TYPE I,
LV_RLEN_STR TYPE STRING,
LV_CONTENT_TYPE_VALUE TYPE STRING VALUE 'text/xml; charset=utf-8', "#EC NOTEXT
LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
LV_RESPONSE TYPE XSTRING,
LO_MSG_RESP TYPE REF TO IF_SPML_MESSAGE,
LV_RESULT TYPE STRING,
LV_ERROR_CODE TYPE STRING, "#EC NEEDED
LT_ERROR_MSGS TYPE TABLE OF STRING,
LV_STR TYPE STRING,
LR_STR TYPE REF TO STRING,
LO_CX TYPE REF TO CX_ROOT
.
DATA: IV_FIRSTNAME TYPE STRING,
IV_LASTNAME TYPE STRING,
IV_EMAIL TYPE STRING,
IV_PASSWORD TYPE STRING,
IV_VALIDFROM TYPE STRING,
IV_VALIDTO TYPE STRING.
* Only allow the destination from the IdMgmt integration to be used
* SELECT COUNT( * ) FROM idm_integ_cust
* WHERE is_idm_active = 'X' AND
* idm_stag_area = iv_destination.
*
* IF sy-subrc = 4.
* RAISE INVALID_DESTINATION.
* ENDIF.
*
** Check if user has RFC authorizations for this function group
* CALL FUNCTION 'AUTHORITY_CHECK_RFC'
* EXPORTING
* USERID = sy-uname
* FUNCTIONGROUP = 'SPML_CLIENT'
* EXCEPTIONS
* RFC_NO_AUTHORITY = 1.
*
* IF sy-subrc = 1.
* RAISE NO_AUTHORIZATION.
* ENDIF.
DATA: LO_SPML_CLIENT TYPE REF TO CL_SPML_CLIENT,
LO_SPML_SERVICE TYPE REF TO CL_SPML_SERVICE.
DATA:LO_MSG_REQ TYPE REF TO IF_SPML_MESSAGE.
DATA: LV_XREQUEST TYPE XSTRING.
DATA: GS_IDM_INTEG_CUST TYPE SPML_ST_IDM_INTEG_CUST.
DATA: LV_XRESPONSE TYPE XSTRING.
SELECT SINGLE * FROM IDM_INTEG_CUST INTO CORRESPONDING FIELDS OF GS_IDM_INTEG_CUST.
GS_IDM_INTEG_CUST-BGRFC_DEST = 'SPML'.
CREATE OBJECT LO_SPML_CLIENT
EXPORTING
IS_IDM_INTEG_CUST = GS_IDM_INTEG_CUST.
CREATE OBJECT LO_SPML_SERVICE
EXPORTING
IO_SPML_CLIENT = LO_SPML_CLIENT.
CREATE OBJECT LO_MSG_REQ
TYPE
zcl_spml_mod_request.
*** TRY.
**CALL METHOD CL_SPML_CLIENT=>CREATE_MESSAGE.
** EXPORTING
** IV_MESSAGE_TYPE = 'SPMLMOD'
*** IV_SPML_MESSAGE_STR =
*** IV_SPML_MESSAGE_XSTR =
*** IO_SPML_MESSAGE_DOM =
** RECEIVING
** RO_SPML_MESSAGE = LO_MSG_REQ.
**.
*** CATCH CX_SPML_EXCEPTION .
*** ENDTRY.
lv_str = 'USER.PRIVATE_DATASOURCE.un:TEST00B'.
*lv_str = 'TEST00B'.
lo_msg_req->set_identifier( iv_identifier = lv_str ).
*** Pass First Name
IV_FIRSTNAME = 'Chuck002X'.
LV_STR = IV_FIRSTNAME.
LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'firstname' IV_VALUE = LV_STR ).
lv_str = 'D1234567'.
lo_msg_req->set_attribute( iv_name = 'password' iv_value = lv_str ).
** Pass Last Nam
*IV_LASTNAME = 'Chen'.
*LV_STR = IV_LASTNAME.
*LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'lastname' IV_VALUE = LV_STR ).
** Pass "Valid from" date
* IV_VALIDFROM = '20230101'.
* LV_STR = IV_VALIDFROM.
* CONCATENATE '000000Z' INTO LV_STR.
* LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'validfrom' IV_VALUE = LV_STR ).
*
** Pass "Valid to" date
* IV_VALIDTO = '20231231'.
* LV_STR = IV_VALIDTO.
* CONCATENATE '000000Z' INTO LV_STR.
* LO_MSG_REQ->SET_ATTRIBUTE( IV_NAME = 'validto' IV_VALUE = LV_STR ).
LV_XREQUEST = LO_SPML_CLIENT->CREATE_SOAP_ENVELOPE( LO_MSG_REQ ).
** Sending creation request
*CALL METHOD LO_SPML_CLIENT->SEND_SPML_REQUEST
* EXPORTING
* IV_REQUEST = LV_XREQUEST
* IMPORTING
* EV_RESPONSE = LV_XRESPONSE.
*
*
*LO_MSG_RESP = LO_SPML_CLIENT->OPEN_SOAP_ENVELOPE( LV_XRESPONSE ).
*
** Check operation result
*CALL METHOD LO_SPML_CLIENT->GET_SPML_STATUS
* EXPORTING
* IO_SPML_MSG = LO_MSG_RESP
* IMPORTING
* EV_RESULT = LV_RESULT
* EV_ERROR_CODE = LV_ERROR_CODE
* ET_ERROR_MSG = LT_ERROR_MSGS.
*
*IF NOT LV_RESULT IS INITIAL.
*
*ENDIF.
*
*
IV_DESTINATION = 'SPML'.
CL_HTTP_CLIENT=>CREATE_BY_DESTINATION(
EXPORTING
DESTINATION = IV_DESTINATION
IMPORTING
CLIENT = LO_HTTP_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
DESTINATION_NOT_FOUND = 2
DESTINATION_NO_AUTHORITY = 3
PLUGIN_NOT_ACTIVE = 4
INTERNAL_ERROR = 5
OTHERS = 6 ).
* Calculating request length
LV_RLEN = XSTRLEN( LV_XREQUEST ).
MOVE LV_RLEN TO LV_RLEN_STR.
* Filling in the parameters
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = '~request_method' VALUE = 'POST' ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = '~server_protocol' VALUE = 'HTTP/1.1' ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Content-Type'
VALUE = LV_CONTENT_TYPE_VALUE ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Content-Length'
VALUE = LV_RLEN_STR ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'X-Requested-With'
VALUE = 'XMLHttpRequest' ). "#EC NOTEXT
LO_HTTP_CLIENT->REQUEST->SET_DATA( DATA = LV_XREQUEST LENGTH = LV_RLEN ) .
LO_HTTP_CLIENT->SEND(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
HTTP_INVALID_TIMEOUT = 4 ).
IF SY-SUBRC = 4.
RAISE HTTP_INVALID_TIMEOUT.
ELSEIF SY-SUBRC = 0.
ELSE.
RAISE COMMUNICATION_FAILURE.
ENDIF.
LO_HTTP_CLIENT->RECEIVE(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3 ).
IF SY-SUBRC <> 0.
RAISE COMMUNICATION_FAILURE.
ENDIF.
TRY.
LV_RESPONSE = LO_HTTP_CLIENT->RESPONSE->GET_DATA( ).
LO_MSG_RESP = LO_SPML_CLIENT->OPEN_SOAP_ENVELOPE( LV_RESPONSE ).
* Check operation result
CALL METHOD LO_SPML_CLIENT->GET_SPML_STATUS
EXPORTING
IO_SPML_MSG = LO_MSG_RESP
IMPORTING
EV_RESULT = LV_RESULT
EV_ERROR_CODE = LV_ERROR_CODE
ET_ERROR_MSG = LT_ERROR_MSGS.
CASE LV_RESULT.
WHEN 'success'.
* Parse output
"TRY.
LO_MSG_RESP->SET_ROOT_ELEMENT( ).
WHILE LO_MSG_RESP->SET_NEXT_ELEMENT( ) NE ABAP_TRUE.
LV_STR = LO_MSG_RESP->GET_ATTRIBUTE( IV_NAME = 'logonname' ).
* lv_str_id = iv_logon_id.
* TRANSLATE lv_str_id TO UPPER CASE.
* IF lv_str EQ lv_str_id.
* rv_exists = abap_true.
* ENDIF.
ENDWHILE.
* CATCH /sapsrm/cx_spml_message INTO lo_ex.
* lv_str = lo_ex->get_text( ).
* RAISE EXCEPTION TYPE /sapsrm/cx_spml_service
* EXPORTING
* textid = /sapsrm/cx_spml_service=>service_error
* mv_error = lv_str.
* ENDTRY.
WHEN OTHERS.
ENDCASE.
**
*** Remove SOAP envelope and get response message
** lo_msg_resp = cl_spml_client=>open_soap_envelope( lv_response ).
**
*** Check operation result
** cl_spml_client=>get_spml_status(
** EXPORTING
** io_spml_msg = lo_msg_resp
** IMPORTING
** ev_result = lv_result
** ev_error_code = lv_error_code
** et_error_msg = lt_error_msgs ).
**
** CATCH cx_root INTO lo_cx. "#EC CATCH_ALL
*** DATA: conv TYPE REF TO cl_abap_conv_in_ce.
*** IF lv_response IS NOT INITIAL.
*** conv = cl_abap_conv_in_ce=>create( input = lv_response ).
*** conv->read( IMPORTING data = lv_str ).
*** else.
*** lv_str = lo_cx->get_text( ).
*** ENDIF.
** DATA: exc_text LIKE lo_cx->textid.
** exc_text = lo_cx->textid.
**
** IF exc_text = cx_spml_exception=>dom_not_initialized.
** RAISE dom_not_initialized.
** ELSEIF exc_text = cx_spml_exception=>attribute_not_found.
** RAISE attribute_not_found.
** ELSE.
** RAISE others.
** ENDIF.
"RAISE EXCEPTION TYPE cx_spml_exception
" EXPORTING
" textid = cx_spml_exception=>dummy_text
" mv_error = lv_str.
ENDTRY.
DATA: LO_CONV TYPE REF TO CL_ABAP_CONV_IN_CE.
CALL METHOD CL_ABAP_CONV_IN_CE=>CREATE
EXPORTING
INPUT = LV_RESPONSE
ENCODING = 'UTF-8'
REPLACEMENT = '?'
IGNORE_CERR = ABAP_TRUE
RECEIVING
CONV = LO_CONV.
TRY.
CALL METHOD LO_CONV->READ
IMPORTING
DATA = LV_RESULT.
CATCH CX_SY_CONVERSION_CODEPAGE.
CATCH CX_SY_CODEPAGE_CONVERTER_INIT.
CATCH CX_PARAMETER_INVALID_TYPE.
CATCH CX_PARAMETER_INVALID_RANGE.
ENDTRY.
IF NOT LV_RESULT IS INITIAL.
* NOT lv_result = cl_spml_client=>co_result_success.
*
* CASE lv_result.
** On failure - pass error message
* WHEN cl_spml_client=>co_result_failure.
* CLEAR lv_str.
* LOOP AT lt_error_msgs REFERENCE INTO lr_str.
* lv_str = lv_str && lr_str->*.
* ENDLOOP.
*
* "RAISE EXCEPTION TYPE cx_spml_exception
* " EXPORTING
* " textid = cx_spml_exception=>service_error
* " mv_error = lv_str.
* RAISE service_error.
*
* WHEN OTHERS.
* "RAISE EXCEPTION TYPE cx_spml_exception
* " EXPORTING
* " textid = cx_spml_exception=>invalid_status.
* RAISE invalid_status.
* ENDCASE.
ENDIF.
- 类ZCL_SPML_MOD_REQUEST
Copy CL_SPML_MOD_REQUEST
修改方法: CONSTRUCTOR 和 IF_SPML_MESSAGE~SET_ATTRIBUTE(从老SRM copy )
METHOD CONSTRUCTOR.
DATA:
lr_ixml TYPE REF TO if_ixml,
lo_ixml_request TYPE REF TO if_ixml_element,
lo_ixml_identifier TYPE REF TO if_ixml_element,
lo_ixml_id TYPE REF TO if_ixml_element,
lo_ixml_modifications TYPE REF TO if_ixml_element,
lv_guid_22 TYPE guid_22,
lv_guid TYPE string.
CALL METHOD super->constructor.
lr_ixml = cl_ixml=>create( ).
me->mo_message_dom = lr_ixml->create_document( ).
* Create header XML nodes for the Creating user request
* Request node
lo_ixml_request = mo_message_dom->create_element( 'modifyRequest' ).
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_22 = lv_guid_22.
lv_guid = lv_guid_22.
CONCATENATE 'mod-' lv_guid INTO lv_guid.
lo_ixml_request->set_attribute( name = 'requestID'
value = lv_guid ).
* Identifier node
lo_ixml_identifier = mo_message_dom->create_element( name = 'identifier' ).
* Set type attribute
lo_ixml_identifier->set_attribute( name = 'type' value = 'GenericString' ).
* ID node
lo_ixml_id = mo_message_dom->create_element( name = 'id' ).
* Modifications node
lo_ixml_modifications = mo_message_dom->create_element( name = 'modifications' ).
* Append Identifier node into request node
lo_ixml_request->append_child( new_child = lo_ixml_identifier ).
* Append Id node into Identifier node
lo_ixml_identifier->append_child( new_child = lo_ixml_id ).
* Append modifications node into request node
lo_ixml_request->append_child( new_child = lo_ixml_modifications ).
* Append request node into document
me->mo_message_dom->append_child( new_child = lo_ixml_request ).
ENDMETHOD.
METHOD IF_SPML_MESSAGE~SET_ATTRIBUTE.
DATA:
LO_NODE_FILTER TYPE REF TO IF_IXML_NODE_FILTER,
LO_NODE_ITERATOR TYPE REF TO IF_IXML_NODE_ITERATOR,
LO_MODIFICATIONS_NODE TYPE REF TO IF_IXML_NODE,
LO_IXML_NODE TYPE REF TO IF_IXML_NODE,
LO_IXML_NODE_LIST TYPE REF TO IF_IXML_NODE_LIST,
LO_IXML_NODE_MODIF TYPE REF TO IF_IXML_NODE,
LO_IXML_MODIF TYPE REF TO IF_IXML_ELEMENT,
LO_IXML_VALUE TYPE REF TO IF_IXML_ELEMENT,
LO_IXML_NODE_MAP TYPE REF TO IF_IXML_NAMED_NODE_MAP.
* Check DOM
IF MO_MESSAGE_DOM IS NOT BOUND.
RAISE EXCEPTION TYPE CX_SPML_EXCEPTION
EXPORTING
TEXTID = CX_SPML_EXCEPTION=>DOM_NOT_INITIALIZED.
ENDIF.
* Find 'modifications' node of the document.
LO_NODE_FILTER = ME->MO_MESSAGE_DOM->CREATE_FILTER_NAME( NAME = 'modifications' ).
LO_NODE_ITERATOR = ME->MO_MESSAGE_DOM->CREATE_ITERATOR_FILTERED( FILTER = LO_NODE_FILTER ).
LO_MODIFICATIONS_NODE = LO_NODE_ITERATOR->GET_NEXT( ).
IF LO_MODIFICATIONS_NODE IS NOT BOUND.
RAISE EXCEPTION TYPE cx_spml_exception
EXPORTING
textid = cx_spml_exception=>attribute_not_found.
ENDIF.
* Check if modification node already exists. If not - create it
LO_NODE_FILTER = LO_MODIFICATIONS_NODE->CREATE_FILTER_NAME( NAME = 'modification' ).
LO_NODE_ITERATOR = LO_MODIFICATIONS_NODE->CREATE_ITERATOR_FILTERED( FILTER = LO_NODE_FILTER ).
LO_IXML_NODE = LO_NODE_ITERATOR->GET_NEXT( ).
WHILE LO_IXML_NODE IS BOUND.
LO_IXML_NODE_MAP = LO_IXML_NODE->GET_ATTRIBUTES( ).
LO_IXML_NODE_MODIF = LO_IXML_NODE_MAP->GET_NAMED_ITEM( NAME = 'name' ).
IF LO_IXML_NODE_MODIF->GET_VALUE( ) EQ IV_NAME.
* Attribute node exists - modify
LO_IXML_NODE_LIST = LO_IXML_NODE->GET_CHILDREN( ).
LO_IXML_NODE = LO_IXML_NODE_LIST->GET_ITEM( INDEX = 0 ).
IF NOT LO_IXML_NODE->GET_NAME( ) EQ 'value'.
RAISE EXCEPTION TYPE cx_spml_exception
EXPORTING
textid = cx_spml_exception=>attribute_not_found.
ENDIF.
LO_IXML_NODE->SET_VALUE( VALUE = IV_VALUE ).
RETURN.
ENDIF.
LO_IXML_NODE = LO_NODE_ITERATOR->GET_NEXT( ).
ENDWHILE.
IF NOT LO_IXML_NODE IS BOUND.
* Create new xml node for the imported attribute
LO_IXML_MODIF = MO_MESSAGE_DOM->CREATE_ELEMENT( NAME = 'modification' ).
LO_IXML_MODIF->SET_ATTRIBUTE( NAME = 'name' VALUE = IV_NAME ).
* Create value xml node
LO_IXML_VALUE = MO_MESSAGE_DOM->CREATE_ELEMENT( NAME = 'value' ).
LO_IXML_VALUE->IF_IXML_NODE~SET_VALUE( VALUE = IV_VALUE ).
LO_IXML_MODIF->APPEND_CHILD( NEW_CHILD = LO_IXML_VALUE ).
* Append attribute node into document
LO_MODIFICATIONS_NODE->APPEND_CHILD( NEW_CHILD = LO_IXML_MODIF ).
ENDIF.
ENDMETHOD.