$BATCH请求导致错误&Quot;默认变更集实现只允许一个操作&Quot; [英] $batch request resulting in error "Default changeset implementation allows only one operation"
本文介绍了$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
因此,请确保在所需条件下允许对变更集进行捆绑(延迟模式)处理:
- /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屋!
查看全文