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 批量处理策略
为了帮助设计和实现批量处理系统,基本的批量应用是通过块和模式来构建的,同时也应该能够为程序开发人员和设计人员提供结构的样例和基础的批量处理程序. 当你开始设计一个批量作业任务的时候,商业逻辑应该被拆分 ...
随机推荐
- curl命令学习之一--基本用法
- nfs 安装配置
系统环境:centos 6.4 x86_64 minimal,记得是199个安装包. 两台机器(可以是虚拟机): 192.168.1.150--->a机器 192.168.1.11-----&g ...
- select poll epoll Linux高并发网络编程模型
0 发展历程 同步阻塞迭代模型-->多进程并发模型-->多线程并发模型-->select-->poll-->epoll-->... 1 同步阻塞迭代模型 bind( ...
- Django中模型(四)
Django中模型(四) 五.创建对象 1.目的 向数据库中添加数据.当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时,才与数据库交互,将对象保存到数据库中 2.注意 __ ...
- cocos2d-x中关于打包成APK的问题
转载自:http://blog.csdn.net/u013315178/article/details/51254630 之前在网上看了很多的帖子大多数用ide 来打包 太麻烦了 而且一般没有人现场指 ...
- ZooKeeper学习之路 (四)ZooKeeper开发环境eclipse配置
一.eclipse中配置zookeeper开发环境 1)将zookeeper eclipse plugin中的6个jar包放到eclipse安装目录下的plugins文件中,重启eclipse (2) ...
- Kali-linux其他信息收集手段
上面介绍了使用不同的工具以操作步骤的形式进行了信息收集.在Kali中还可以使用一些常规的或非常规方法来收集信息,如使用Recon-NG框架.Netdiscover工具和Shodan工具等.本节将介绍使 ...
- ethersjs运行时出现的问题
1.在运行部署在ganache1.1.0上的合约中的某个函数时,出现了这样的问题,之前部署在geth上时并没有这样的问题 userdeMacBook-Pro:test-ethers user$ nod ...
- 如何将pip更新到最新版
通过该命令即可达到目的:python -m pip install --upgrade pip pip在Python中是非常常用的,就像node.js里面的npm一样.两者共同的作用是包的管理工具.
- 用c写一个小的聊天室程序
1.聊天室程序——客户端 客户端我也用了select进行I/O复用,同时监控是否有来自socket的消息和标准输入,近似可以完成对键盘的中断使用. 其中select的监控里,STDOUT和STDIN是 ...