【sap segw odata】

目录

建数据结构

结构 ZSSALES

ID 1 类型 CHAR 10 0 0

NAME 1 类型 CHAR 20 0 0

PHONE 1 类型 CHAR 11 0 0

ADDRESS 1 类型 CHAR 30 0 0

ZSEX 1 类型 CHAR 1 0 0

效果图如下:

建数据表

数据表:ZTSALES

MANDT MANDT CLNT 3 0 0 集团

ID CHAR 10 0 0

ZSEX CHAR 1 0 0

NAME CHAR 20 0 0

PHONE CHAR 20 0 0

ADDRESS CHAR 20 0 0

效果图:

segw 添加结构

实现CRUD

create

bash 复制代码
  METHOD salesset_create_entity.
**TRY.
*CALL METHOD SUPER->SALESSET_CREATE_ENTITY
*  EXPORTING
*    IV_ENTITY_NAME          =
*    IV_ENTITY_SET_NAME      =
*    IV_SOURCE_NAME          =
*    IT_KEY_TAB              =
**    io_tech_request_context =
*    IT_NAVIGATION_PATH      =
**    io_data_provider        =
**  IMPORTING
**    er_entity               =
*    .
**  CATCH /iwbep/cx_mgw_busi_exception.
**  CATCH /iwbep/cx_mgw_tech_exception.
**ENDTRY.

    DATA: ls_return TYPE bapiret2,
          lt_return TYPE STANDARD TABLE OF bapiret2.
    DATA:ls_requst_input_data TYPE zcl_zodata_mpc=>ts_sales,
         ls_table             TYPE ztsales.
    io_data_provider->read_entry_data( IMPORTING es_data = ls_requst_input_data ).

    ls_table-id      = ls_requst_input_data-id .
    ls_table-name    = ls_requst_input_data-name .
    ls_table-phone   = ls_requst_input_data-phone.
    ls_table-address = ls_requst_input_data-address .
    ls_table-zsex = ls_requst_input_data-zsex .
    INSERT ztsales FROM ls_table .
    IF sy-subrc EQ 0 .
      er_entity = ls_requst_input_data .
    ELSE.
      ls_return-type    = 'E'.
      ls_return-id      = '00'.
      ls_return-number  = '000'.
      ls_return-message = 'Save failed, line item may already exist'.
      ls_return-message_v1 = 'Save failed, line item may already exist'.
      APPEND ls_return TO lt_return.

      mo_context->get_message_container( )->add_messages_from_bapi(
                it_bapi_messages = lt_return
                iv_determine_leading_msg = /iwbep/if_message_container=>gcs_leading_msg_search_option-first ) .
      RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
        EXPORTING
          textid            = /iwbep/cx_mgw_busi_exception=>business_error
          message_container = mo_context->get_message_container( ).
    ENDIF.
    COMMIT WORK.

  ENDMETHOD.

read

bash 复制代码
  METHOD salesset_get_entity.
**TRY.
*CALL METHOD SUPER->SALESSET_GET_ENTITY
*  EXPORTING
*    IV_ENTITY_NAME          =
*    IV_ENTITY_SET_NAME      =
*    IV_SOURCE_NAME          =
*    IT_KEY_TAB              =
**    io_request_object       =
**    io_tech_request_context =
*    IT_NAVIGATION_PATH      =
**  IMPORTING
**    er_entity               =
**    es_response_context     =
*    .
**  CATCH /iwbep/cx_mgw_busi_exception.
**  CATCH /iwbep/cx_mgw_tech_exception.
**ENDTRY.

    DATA: ls_key   TYPE /iwbep/s_mgw_name_value_pair,
          lv_value TYPE /iwbep/s_mgw_name_value_pair-value.

    CLEAR ls_key .
    READ TABLE it_key_tab INTO ls_key WITH KEY name = 'Id' .
    lv_value = ls_key-value.

    IF lv_value IS  NOT INITIAL.
      SELECT SINGLE * FROM ztsales
        INTO CORRESPONDING FIELDS OF er_entity
        WHERE id = lv_value.

    ENDIF.

  ENDMETHOD.

update

bash 复制代码
  METHOD salesset_update_entity.
**TRY.
*CALL METHOD SUPER->SALESSET_UPDATE_ENTITY
*  EXPORTING
*    IV_ENTITY_NAME          =
*    IV_ENTITY_SET_NAME      =
*    IV_SOURCE_NAME          =
*    IT_KEY_TAB              =
**    io_tech_request_context =
*    IT_NAVIGATION_PATH      =
**    io_data_provider        =
**  IMPORTING
**    er_entity               =
*    .
**  CATCH /iwbep/cx_mgw_busi_exception.
**  CATCH /iwbep/cx_mgw_tech_exception.
**ENDTRY.


    DATA: ls_key               TYPE /iwbep/s_mgw_name_value_pair,
          lv_id                TYPE /iwbep/s_mgw_name_value_pair-value,
          ls_requst_input_data TYPE zcl_zodata_mpc=>ts_sales,
          ls_table             TYPE ztsales.

    CLEAR: ls_key , ls_table.
    READ TABLE it_key_tab INTO ls_key WITH KEY name = 'Id' .
    lv_id = ls_key-value.

    IF lv_id IS  NOT INITIAL.
      io_data_provider->read_entry_data( IMPORTING es_data = ls_requst_input_data ).
      UPDATE ztsales SET id = ls_requst_input_data-id
                                  name = ls_requst_input_data-name
                                  phone = ls_requst_input_data-phone
                                  address = ls_requst_input_data-address
                                  zsex = ls_requst_input_data-zsex
                               WHERE id = lv_id .
      IF sy-subrc EQ 0 .
        er_entity = ls_requst_input_data .

      ENDIF.
    ENDIF.
  ENDMETHOD.

delete

bash 复制代码
  METHOD salesset_delete_entity.
**TRY.
*CALL METHOD SUPER->SALESSET_DELETE_ENTITY
*  EXPORTING
*    IV_ENTITY_NAME          =
*    IV_ENTITY_SET_NAME      =
*    IV_SOURCE_NAME          =
*    IT_KEY_TAB              =
**    io_tech_request_context =
*    IT_NAVIGATION_PATH      =
*    .
**  CATCH /iwbep/cx_mgw_busi_exception.
**  CATCH /iwbep/cx_mgw_tech_exception.
**ENDTRY.

    DATA: ls_key TYPE /iwbep/s_mgw_name_value_pair,
          lv_id  TYPE /iwbep/s_mgw_name_value_pair-value.
    DATA lv_flag TYPE c .
    CLEAR ls_key .
    READ TABLE it_key_tab INTO ls_key WITH KEY name = 'Id' .
    lv_id = ls_key-value.
    CHECK  lv_id IS NOT INITIAL .
    DELETE FROM ztsales WHERE id = lv_id .
    IF sy-subrc NE 0.
      lv_flag =  'X'.
    ENDIF.
    IF lv_flag EQ 'X'.
      ROLLBACK WORK .
      MESSAGE 'DELETE DATA FAILE' TYPE 'E' .
    ELSE.
      COMMIT WORK .
    ENDIF.
  ENDMETHOD.

测试

T-CODE: /IWFND/MAINT_SERVICE,/IWFND/GW_CLIENT(/IWFND/SUTIL_GW_CLIENT)

/IWFND/ERROR_LOG 查看日志信息

性能追踪(/IWFND/TRACES)

##获取metadata

  • url:/sap/opu/odata/SAP/ZODATA_SRV/?$format=xml

  • method:GET

  • 返回状态

    ~status_code 200

    ~status_reason OK

  • 执行效果

create test

  • 请求url

/sap/opu/odata/SAP/ZODATA_SRV/?$format=xml

  • Method:POST
  • 请求数据JSON格式
bash 复制代码
            {
        "Id" : "T003",
        "Zsex" : "女",
        "Name" : "小王",
        "Phone" : "123456789",
        "Address" : "广东省"
      }
  • 返回数据

    ~status_code 201

    ~status_reason Created

  • 效果

    数据表查看

read test

读取所有的

  • url

/sap/opu/odata/SAP/ZODATA_SRV/SALESSet

  • method:GET

  • 返回数据

    ~status_code 200

    ~status_reason OK

  • 效果图

读取单条数据

  • url:/sap/opu/odata/SAP/ZODATA_SRV/SALESSet('T003')

  • method:GET

  • 返回数据

    ~status_code 200

    ~status_reason OK

  • 效果图

delete test

删除数据id:T006

  • url

/sap/opu/odata/SAP/ZODATA_SRV/SALESSet('T006')

  • method:DELETE

  • 返回数据

    ~status_code 204

    ~status_reason No Content

  • 效果图

update test

把数据地址由广东改成广西

  • url

/sap/opu/odata/SAP/ZODATA_SRV/SALESSet('T003')

  • method:PUT
  • 请求数据
bash 复制代码
<?xml version="1.0" encoding="utf-8"?>
<entry xml:base="http://www.saps4hana.cn:50000/sap/opu/odata/SAP/ZODATA_SRV/" xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
 <id>http://www.saps4hana.cn:50000/sap/opu/odata/SAP/ZODATA_SRV/SALESSet('T003')</id>
 <title type="text">SALESSet('T003')</title>
 <updated>2026-03-13T10:11:59Z</updated>
 <category term="ZODATA_SRV.SALES" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
 <link href="SALESSet('T003')" rel="self" title="SALES"/>
 <content type="application/xml">
  <m:properties>
   <d:Id>T003</d:Id>
   <d:Zsex>女</d:Zsex>
   <d:Name>小王</d:Name>
   <d:Phone>123456789</d:Phone>
   <d:Address>广西省</d:Address>
  </m:properties>
 </content>
</entry>
  • 返回数据

    ~status_code 204

    ~status_reason No Content

  • 效果图:

    发送请求之前:

    返回数据效果图:

其它

Post 创建--报错:The Data Services Request contains SystemQueryOptions that are not allowed for this Request Type

调试发现是加了format 参数

批量处理

应用场景:

批量查询,批量更新,批量删除

请求:

/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_BEGIN

/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGE SET_END

/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_PROCESS

CHANGESET_BEGIN

cv_defer_mode = abap_true

CHANGE SET_END

COMMIT WORK.

CHANGESET_PROCESS

bash 复制代码
  METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_process.

    DATA:
      ls_changeset_request  TYPE /iwbep/if_mgw_appl_types=>ty_s_changeset_request,
      ls_changeset_response TYPE /iwbep/if_mgw_appl_types=>ty_s_changeset_response,
      lv_entity_type        TYPE string,
      lo_create_context     TYPE REF TO /iwbep/if_mgw_req_entity_u, "/iwbep/if_mgw_reg_entity_c,
      ls_salary             TYPE zssales,
      lt_salary             TYPE STANDARD TABLE OF zssales,
      ls_employee           TYPE zssales.

*/IWBEP/IF_MGW_REQ_ENTITY_C
*/IWBEP/IF_MGW_REQ_ENTITY_D
*/IWBEP/IF_MGW_REQ_ENTITY_P
*/IWBEP/IF_MGW_REQ_ENTITY_U
    LOOP AT it_changeset_request INTO ls_changeset_request WHERE operation_type = 'UE'.

      lo_create_context ?= ls_changeset_request-request_context.
      lv_entity_type = lo_create_context->get_entity_type_name( ).

      CASE lv_entity_type.

        WHEN 'SALES'.
          ls_changeset_request-entry_provider->read_entry_data( IMPORTING es_data = ls_salary ).

          SELECT SINGLE *
          FROM ztsales
          INTO @DATA(ls_salarydb)
          WHERE id = @ls_salary-id.
          IF sy-subrc EQ 0.
            "DELETE FROM ztsales WHERE id = ls_salary-id.
            ls_salarydb-name = ls_salary-name.
            ls_salarydb-phone  = ls_salary-phone.
            ls_salarydb-address  = ls_salary-address.
            ls_salarydb-zsex  = ls_salary-zsex.
            MODIFY ztsales  FROM ls_salarydb.
          ENDIF.
          IF sy-subrc EQ 0.
            copy_data_to_ref(
            EXPORTING is_data = ls_salary
            CHANGING  cr_data = ls_changeset_response-entity_data ).

          ENDIF.

          ls_changeset_response-operation_no = ls_changeset_request-operation_no.
          APPEND ls_changeset_response TO ct_changeset_response.
      ENDCASE.
    ENDLOOP.
  ENDMETHOD.

$batch 请求

  • url:/sap/opu/odata/SAP/ZODATA_SRV/$batch
  • method:POST
  • headers
bash 复制代码
accept	application/json
x-sap-security-session	disabled
Content-Type	multipart/mixed; boundary=batch
  • body
bash 复制代码
--batch
Content-Type: multipart/mixed; boundary=changeset

--changeset
Content-Type: application/http
Content-Transfer-Encoding: binary

PUT SALESSet(Id='T005') HTTP/1.1
Content-Type: application/json

{
    "Id" : "T005",
        "Zsex" : "女",
        "Name" : "小王",
        "Phone" : "123456789",
        "Address" : "广西省5"
}

--changeset--
Content-Type: application/http
Content-Transfer-Encoding: binary

PUT SALESSet(Id='T004') HTTP/1.1
Content-Type: application/json

{
       "Id" : "T004",
        "Zsex" : "女",
        "Name" : "小王",
        "Phone" : "123456789",
        "Address" : "广西省4"
}

--changeset--

--batch--
  • 返回数据
bash 复制代码
~status_code	202
~status_reason	Accepted
  • 效果图