例として、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を書かなかった、あなたはこのリンクでそれをチェックすることができる。
SAPUI5 Explored
In your view , you need to bind oViewModel that is a json Model like this.
コントローラで、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"
});
}
参考文献
oData $batch processing
转载于:https://www.cnblogs.com/yjyongil/p/10689743.html