$BATCH请求导致错误&Quot;默认变更集实现只允许一个操作&Quot; [英] $batch request resulting in error "Default changeset implementation allows only one operation"

查看:25
本文介绍了$BATCH请求导致错误&Quot;默认变更集实现只允许一个操作&Quot;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用SAPUI5制作工作列表应用程序。问题是,当我创建一个条目,然后紧接着创建另一个条目时,我收到以下错误:

默认变更集实现仅允许一个操作。

我检查了$batch头,我看到有一个合并和一个POST,由于某些原因,合并更新了以前的条目。有谁能说点什么吗?会不会是后端错误而不是UI5错误?

创建新条目:

_onMetadataLoaded: function() {
  var oModel = this.getView().getModel();
  var that = this;
  // ...
  oModel.read("/USERS_SET", {
    success: function(oData) {
      var oProperties = {
        Qmnum: "0",
        Otherstuff: "cool"
      };
      that._oContext = that._oView.getModel().createEntry("/ENTITYSET", {
        properties: oProperties
      });
      that.getView().setBindingContext(that._oContext);
      // ...
    }
  });
},

handleSavePress: function(oEvent) {
  // ...
  this.getView().getModel().submitChanges({
    success: function(oData) {
      // ...
    },
    error: function(oError) {
      // ...
    }
  });
},

SAP

tl-dr:显然您必须使用推荐答案网关。如果不需要在一个事务中处理这些请求,则在不同的变更集中发送它们。如果根本不需要批处理调用,可以考虑在实例化时为模型提供"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_egin方法将仅允许对请求数等于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.
    

这篇关于$BATCH请求导致错误&Quot;默认变更集实现只允许一个操作&Quot;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆