例として、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が一度に処理できるゲートウェイフレームワークになります(遅延処理)。 この方法を実行するときの簡単な例を見てみましょう。

  1. Transaction /nsegw
  2. ランタイム成果物を展開します。
  3. dpc_extクラスをダブルクリックして
  4. / IWBEP / IF_MGW_APPL_SRV_RUNTIME〜CHANGESET_BEGINメソッドを見つけて、再定義してください。

その後、これを行うと、CHANGESET_BEGINメソッドは/ IWBEP / IF_MGW_APPL_SRV_RUNTIMEインターフェースから継承されます。

  1. METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_begin.
  2.  
  3. LOOP AT it_operation_info INTO DATA(ls_operation_info).
  4. IF ( ls_operation_info-entity_set EQ 'YourEntitySet' AND
  5. ls_operation_info-entity_type EQ 'YourEntity' ).
  6. cv_defer_mode = abap_true.
  7. EXIT.
  8. ENDIF.
  9. ENDLOOP.
  10.  
  11. ENDMETHOD.

  

/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_PROCESS

  1. METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_process.
  2.  
  3. DATA: ls_changeset_request TYPE /iwbep/if_mgw_appl_types=>ty_s_changeset_request,
  4. ls_changeset_req_parent TYPE /iwbep/if_mgw_appl_types=>ty_s_changeset_request,
  5. lo_create_context TYPE REF TO /iwbep/if_mgw_req_entity_c,
  6. lv_entity_type TYPE string,
  7. ls_changeset_response TYPE /iwbep/if_mgw_appl_types=>ty_s_changeset_response,
  8. ls_changeset_resp_parent TYPE /iwbep/if_mgw_appl_types=>ty_s_changeset_response,
  9. ls_item TYPE zcl_example_mpc=>ts_item,
  10. lv_error_entity TYPE string,
  11. lt_return TYPE STANDARD TABLE OF bapiret2.
  12.  
  13. DATA lo_container TYPE REF TO /iwbep/if_message_container.
  14. DATA lr_return TYPE REF TO bapiret2.
  15. DATA lv_process_count TYPE i.
  16. DATA lv_isapproved TYPE xfeld.
  17. DATA lv_pending_status TYPE xfeld.
  18.  
  19. **halilu 20.08.2018 16:50:56 ZCL_''_EXT==CM009
  20.  
  21. LOOP AT it_changeset_request INTO ls_changeset_request.
  22.  
  23. ** You need to pass it if operation_type is 'PE', because
  24. ** $batch comes with unnecessary scenarios, you need to avoid it.
  25.  
  26. IF ls_changeset_request-operation_type EQ 'PE'.
  27. CONTINUE.
  28. ENDIF.
  29.  
  30. lo_create_context ?= ls_changeset_request-request_context.
  31. lv_entity_type = lo_create_context->get_entity_type_name( ).
  32.  
  33. REFRESH : lt_return.
  34.  
  35. * Authority Control if you have a authority scenario, you can code in here.
  36.  
  37. *--------------------------------------------------------------------*
  38.  
  39. *--------------------------------------------------------------------*
  40.  
  41. CASE lv_entity_type.
  42. *--------------------------------------------------------------------*
  43. WHEN 'YourEntity'.
  44.  
  45. CLEAR ls_item.
  46.  
  47. ls_changeset_request-entry_provider->read_entry_data( IMPORTING es_data = ls_item ).
  48.  
  49. ** In here , you can implement your logic in a specific customers requirements.
  50.  
  51. ** Your code have to return bapiret2_tt parameter as export,
  52. ** Because you need to handle errors in here like below.
  53.  
  54. LOOP AT lt_return TRANSPORTING NO FIELDS WHERE type EQ 'E'. ENDLOOP.
  55.  
  56. IF sy-subrc EQ 0.
  57.  
  58. READ TABLE lt_return REFERENCE INTO lr_return INDEX 1.
  59.  
  60. IF sy-subrc EQ 0 AND
  61. lr_return IS BOUND.
  62.  
  63. lo_container = me->mo_context->get_message_container( ).
  64.  
  65. lo_container->add_message_from_bapi(
  66. EXPORTING
  67. is_bapi_message = lr_return->*
  68. iv_message_target = ls_item-your_key && 'Where you receive errors'
  69. ).
  70.  
  71. ENDIF.
  72.  
  73. RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
  74. EXPORTING
  75. textid = /iwbep/cx_mgw_busi_exception=>business_error
  76. message_container = lo_container.
  77.  
  78. ELSE.
  79.  
  80. copy_data_to_ref(
  81. EXPORTING
  82. is_data = ls_item
  83. CHANGING
  84. cr_data = ls_changeset_response-entity_data ).
  85.  
  86. ENDIF.
  87. *--------------------------------------------------------------------*
  88.  
  89. ENDCASE.
  90.  
  91. ls_changeset_response-operation_no = ls_changeset_request-operation_no.
  92. INSERT ls_changeset_response INTO TABLE ct_changeset_response.
  93.  
  94. ** If you do something when batch operation finishes, do something like below.
  95.  
  96. AT LAST.
  97.  
  98. ** Your Logic **
  99.  
  100. ENDAT.
  101.  
  102. ENDLOOP.
  103.  
  104. ENDMETHOD.

  

/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_END

  1. METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_end.
  2.  
  3. COMMIT WORK AND WAIT.
  4.  
  5. ENDMETHOD.

  

SAP Ui5 Side

最初に、以下のようにoDataModelを設定する必要があります。

  1. var oConfig = {
  2. metadataUrlParams: {},
  3. json: true,
  4. // loadMetadataAsync : true,
  5. defaultBindingMode: "OneWay",
  6. defaultCountMode: "None",
  7. useBatch: true
  8. };
  9.  
  10. // Create and set domain model to the component
  11. var oModel = new sap.ui.model.odata.v2.ODataModel(sServiceUrl, oConfig);
  12. this.setModel(oModel);

  

その後、必要に応じて$ batch処理を実装できます。 私はそれのすべてをsap.m.tableを書かなかった、あなたはこのリンクでそれをチェックすることができる。

SAPUI5 Explored

  1. In your view , you need to bind oViewModel that is a json Model like this.
  2. <Table id="yourTableId" items="{ path: 'oViewModel>/yourArray' }" class="sapUiSizeCompact">

  

コントローラで、onInit関数でoViewModelをインスタンス化します。

  1. this_oView = this.getView();
  2. var oViewModel = new sap.ui.model.json.JSONModel({
  3. yourArray: [{ "field1" : "data11",
  4. "field2" : "data12",
  5. "field3" : "data13"
  6. },{ "field1" : "data21",
  7. "field2" : "data22",
  8. "field3" : "data23"
  9. }]
  10. });
  11.  
  12. this._oView.setModel(oViewModel, "oViewModel");

  

  1. _getViewModel: function() {
  2. var oViewModel = this._oView.getModel("oViewModel");
  3. return oViewModel;
  4. },
  5.  
  6. yourFunction: function() {
  7.  
  8. debugger;
  9.  
  10. var oModel = this.getView().getModel(),
  11. oTable = this._oTable, // Your Table that you will get item's data.
  12. iLength = oTable.getItems("items").length,
  13. oItem,
  14. sPath,
  15. bError = false;
  16.  
  17. // Distinguish your request from other batch requests like below.
  18.  
  19. oModel.setDeferredBatchGroups(["myId"]);
  20.  
  21. for (var i = 0; i < iLength; i++) {
  22.  
  23. var oEntry = {},
  24. oParams = {};
  25.  
  26. // You need to show your message that returns from backend the latest.
  27.  
  28. if (i === (iLength - 1)) {
  29.  
  30. oParams.success = function(oData, oResponse) {
  31. sap.ui.core.BusyIndicator.hide();
  32. MessageToast.show(this._oResourceBundle.getText("PROCESS_SUCCESS"));
  33. // debugger;
  34.  
  35. }.bind(this);
  36.  
  37. oParams.error = function(oError) {
  38. // debugger;
  39. sap.ui.core.BusyIndicator.hide();
  40. var oJson = JSON.parse(oError.responseText);
  41. this._bIsError = true;
  42. var oJson = JSON.parse(oError.responseText);
  43. var oMsgBox = sap.ca.ui.message.showMessageBox({
  44. type: sap.ca.ui.message.Type.ERROR,
  45. message: oJson.error.message.value
  46. });
  47.  
  48. if (!sap.ui.Device.support.touch) {
  49. oMsgBox.addStyleClass("sapUiSizeCompact");
  50. }
  51.  
  52. oModel.refresh();
  53.  
  54. }.bind(this);
  55.  
  56. }
  57.  
  58. oParams.async = false;
  59. oParams.batchGroupId = "myId";
  60.  
  61. oItem = oTable.getItems("items")[i];
  62. sPath = oItem.getBindingContextPath();
  63.  
  64. // needing to bind yourSpecific Json Model to Table's item aggregation.
  65. // in this scenario,
  66. oEntry = this._getViewModel().getProperty(oItem.getBindingContextPath());
  67.  
  68. sap.ui.core.BusyIndicator.show(0);
  69. oModel.create("/YourEntitySet", oEntry, oParams);
  70. }
  71.  
  72. if (bError === true) {
  73. return;
  74. }
  75.  
  76. oModel.submitChanges({
  77. groupId: "myId"
  78. });
  79. }

  

参考文献

oData $batch processing

SAP OData $batch processing的更多相关文章

  1. RabbitMQ and batch processing 批提交

    RabbitMQ - RabbitMQ and batch processinghttp://rabbitmq.1065348.n5.nabble.com/RabbitMQ-and-batch-pro ...

  2. (十三)Batch Processing

    In addition to being able to index, update, and delete individual documents, Elasticsearch also prov ...

  3. 13 Stream Processing Patterns for building Streaming and Realtime Applications

    原文:https://iwringer.wordpress.com/2015/08/03/patterns-for-streaming-realtime-analytics/ Introduction ...

  4. 【ABAP系列】SAP ABAP 的替代和校验

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 的替代和校验 ...

  5. Spring Batch 中文参考文档 V3.0.6 - 1 Spring Batch介绍

    1 Spring Batch介绍 企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务.这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行.这些典型作业包括 ...

  6. 腾讯大数据平台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 ...

  7. 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 ...

  8. Coursera, Big Data 3, Integration and Processing (week 4)

    Week 4 Big Data Precessing Pipeline 上图可以generalize 成下图,也就是Big data pipeline some high level processi ...

  9. Spring Batch 批量处理策略

    为了帮助设计和实现批量处理系统,基本的批量应用是通过块和模式来构建的,同时也应该能够为程序开发人员和设计人员提供结构的样例和基础的批量处理程序. 当你开始设计一个批量作业任务的时候,商业逻辑应该被拆分 ...

随机推荐

  1. 沉淀,再出发:sublime中快捷键和html标签的使用和生成以及使用markdown

    沉淀,再出发:sublime中快捷键和html标签的使用和生成以及使用markdown 一.前言 工欲善其事,必先利其器.在软件代码的编写中,一定要知道IDE或者编辑器的快捷键的使用,这样可以提高很多 ...

  2. [EffectiveC++]item42:了解typename的双重意义

  3. HTML5 拖放、交换位置

    设置元素为可拖放 draggable 属性设置为 true: <img draggable="true" /> 拖动什么 - ondragstart 和 setData ...

  4. GitLab-CI与GitLab-Runner

    一.持续集成(Continuous Integration) 要了解GitLab-CI与GitLab Runner,我们得先了解持续集成是什么. 持续集成是一种软件开发实践,即团队开发成员经常集成他们 ...

  5. AngularCLI介绍及配置文件主要参数含义解析

    使用Angular CLI可以快速,简单的搭建一个angular2或angular4项目,是只要掌握几行命令就能构建出前端架构的最佳实践,它本质也是使用了webpack来编译,打包,压缩等构建的事情, ...

  6. Android笔记之 Web Service 基础

    一.Web Service是什么? 就是网络服务.依据W3C的定义,WebServices(Web服务)是一个用于支持网络间不同机器互操作的软件系统,它是一种自包括.自描写叙述和模块化的应用程序,它能 ...

  7. 基于cookie和session的登录验证

    settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions ...

  8. 随手练——HDU 1237 表达式求值(输入格式典型)

    坑了老子半天,结果是 float 范围不够!!! 基本思想: 开一个符号栈,一个数字栈: 碰到数字就入栈,碰到符号就与栈顶符号进行对比,如果当前符号优先级小于栈顶符号,数字栈弹出两个数进行栈顶符号运算 ...

  9. H、CSL 的拼图 【多维点的交换】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551/H 题目描述 众所周知 CSL 不仅玩魔方很强,打麻将也很强.今天他打魔法麻将的时候,在路上撞到了一个被打乱 ...

  10. VC++6.0中碰到Cannot access the ClassView information file.ClassView information will not be avaible.的解决方法

    一般情况下是由于类视图文件损坏了,这是经常会发生的现象. 解决步骤: 1.关闭工程,2.删除工程下.clw .ncb 文件及/debug目录,3.重建工程build all. 具体解释如下: dsp ...