SAP OData $batch processing
例として、1回の呼び出しで100個の新しい商品を作成したい場合、最も簡単な方法は、$ batch要求を使用して100個のPOST呼び出しすべてを単一のサービス呼び出しにまとめることです。
URIの末尾にsap-statistics = trueオプションを追加すると、所要時間についての詳細が表示されます。 SAPゲートウェイのパフォーマンストレースで結果を調べることができます。
(Transaction:/ n/iwfnd/traces or /niwbep/traces)
SAP Gateway Side
メソッドCHANGESET_BEGINを使用すると、新しい変更パラメータCV_DEFER_MODEが一度に処理できるゲートウェイフレームワークになります(遅延処理)。 この方法を実行するときの簡単な例を見てみましょう。
- Transaction /nsegw
- ランタイム成果物を展開します。
- dpc_extクラスをダブルクリックして
- / IWBEP / IF_MGW_APPL_SRV_RUNTIME〜CHANGESET_BEGINメソッドを見つけて、再定義してください。
その後、これを行うと、CHANGESET_BEGINメソッドは/ IWBEP / IF_MGW_APPL_SRV_RUNTIMEインターフェースから継承されます。
METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_begin.
LOOP AT it_operation_info INTO DATA(ls_operation_info).
IF ( ls_operation_info-entity_set EQ 'YourEntitySet' AND
ls_operation_info-entity_type EQ 'YourEntity' ).
cv_defer_mode = abap_true.
EXIT.
ENDIF.
ENDLOOP.
ENDMETHOD.
/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_PROCESS
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_req_parent TYPE /iwbep/if_mgw_appl_types=>ty_s_changeset_request,
lo_create_context TYPE REF TO /iwbep/if_mgw_req_entity_c,
lv_entity_type TYPE string,
ls_changeset_response TYPE /iwbep/if_mgw_appl_types=>ty_s_changeset_response,
ls_changeset_resp_parent TYPE /iwbep/if_mgw_appl_types=>ty_s_changeset_response,
ls_item TYPE zcl_example_mpc=>ts_item,
lv_error_entity TYPE string,
lt_return TYPE STANDARD TABLE OF bapiret2. DATA lo_container TYPE REF TO /iwbep/if_message_container.
DATA lr_return TYPE REF TO bapiret2.
DATA lv_process_count TYPE i.
DATA lv_isapproved TYPE xfeld.
DATA lv_pending_status TYPE xfeld. **halilu 20.08.2018 16:50:56 ZCL_''_EXT==CM009 LOOP AT it_changeset_request INTO ls_changeset_request. ** You need to pass it if operation_type is 'PE', because
** $batch comes with unnecessary scenarios, you need to avoid it. IF ls_changeset_request-operation_type EQ 'PE'.
CONTINUE.
ENDIF. lo_create_context ?= ls_changeset_request-request_context.
lv_entity_type = lo_create_context->get_entity_type_name( ). REFRESH : lt_return. * Authority Control if you have a authority scenario, you can code in here. *--------------------------------------------------------------------* *--------------------------------------------------------------------* CASE lv_entity_type.
*--------------------------------------------------------------------*
WHEN 'YourEntity'. CLEAR ls_item. ls_changeset_request-entry_provider->read_entry_data( IMPORTING es_data = ls_item ). ** In here , you can implement your logic in a specific customers requirements. ** Your code have to return bapiret2_tt parameter as export,
** Because you need to handle errors in here like below. LOOP AT lt_return TRANSPORTING NO FIELDS WHERE type EQ 'E'. ENDLOOP. IF sy-subrc EQ 0. READ TABLE lt_return REFERENCE INTO lr_return INDEX 1. IF sy-subrc EQ 0 AND
lr_return IS BOUND. lo_container = me->mo_context->get_message_container( ). lo_container->add_message_from_bapi(
EXPORTING
is_bapi_message = lr_return->*
iv_message_target = ls_item-your_key && 'Where you receive errors'
). ENDIF. RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = /iwbep/cx_mgw_busi_exception=>business_error
message_container = lo_container. ELSE. copy_data_to_ref(
EXPORTING
is_data = ls_item
CHANGING
cr_data = ls_changeset_response-entity_data ). ENDIF.
*--------------------------------------------------------------------* ENDCASE. ls_changeset_response-operation_no = ls_changeset_request-operation_no.
INSERT ls_changeset_response INTO TABLE ct_changeset_response. ** If you do something when batch operation finishes, do something like below. AT LAST. ** Your Logic ** ENDAT. ENDLOOP. ENDMETHOD.
/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_END
METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_end. COMMIT WORK AND WAIT. ENDMETHOD.
SAP Ui5 Side
最初に、以下のようにoDataModelを設定する必要があります。
var oConfig = {
metadataUrlParams: {},
json: true,
// loadMetadataAsync : true,
defaultBindingMode: "OneWay",
defaultCountMode: "None",
useBatch: true
};
// Create and set domain model to the component
var oModel = new sap.ui.model.odata.v2.ODataModel(sServiceUrl, oConfig);
this.setModel(oModel);
その後、必要に応じて$ batch処理を実装できます。 私はそれのすべてをsap.m.tableを書かなかった、あなたはこのリンクでそれをチェックすることができる。
In your view , you need to bind oViewModel that is a json Model like this.
<Table id="yourTableId" items="{ path: 'oViewModel>/yourArray' }" class="sapUiSizeCompact">
コントローラで、onInit関数でoViewModelをインスタンス化します。
this_oView = this.getView();
var oViewModel = new sap.ui.model.json.JSONModel({
yourArray: [{ "field1" : "data11",
"field2" : "data12",
"field3" : "data13"
},{ "field1" : "data21",
"field2" : "data22",
"field3" : "data23"
}]
}); this._oView.setModel(oViewModel, "oViewModel");
_getViewModel: function() {
var oViewModel = this._oView.getModel("oViewModel");
return oViewModel;
},
yourFunction: function() {
debugger;
var oModel = this.getView().getModel(),
oTable = this._oTable, // Your Table that you will get item's data.
iLength = oTable.getItems("items").length,
oItem,
sPath,
bError = false;
// Distinguish your request from other batch requests like below.
oModel.setDeferredBatchGroups(["myId"]);
for (var i = 0; i < iLength; i++) {
var oEntry = {},
oParams = {};
// You need to show your message that returns from backend the latest.
if (i === (iLength - 1)) {
oParams.success = function(oData, oResponse) {
sap.ui.core.BusyIndicator.hide();
MessageToast.show(this._oResourceBundle.getText("PROCESS_SUCCESS"));
// debugger;
}.bind(this);
oParams.error = function(oError) {
// debugger;
sap.ui.core.BusyIndicator.hide();
var oJson = JSON.parse(oError.responseText);
this._bIsError = true;
var oJson = JSON.parse(oError.responseText);
var oMsgBox = sap.ca.ui.message.showMessageBox({
type: sap.ca.ui.message.Type.ERROR,
message: oJson.error.message.value
});
if (!sap.ui.Device.support.touch) {
oMsgBox.addStyleClass("sapUiSizeCompact");
}
oModel.refresh();
}.bind(this);
}
oParams.async = false;
oParams.batchGroupId = "myId";
oItem = oTable.getItems("items")[i];
sPath = oItem.getBindingContextPath();
// needing to bind yourSpecific Json Model to Table's item aggregation.
// in this scenario,
oEntry = this._getViewModel().getProperty(oItem.getBindingContextPath());
sap.ui.core.BusyIndicator.show(0);
oModel.create("/YourEntitySet", oEntry, oParams);
}
if (bError === true) {
return;
}
oModel.submitChanges({
groupId: "myId"
});
}
参考文献
SAP OData $batch processing的更多相关文章
- RabbitMQ and batch processing 批提交
RabbitMQ - RabbitMQ and batch processinghttp://rabbitmq.1065348.n5.nabble.com/RabbitMQ-and-batch-pro ...
- (十三)Batch Processing
In addition to being able to index, update, and delete individual documents, Elasticsearch also prov ...
- 13 Stream Processing Patterns for building Streaming and Realtime Applications
原文:https://iwringer.wordpress.com/2015/08/03/patterns-for-streaming-realtime-analytics/ Introduction ...
- 【ABAP系列】SAP ABAP 的替代和校验
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 的替代和校验 ...
- Spring Batch 中文参考文档 V3.0.6 - 1 Spring Batch介绍
1 Spring Batch介绍 企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务.这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行.这些典型作业包括 ...
- 腾讯大数据平台Oceanus: A one-stop platform for real time stream processing powered by Apache Flink
January 25, 2019Use Cases, Apache Flink The Big Data Team at Tencent In recent years, the increa ...
- An Overview of End-to-End Exactly-Once Processing in Apache Flink (with Apache Kafka, too!)
01 Mar 2018 Piotr Nowojski (@PiotrNowojski) & Mike Winters (@wints) This post is an adaptation o ...
- Coursera, Big Data 3, Integration and Processing (week 4)
Week 4 Big Data Precessing Pipeline 上图可以generalize 成下图,也就是Big data pipeline some high level processi ...
- Spring Batch 批量处理策略
为了帮助设计和实现批量处理系统,基本的批量应用是通过块和模式来构建的,同时也应该能够为程序开发人员和设计人员提供结构的样例和基础的批量处理程序. 当你开始设计一个批量作业任务的时候,商业逻辑应该被拆分 ...
随机推荐
- haproxy开启日志功能
haproxy在默认情况不会记录日志,除了在haproxy.conf中的global段指定日志的输出外,还需要配置系统日志的配置文件.下面以centos6.4为例,haproxy使用系统自带的rpm报 ...
- C++课堂作业二之反转链表
1问题链接: https://www.patest.cn/contests/pat-b-practise/1025 2解题想法: 这题原来用数组打过,现在是想保留暂存数据的数组,然后按顺序提取出来到创 ...
- 021.3 IO流——字节流-FileInputStream读取字节
内容:文件读取方法,读取方法例子,read(buf)方法中buf的取值,字节流缓冲区对象—提高读取速度/// 文件读取方法:fis.read(),fis.read(buf),具体看例子 例子:文件读取 ...
- MySQL 触发器-更新字段时,status列会加一
需求:当更新列中的字段时,列中的status字段,就会+1 表结构 CREATE TABLE `test_1` ( `id` int(11) DEFAULT NULL, `name` varchar( ...
- iOS UI的几种模式
iOS UI的几种模式: 1.平凡模式(原生控件组合): 2.新闻模式: 3.播放器模式: 4.微博模式:
- Appfuse搭建过程(下源代码不须要maven,lib直接就在项目里(否则痛苦死!))
什么是Appfuse:AppFuse是一个集成了众多当前最流行开源框架与工具(包含Hibernate.ibatis.Struts.Spring.DBUnit.Maven.Log4J.Struts Me ...
- 20145324 Java实验三
一.git 上传代码步骤 上传结果 原代码 下载同学代码 更改 二.重构 原代码 rename 原代码 实验总结 这次实验比较简单,而且终于解决了git的问题,很开心 步骤 耗时 百分比 需求分析 1 ...
- IO流操作详解
注:FileReader继承InputStreamReader类,InputStreamReader实现Reader接口,其他同理. 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 其中, ...
- 20165302 学习基础和C语言基础调查
学习基础和C语言基础调查 ====== 一,技能学习经验体会 要问我有什么技能比大多数人强,这个我还真的不敢说,虽然我在很多方面都有自己的一些了解,比如乐器和绘画,但也都是一知半解,并没有在某一方面出 ...
- React Native封装Toast与加载Loading组件
React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...