tl-dr:显然您必须使用 SAP 网关。如果您不需要在一个事务中处理这些请求,则将它们发送到不同的变更集中。如果您根本不需要批处理调用,请考虑通过在实例化时为您的模型提供 "useBatch": false 来关闭它。但是,如果您需要在一个事务中一起处理请求,那么您必须阅读下面的详细信息。
为了理解问题,您必须了解网关以及批处理和变更集请求是如何工作的。
批处理请求由捆绑在一起的多个请求组成。目的是只打开一个连接并将相关请求组合在一起,从而最大限度地减少开销。变更集在批处理请求中形成较小的块,可以将修改请求捆绑在一起并一起处理,以确保全有或全无的特性。
所以在网关方面:假设您使用了 SAP Gateway Service Builder(SEGW 事务),您的 OData 服务有两个相关类。有一个以 ...DPC 结尾,一个以 ...DPC_EXT 结尾。不要碰前者,当您在服务构建器中更新服务时,它总是会重新生成。后者是我们在本例中需要的。您将不得不重新定义至少两种方法:
- /IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_BEGIN
- /IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_PROCESS
默认情况下,changeset_begin 方法只允许对请求数等于 1 的变更集进行变更集处理。这可以自动处理,这就是存在限制的原因。如果有更多请求,则无法确保自动处理它们,因为它们可能相互依赖业务。
因此,请确保在所需条件下允许对变更集进行捆绑(延迟模式)处理:
- /IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_BEGIN:首先在 try catch 块中调用 super->/iwbep/if_mgw_appl_srv_runtime~changeset_begin 方法,然后在 it_operation_info 处循环以仅在选定情况下决定和缩小处理范围,然后仅在选定情况下允许 cv_defer_mode,否则抛出 /iwbep/cx_mgw_tech_exception=>changeset_not_supported 异常。
/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_PROCESS:所有请求都将在 it_changeset_request 中可用。确保使用响应填充 ct_changeset_response 表。
METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_process.
DATA:
lv_operation_counter TYPE i VALUE 0,
lr_context TYPE REF TO /iwbep/cl_mgw_request,
lr_entry_provider TYPE REF TO /iwbep/if_mgw_entry_provider,
lr_message_container TYPE REF TO /iwbep/if_message_container,
lr_entity_data TYPE REF TO data,
ls_context_details TYPE /iwbep/if_mgw_core_srv_runtime=>ty_s_mgw_request_context,
ls_changeset_response LIKE LINE OF ct_changeset_response.
FIELD-SYMBOLS:
<fs_ls_changeset_request> LIKE LINE OF it_changeset_request.
LOOP AT it_changeset_request ASSIGNING <fs_ls_changeset_request>.
lr_context ?= <fs_ls_changeset_request>-request_context.
lr_entry_provider = <fs_ls_changeset_request>-entry_provider.
lr_message_container = <fs_ls_changeset_request>-msg_container.
ls_context_details = lr_context->get_request_details( ).
CASE ls_context_details-target_entity.
WHEN 'SomeEntity'.
"Do the processing here
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDMETHOD.