目录
- 建数据结构
- 建数据表
- [segw 添加结构](#segw 添加结构)
- 实现CRUD
- 测试
- 其它
-
- [Post 创建--报错:The Data Services Request contains SystemQueryOptions that are not allowed for this Request Type](#Post 创建--报错:The Data Services Request contains SystemQueryOptions that are not allowed for this Request Type)
- 批量处理
-
- CHANGESET_BEGIN
- [CHANGE SET_END](#CHANGE SET_END)
- CHANGESET_PROCESS
- [batch 请求](#batch 请求)
建数据结构
结构 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
- 效果图
