9.如何用SPML修改SAP Portal上的账号信息

SAP Portal上账号管理,在Portal UME管理中,如果采用的是ABAP系统,那么ABAP系统上创建账号、授予权限后,用户信息、角色信息会自动同步到Portal上,但是如果UME管理里面采用的是独立的用户管理模式,也就是用户在Portal上单独创建,那么修改用户密码、修改用户信息等就没有参考了,最近项目上刚好研究了下,还是可以做到的。

先参考下以下两个文档: SPML

SAP Help Portal

SAP Help Portal

接下来详细解释如何实现:

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.

DATAIV_DESTINATION TYPE  RFCDEST.
DATAIV_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
   
.

DATALO_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.
DATALV_XREQUEST    TYPE XSTRING.
DATAGS_IDM_INTEG_CUST TYPE SPML_ST_IDM_INTEG_CUST.
DATALV_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_ATTRIBUTEIV_NAME 'logonname'  IV_VALUE '' ).

LO_SPML_MESSAGE->SET_IDENTIFIERIV_IDENTIFIER 'sapuser' ).

LO_SPML_MESSAGE->SET_PROPERTYIV_NODE_NAME 'dsml:present' IV_PROP_NAME 'logonname' IV_PROP_VALUE '' ).

LO_SPML_MESSAGE->SET_PROPERTYIV_NODE_NAME 'equalityMatch' IV_PROP_NAME 'logonname' IV_PROP_VALUE 'DEV02' ).

LV_XREQUEST  LO_SPML_CLIENT->CREATE_SOAP_ENVELOPELO_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                   ).

* Calculating request length
LV_RLEN XSTRLENLV_XREQUEST ).
MOVE LV_RLEN TO LV_RLEN_STR.

* Filling in the parameters
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  '~request_method' VALUE 'POST' ).

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  '~server_protocol' VALUE 'HTTP/1.1' ).

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'Content-Type'
                                           VALUE LV_CONTENT_TYPE_VALUE ). "#EC NOTEXT

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'Content-Length'
                                           VALUE LV_RLEN_STR ). "#EC NOTEXT


LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'X-Requested-With'
                                           VALUE 'XMLHttpRequest' ). "#EC NOTEXT

LO_HTTP_CLIENT->REQUEST->SET_DATADATA   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       ).

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     ).

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_ENVELOPELV_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_attributeiv_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.

DATALO_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.

DATAIV_DESTINATION TYPE  RFCDEST.
DATAIV_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.

DATALO_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.
DATALV_XREQUEST    TYPE XSTRING.
DATAGS_IDM_INTEG_CUST TYPE SPML_ST_IDM_INTEG_CUST.
DATALV_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_IDENTIFIERIV_IDENTIFIER 'sapuser' ).

LO_SPML_MESSAGE->SET_PROPERTYIV_NODE_NAME 'dsml:present' IV_PROP_NAME 'logonname' IV_PROP_VALUE '' ).

LO_SPML_MESSAGE->SET_ATTRIBUTEIV_NAME 'logonname'  IV_VALUE '' ).

LO_SPML_MESSAGE->set_attributeiv_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_ENVELOPELO_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                   ).

* Calculating request length
LV_RLEN XSTRLENLV_XREQUEST ).
MOVE LV_RLEN TO LV_RLEN_STR.

* Filling in the parameters
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  '~request_method' VALUE 'POST' ).

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  '~server_protocol' VALUE 'HTTP/1.1' ).

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'Content-Type'
                                           VALUE LV_CONTENT_TYPE_VALUE ). "#EC NOTEXT

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'Content-Length'
                                           VALUE LV_RLEN_STR ). "#EC NOTEXT


LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'X-Requested-With'
                                           VALUE 'XMLHttpRequest' ). "#EC NOTEXT

LO_HTTP_CLIENT->REQUEST->SET_DATADATA   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       ).

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     ).

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_ENVELOPELV_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_attributeiv_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.

DATALO_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.

DATAIV_DESTINATION TYPE  RFCDEST.
DATAIV_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
   
.

DATAIV_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.

DATALO_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.
DATALV_XREQUEST    TYPE XSTRING.
DATAGS_IDM_INTEG_CUST TYPE SPML_ST_IDM_INTEG_CUST.
DATALV_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_ATTRIBUTEIV_NAME 'objectclass' IV_VALUE 'sapuser' ).

* Pass Logon ID
LV_STR 'TEST00B'.
LO_MSG_REQ->SET_ATTRIBUTEIV_NAME 'logonname'   IV_VALUE LV_STR ).

* Pass First Name
IV_FIRSTNAME 'Chuck'.

LV_STR IV_FIRSTNAME.
LO_MSG_REQ->SET_ATTRIBUTEIV_NAME 'firstname' IV_VALUE LV_STR ).

* Pass Last Nam
IV_LASTNAME 'Chen'.
LV_STR IV_LASTNAME.
LO_MSG_REQ->SET_ATTRIBUTEIV_NAME 'lastname'    IV_VALUE LV_STR ).

* Pass E-Mail
IV_EMAIL 'test@qq.com'.
LV_STR IV_EMAIL.
LO_MSG_REQ->SET_ATTRIBUTEIV_NAME 'email'     IV_VALUE LV_STR ).


* Pass Password
IV_PASSWORD 'Abcd12345'.
LV_STR IV_PASSWORD.
LO_MSG_REQ->SET_ATTRIBUTEIV_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_ENVELOPELO_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                   ).

* Calculating request length
LV_RLEN XSTRLENLV_XREQUEST ).
MOVE LV_RLEN TO LV_RLEN_STR.

* Filling in the parameters
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  '~request_method' VALUE 'POST' ).

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  '~server_protocol' VALUE 'HTTP/1.1' ).

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'Content-Type'
                                           VALUE LV_CONTENT_TYPE_VALUE ). "#EC NOTEXT

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'Content-Length'
                                           VALUE LV_RLEN_STR ). "#EC NOTEXT


LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'X-Requested-With'
                                           VALUE 'XMLHttpRequest' ). "#EC NOTEXT

LO_HTTP_CLIENT->REQUEST->SET_DATADATA   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       ).

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     ).

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_ENVELOPELV_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_ATTRIBUTEIV_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.

DATALO_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.

DATAIV_DESTINATION TYPE  RFCDEST.
DATAIV_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
   
.

DATAIV_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.

DATALO_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.
DATALV_XREQUEST    TYPE XSTRING.
DATAGS_IDM_INTEG_CUST TYPE SPML_ST_IDM_INTEG_CUST.
DATALV_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_identifieriv_identifier lv_str ).

*** Pass First Name
IV_FIRSTNAME 'Chuck002X'.

LV_STR IV_FIRSTNAME.
LO_MSG_REQ->SET_ATTRIBUTEIV_NAME 'firstname' IV_VALUE LV_STR ).

lv_str 'D1234567'.
lo_msg_req->set_attributeiv_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_ENVELOPELO_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                   ).

* Calculating request length
LV_RLEN XSTRLENLV_XREQUEST ).
MOVE LV_RLEN TO LV_RLEN_STR.

* Filling in the parameters
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  '~request_method' VALUE 'POST' ).

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  '~server_protocol' VALUE 'HTTP/1.1' ).

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'Content-Type'
                                           VALUE LV_CONTENT_TYPE_VALUE ). "#EC NOTEXT

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'Content-Length'
                                           VALUE LV_RLEN_STR ). "#EC NOTEXT


LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELDNAME  'X-Requested-With'
                                           VALUE 'XMLHttpRequest' ). "#EC NOTEXT

LO_HTTP_CLIENT->REQUEST->SET_DATADATA   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       ).

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     ).

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_ENVELOPELV_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_ATTRIBUTEIV_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.

DATALO_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.

  1. 类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_attributename 'requestID'
    value lv_guid ).

* Identifier node
  lo_ixml_identifier mo_message_dom->create_elementname 'identifier' ).
* Set type attribute
  lo_ixml_identifier->set_attributename 'type' value 'GenericString' ).

* ID node
  lo_ixml_id mo_message_dom->create_elementname 'id' ).

* Modifications node
  lo_ixml_modifications mo_message_dom->create_elementname 'modifications' ).

* Append Identifier node into request node
  lo_ixml_request->append_childnew_child lo_ixml_identifier ).
* Append Id node into Identifier node
  lo_ixml_identifier->append_childnew_child lo_ixml_id ).
* Append modifications node into request node
  lo_ixml_request->append_childnew_child lo_ixml_modifications ).
* Append request node into document
  me->mo_message_dom->append_childnew_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_NAMENAME 'modifications' ).
  LO_NODE_ITERATOR ME->MO_MESSAGE_DOM->CREATE_ITERATOR_FILTEREDFILTER 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_NAMENAME 'modification' ).
  LO_NODE_ITERATOR LO_MODIFICATIONS_NODE->CREATE_ITERATOR_FILTEREDFILTER 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_ITEMNAME '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_ITEMINDEX ).
      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_VALUEVALUE 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_ELEMENTNAME 'modification' ).
    LO_IXML_MODIF->SET_ATTRIBUTENAME 'name' VALUE IV_NAME ).

* Create value xml node
    LO_IXML_VALUE MO_MESSAGE_DOM->CREATE_ELEMENTNAME 'value' ).
    LO_IXML_VALUE->IF_IXML_NODE~SET_VALUEVALUE IV_VALUE ).
    LO_IXML_MODIF->APPEND_CHILDNEW_CHILD LO_IXML_VALUE ).
* Append attribute node into document
    LO_MODIFICATIONS_NODE->APPEND_CHILDNEW_CHILD LO_IXML_MODIF ).
  ENDIF.


ENDMETHOD.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值