ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA
GRADUADO EN INGENIERÍA DE COMPUTADORES
Implementación de Aplicaciones Fiori para la Gestión de
Servicios en SAP CRM
Fiori Apps Implementation for SAP CRM Service
Management
Realizado por
David Hormigo Ramírez
Tutorizado por
Carlos Rossi Jiménez
Departamento
Lenguajes y Ciencias de la Computación
UNIVERSIDAD DE MÁLAGA
MÁLAGA,
SEPTIEMBRE DE 2019
CALL TRANSFORMATION zcrm_ib_mapquest_body
SOURCE body = ls_address
RESULT XML lr_json_writer.
lv_body = lr_json_writer->get_output( ).
CHECK lv_body IS NOT INITIAL.
CONSTANTS lc_endpoint TYPE string VALUE 'http://open.mapquestapi.c om/geocoding/v1/address?key=kY8H9A3089EO2hzvH005UM4KZUQenUBd'.
CALL METHOD cl_http_client=>create_by_url EXPORTING
url = lc_endpoint
IMPORTING
client = lr_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc NE 0.
RETURN.
ENDIF.
lr_http_client->request
->set_method( if_http_request=>co_request_method_post ).
lr_http_client->request->if_http_entity~set_data( lv_body ).
lr_http_client->send(
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5 ).
CHECK sy-subrc EQ 0.
lr_http_client->receive(
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4 ).
<?sap.transform simple?>
<tt:transform xmlns:tt=
"http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary"
>
<tt:root name="BODY" type="ddic:ZCRMS_IB_MAPQUEST_BODY"/>
<tt:template> <object>
<object name="location" tt:ref=".BODY"> <str name="street" tt:value-ref="STREET"/> <str name="city" tt:value-ref="CITY"/>
<str name="postalCode" tt:value-ref="POST_CODE"/>
<str name="country" tt:value-ref="COUNTRY"/> <str name="state" tt:value-ref="STATE"/> </object>
<object name="options" tt:ref=".BODY">
<bool name="thumbMaps" tt:value="false" tt:option="format(b
oolean)"/>
<num name="maxResults" tt:value-ref="MAX_RESULTS"/>
METHOD /iwbep/if_mgw_appl_srv_runtime~create_entity.
DATA: lr_data_provider_class TYPE REF TO zl_crm_odata_data_rt.
IF iv_source_name IS NOT INITIAL AND it_key_tab IS NOT INITIAL.
lr_data_provider_class = get_data_provider_class( iv_source_nam
e ).
CHECK lr_data_provider_class>zif_crm_odata_rt_handler~check_aut
horization(
iv_source_name = iv_source_name
it_key_tab = it_key_tab
it_navigation_path = it_navigation_path
) = abap_true.
ENDIF.
lr_data_provider_class = get_data_provider_class( iv_entity_name
).
CALL METHOD lr_data_provider_class>/iwbep/if_mgw_appl_srv_runtime
~create_entity
EXPORTING
iv_entity_name = iv_entity_name
iv_entity_set_name = iv_entity_set_name
iv_source_name = iv_source_name
io_data_provider = io_data_provider
it_key_tab = it_key_tab
it_navigation_path = it_navigation_path
io_tech_request_context = io_tech_request_context
IMPORTING
er_entity = er_entity.
METHOD get_query_params.
CLEAR gv_entity_name.
gv_entity_name = iv_entity_name.
SELECT SINGLE query_obj result_obj
object_type
INTO (gv_query_obj,gv_result_obj,gv_object_type)
FROM zcrmc_ent_btq
WHERE entity EQ gv_entity_name.
IF sy-subrc NE 0.
CLEAR: gv_query_obj,gv_result_obj.
RETURN.
ENDIF.
SELECT SINGLE attr_struct INTO gv_query_struct FROM crmc_obj_btil
WHERE obj_il EQ gv_query_obj.
IF sy-subrc NE 0.
CLEAR gv_query_struct.
ENDIF.
SELECT SINGLE attr_struct INTO gv_result_struct FROM crmc_obj_btil
WHERE obj_il EQ gv_result_obj.
IF sy-subrc NE 0.
CLEAR gv_result_struct.
ENDIF.
METHOD zif_crm_odata_bt_read~set_sel_options_from_filter.
DATA ls_filter_select_option TYPE /iwbep/s_mgw_select_option.
DATA ls_property_map TYPE /iwbep/i_sbo_pr.
DATA ls_select_option TYPE /iwbep/s_cod_select_option.
DATA ls_genil_selection TYPE genilt_selection_parameter.¡ DATA lt_property_map TYPE TABLE OF /iwbep/i_sbo_pr.
DATA lt_components TYPE cl_abap_structdescr=>component_t
able.
DATA lr_structdesc TYPE REF TO cl_abap_structdescr.
CHECK it_filter_select_options IS NOT INITIAL.
SELECT *
INTO TABLE lt_property_map FROM /iwbep/i_sbo_pr
WHERE project EQ 'ZCRM_SERVICE'
AND parent_uuid EQ gv_node_uuid.
CHECK sy-subrc EQ 0.
lr_structdesc ?= cl_abap_structdescr=>describe_by_name( gv_query_s
truct ).
lt_components = lr_structdesc->get_components( ).
LOOP AT it_filter_select_options INTO ls_filter_select_option.
READ TABLE lt_property_map INTO ls_property_map
WITH KEY name = ls_filter_select_option-property.
CHECK sy-subrc EQ 0.
CASE ls_property_map-abap_field.
WHEN 'GUID'.
LOOP AT ls_filter_select_optionselect_options
INTO ls_select_option.
ls_genil_selection-attr_name = ls_property_map
-abap_field.
MOVE-CORRESPONDING
ls_select_option TO ls_genil_selection.
APPEND ls_genil_selection TO rt_selection_paramete
rs.
ENDLOOP.
WHEN OTHERS.
READ TABLE lt_components TRANSPORTING NO FIELDS
…
CALL METHOD lr_1o_search->get_result_guids
EXPORTING
iv_max_hits = lv_max_hits
IMPORTING
et_guid_list = et_order_guid
et_return = lt_return.
IF sy-subrc <> 0.
lr_msg_cont = /iwbep/if_mgw_conv_srv_runtime
~get_message_container( ).
LOOP AT lt_return INTO ls_return.
…
…
CALL FUNCTION 'CRM_BSP_OIC_1O_READ_FROM_RF'
EXPORTING
it_object_key = it_order_guid
iv_screen_structure_name = gv_result_struct
IMPORTING
et_screen_structure = <ft_order>.
IF <ft_order> IS INITIAL.
RETURN.
ENDIF.
DATA: lr_badi_calculate TYPE REF TO crm_badi_rf_q1o_calculate.
lv_obj_il = me->gv_query_obj.
TRANSLATE lv_obj_il TO UPPER CASE.
TRY.
GET BADI lr_badi_calculate
FILTERS
obj_il = lv_obj_il.
CATCH cx_badi_not_implemented cx_badi_multiply_implemented.
ENDTRY.
IF lr_badi_calculate IS BOUND.
TRY.
CALL BADI lr_badi_calculate->calculate
EXPORTING
iv_obj_il = lv_obj_il
iv_result_struct = gv_result_struct
IMPORTING
et_return = lt_return
CHANGING
ct_results = <ft_order>.
CATCH cx_sy_dyn_call_illegal_method.
ENDTRY.
ENDIF.
-METHOD /iwbep/if_mgw_appl_srv_runtime~get_entity.
…
READ TABLE it_key_tab INTO ls_key
WITH KEY name = 'Guid'.
CHECK sy-subrc EQ 0.
ls_filter-property = 'Guid'.
ls_option-low = ls_key-value.
ls_option-option = 'EQ'.
ls_option-sign = 'I'.
APPEND ls_option TO ls_filter-select_options.
APPEND ls_filter TO lt_filter.
CALL METHOD /iwbep/if_mgw_appl_srv_runtime~get_entityset
EXPORTING
iv_entity_name = iv_entity_name
iv_entity_set_name = iv_entity_set_name
iv_source_name = iv_source_name
it_filter_select_options = lt_filter
IMPORTING
er_entityset = lr_entityset.
ASSIGN lr_entityset->* TO <ft_entity>.
…
METHOD get_instance.
IF gr_self IS NOT BOUND.
CREATE OBJECT gr_self TYPE zl_odata_bt_api_adapter.
gr_self->mo_context ?= ir_context.
ENDIF.
gr_self->mo_context ?= ir_context.
rv_self ?= gr_self .
CHECK me->gt_input_fields IS NOT INITIAL.
CALL FUNCTION 'CRM_ORDER_MAINTAIN'
EXPORTING
it_activity_h = me->gt_activity_h
it_pricing = me->gt_pricing
it_pricing_i = me->gt_pricing_i
it_product_i = me->gt_product_i
it_text = me->gt_text
it_schedlin_i = me->gt_schedlin_i
it_partner = me->gt_partner
it_refobj = me->gt_refobj
it_status = me->gt_status
CHANGING
ct_orderadm_h = me->gt_orderadm_h
ct_orderadm_i = me->gt_orderadm_i
ct_input_fields = me->gt_input_fields
cv_log_handle = lv_loghandle
ct_doc_flow = me->gt_doc_flow
EXCEPTIONS
error_occurred = 1
document_locked = 2
no_change_allowed = 3
no_authority = 4
OTHERS = 5.
IF sy-subrc EQ 0.
LOOP AT gt_orderadm_h INTO ls_orderadm_h.
CALL FUNCTION 'CRM_MESSAGES_GET_LOG_INFO'
EXPORTING
iv_document_number = ls_orderadm_h-guid
IMPORTING
ev_log_handle = lv_loghandle
EXCEPTIONS
not_found = 1
METHOD zif_odata_api_adapter~save. …
READ TABLE gt_objects_to_save INTO lv_guid
INDEX 1.
IF sy-subrc NE 0.
RETURN.
ENDIF.
CALL FUNCTION 'CRM_ORDER_CHECK_BEFORE_SAVE_OW'
EXPORTING
iv_order_guid = lv_guid
EXCEPTIONS
save_cancelled = 1
OTHERS = 2.
IF sy-subrc EQ 0.
CALL FUNCTION 'CRM_ORDER_SAVE'
EXPORTING
it_objects_to_save = gt_objects_to_save
IMPORTING
et_saved_objects = lt_saved_objects
et_objects_not_saved = lt_objects_not_saved
EXCEPTIONS
document_not_saved = 1
OTHERS = 2.
IF sy-subrc EQ 0 AND lt_saved_objects IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
lr_msg_container = me->zif_odata_api_adapter~mo_context
->get_message_container( ).
lr_msg_container
->add_message_text_only( iv_is_leading_message = 'X'
iv_msg_type = 'E'
iv_msg_text = 'No se han producido cambios en el documento'
iv_add_to_response_header = abap_true ).
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
message_container = lr_msg_container.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception.
ENDIF.
METHOD /iwbep/if_mgw_appl_srv_runtime~create_entity.
DATA lr_bt_api TYPE REF TO zif_odata_api_adapter.
lr_bt_api ?= zl_odata_bt_api_adapter=>get_instance( mo_context
).
map_to_api( EXPORTING io_data_provider = io_data_provider
CHANGING cr_api = lr_bt_api
cr_entity = er_entity ).
IF zl_odata_bt_api_adapter=>zif_odata_api_adapter~is_batch( ) E
Q abap_false.
lr_bt_api->create_entity( ).
lr_bt_api->save( ).
ENDIF.
METHOD map_to_api.
DATA ls_refobj TYPE crmt_refobj_com.
DATA ls_orderadm_i TYPE crmt_orderadm_i_com.
DATA ls_pricing_i TYPE crmt_pricing_i_com.
DATA ls_schedlin_i TYPE crmt_schedlin_i_com.
DATA ls_product_i TYPE crmt_product_i_com.
DATA ls_item TYPE zcrmt_bt_odata_item.
DATA lr_api_adapter TYPE REF TO zl_odata_bt_api_adapter.
DATA lt_input_field TYPE crmt_input_field_tab.
io_data_provider
->read_entry_data( IMPORTING es_data = ls_item ).
lr_api_adapter ?= cr_api.
me->create_item( IMPORTING es_orderadm_i = ls_orderadm_i
es_pricing_i = ls_pricing_i
es_product_i = ls_product_i
es_schedlin_i = ls_schedlin_i
et_input_field = lt_input_field
CHANGING cs_item = ls_item ).
CALL METHOD me->/iwbep/if_mgw_conv_srv_runtime~copy_data_to_ref
EXPORTING
is_data = ls_item
CHANGING
cr_data = cr_entity.
.
INSERT ls_orderadm_i INTO TABLE lr_api_adapter->gt_orderadm_i.
INSERT ls_pricing_i INTO TABLE lr_api_adapter->gt_pricing_i.
INSERT ls_product_i INTO TABLE lr_api_adapter->gt_product_i.
INSERT ls_schedlin_i INTO TABLE lr_api_adapter->gt_schedlin_i.
INSERT LINES OF lt_input_field
INTO TABLE lr_api_adapter->gt_input_fields.
METHOD /iwbep/if_mgw_core_srv_runtime~changeset_begin.
DATA lr_api_adapter TYPE REF TO zl_odata_bt_api_adapter.
zl_odata_bt_api_adapter=>zif_odata_api_adapter~set_mode( abap_tr
ue ).
lr_api_adapter = zl_odata_bt_api_adapter=>get_instance( mo_cont
ext ).
lr_api_adapter->zif_odata_api_adapter~reset_buffer( ).
ENDMETHOD.
METHOD /iwbep/if_mgw_core_srv_runtime~changeset_end.
DATA lr_api_adapter TYPE REF TO zl_odata_bt_api_adapter.
DATA lr_exception TYPE REF TO /iwbep/cx_mgw_busi_exception.
zl_odata_bt_api_adapter=>zif_odata_api_adapter~set_mode( abap_f
alse ).
lr_api_adapter = zl_odata_bt_api_adapter=>get_instance( mo_cont
ext ).
TRY.
lr_api_adapter->zif_odata_api_adapter~create_entity( ).
lr_api_adapter->zif_odata_api_adapter~save( ).
CATCH /iwbep/cx_mgw_busi_exception INTO lr_exception.
DATA lr_msg_cont TYPE REF TO /iwbep/if_message_c
ontainer.
lr_msg_cont = /iwbep/if_mgw_conv_srv_runtime~get_message_co
ntainer( ).
CALL METHOD lr_msg_cont->add_message
EXPORTING
iv_msg_type = sy-msgty
iv_msg_id = sy-msgid
iv_msg_number = sy-msgno
iv_msg_v1 = sy-msgv1
iv_msg_v2 = sy-msgv2
iv_msg_v3 = sy-msgv3
iv_msg_v4 = sy-msgv4
iv_is_leading_message = abap_true.
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
message_container = lr_msg_cont.
ENDTRY.
Implementación
Servicio Web
Publicación
Servicio Web
Crear aplicación
a partir de
-<mvc:View controllerName="com.hormigo.david.service.service_order.ServiceOrde r.controller.Worklist" xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc" xmlns:semantic="sap.f.semantic" xmlns:footerbar="sap.ushell.ui.footerbar"> <semantic:SemanticPage id="idWLPage" headerPinnable="false" toggleHeaderOnTitleClick="false"> <semantic:titleHeading> <Title text="{i18n>worklistTitle}"/> </semantic:titleHeading> <semantic:content> <IconTabBar id="iconTabBar" select="onQuickFilter" expandable="false" headerBackgroundDesign="Transparent"> <items>
<IconTabFilter key="all" showAll="true" count="{worklistView>/count}" text="Peticiones"/> <IconTabSeparator/> <IconTabFilter key="lowPriority" icon="sap-icon://message-success" iconColor="Positive" count="{worklistView>/lowCount}" text="{i18n>worklistFilterLow}"/> <IconTabFilter key="mediumPriority" icon="sap-icon://message-warning" iconColor="Critical" count="{worklistView>/mediumCount}" text="{i18n>worklistFilterMedium}"/> <IconTabFilter key="highPriority" icon="sap-icon://message-error" iconColor="Negative" count="{worklistView>/highCount}" text="{i18n>worklistFilterHigh}"/> </items> <content>
<Table id="table" width="auto"
items="{ path: '/ServiceOrders', sorter: { path: 'Description', descending: false } }"
…
<sections>
-<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core"> <Table id="idPartnersTable" inset="false" items="{Partners}">
], function (BaseController, JSONModel, History, formatter, Filter, FilterOperator) { "use strict"; return BaseController.extend("com.hormigo.david.service.ServiceConfirmatio n.controller.Worklist", { formatter: formatter, onInit: function () { var oViewModel,
iOriginalBusyDelay,
<core:View controllerName="com.hormigo.david.service.service_order.ServiceOrder .controller.Object" xmlns:core="sap.ui.core" xmlns="sap.uxap" xmlns:layout="sap.ui.layout" xmlns:m="sap.m" xmlns:semantic="sap.f.semantic"> <ObjectPageLayout upperCaseAnchorBar="false" useIconTabBar="false" id="idObject" showFooter="{objectView>/editable}" enableLazyLoading="false" subSectionLayout="TitleOnTop" showTitleInHeaderContent="true" showEditHeaderButton="false" busy="{objectView>/busy}" busyIndicatorDelay="{objectView>/delay}"> <headerTitle> <ObjectPageHeader objectTitle="{Description}" objectSubtitle="{ObjectId}" isObjectIconAlwaysVisible="false" isObjectTitleAlwaysVisible="false" isObjectSubtitleAlwaysVisible="false"> <actions> <ObjectPageHeaderActionButton id="idEditBtn" press="onEdit" text="{i18n>btnEditSrvOrder}" type="Emphasized" hideText="false"/> … …
onConfirm: function (oEvent) {
oEvent.getSource().setEnabled(false); var oView = this.getView();
var that = this;
var oModel = oView.getModel();
var oViewContext = oView.getBindingContext();
oModel.setProperty("UserStatusId", "E0002", oViewContext); oModel.submitChanges({
success: this._createConfirmation.bind(that) });
{ "_version": "1.9.0", "sap.app": { "id": "com.hormigo.david.service.ServiceOrder", "type": "application", "i18n": "i18n/i18n.properties", "title": "{{appTitle}}", "description": "{{appDescription}}", "applicationVersion": { "version": "1.0.0" }, "resources": "resources.json", "dataSources": { "mainService": { "uri": "/sap/opu/odata/sap/ZCRM_SERVICE_SRV/", "type": "OData", "settings": { "odataVersion": "2.0", "localUri": "localService/metadata.xml" } } }, … sap.ui.define([ "sap/ui/core/UIComponent", "sap/ui/Device", "./model/models", "./controller/ErrorHandler"
], function (UIComponent, Device, models, ErrorHandler) { "use strict"; return UIComponent.extend("com.hormigo.david.service.service_order.Service Order.Component", { metadata: { manifest: "json" },
init: function () {
<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core"> <Label text="Instalación" labelFor="ibaseRefText"/>
<Link id="ibaseRefText" text="{RefIBaseDescription}" press="onIBasePress"/>
onIBasePress: function (oEvent) {
var oView = this.getView();
var oObject = oView.getBindingContext().getObject(); var sObjectId = oObject.RefIBase;
this.fGetService = sap.ushell && sap.ushell.Container && sap.ushell.Container.getService;
_onMasterMatched: function () {
var oStartupParameters =
this.getOwnerComponent().getComponentData().startupParameters;
this.getOwnerComponent().oListSelector.oWhenListLoadingIsDo ne.then(
function (mParams) { var sObjectId = "";
if (mParams.list.getMode() === "None") { return;
}
if (oStartupParameters.IBaseId && oStartupParameters.IBaseId[0]) {
sObjectId = oStartupParameters.IBaseId[0]; }
else {
sObjectId = mParams.firstListitem
.getBindingContext().getProperty("Id"); } this.getRouter().navTo("object", { objectId: sObjectId }, true); }.bind(this),
function (mParams) {
<core:FragmentDefinition xmlns="sap.m" xmlns:f="sap.ui.layout.form" xmlns:core="sap.ui.core" xmlns:vbm="sap.ui.vbm">
<vbm:GeoMap id="IBPositionMap" initialZoom="9" width="100%"
centerPosition="{parts:[{path:'Latitute'},{path:'Longitude'}] ,formatter:'.formatter.latitudeLongitude'}"> <vbm:vos> <vbm:Spots> <vbm:items> <vbm:Spot position="{parts:[{path:'Latitute'},{path:'Longitude'}],formatter:' .formatter.latitudeLongitude'}"/> </vbm:items> </vbm:Spots> </vbm:vos> </vbm:GeoMap> </core:FragmentDefinition>
onInit: function () {
var oViewModel = new JSONModel({ busy: false, delay: 0,
lineItemListTitle:
this.getResourceBundle().getText("detailLineItemTableHeading") });
var oMap = this.getView().byId("IBPositionMap");
var oMapConfig = { "MapProvider": [{
"name": "openStreetMap", "type": "",
"description": "Localización instalación", "tileX": "256",
"tileY": "256", "MinLOD": 3, "MaxLOD": 18,
"copyright": "Copyright Info: Tiles Courtesy of MapQuest © OpenStreetMap under ODbL v1.0",
_bindView: function (sObjectPath) { …
var sAddressPath = sObjectPath + '/Address';
var addressForm = this.getView().byId("SimpleFormAddress"); var oMap = this.getView().byId("IBPositionMap");
addressForm.bindElement(sAddressPath); oMap.bindElement(sAddressPath);
…
onEdit: function (oEvent) {
var oViewModel = this.getModel("objectView"); var bState = oViewModel.getProperty("/editable"); oEvent.getSource().setEnabled(false);
oViewModel.setProperty("/editable", !bState); oViewModel.setProperty("/tableMode", "Delete"); },
…
onInit: function () {
var iOriginalBusyDelay,
oViewModel = new JSONModel({ busy: true, delay: 0, editable: false, tableMode: "None" }); this.getRouter().getRoute("object").attachPatternMatched(this ._onObjectMatched,this);
iOriginalBusyDelay = this.getView().getBusyIndicatorDelay(); this.setModel(oViewModel, "objectView");
…
<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core" xmlns:f="sap.ui.layout.form">
<f:SimpleForm id="SimpleFormDisplayHeader"
editable="{viewModel>/editable}" layout="ResponsiveGridLayout" singleContainerFullSize="false"
labelSpanXL="3" labelSpanL="3" labelSpanM="3" labelSpanS="12" adjustLabelSpan="false" emptySpanXL="4" emptySpanL="4" emptySpanM="4"
<core:View
controllerName="com.hormigo.david.service.service_order.ServiceOrder .controller.Object" xmlns:core="sap.ui.core" xmlns="sap.uxap"
xmlns:layout="sap.ui.layout" xmlns:m="sap.m" xmlns:semantic="sap.f.semantic"> <ObjectPageLayout upperCaseAnchorBar="false" useIconTabBar="false" id="idObject" showFooter="{objectView>/editable}" enableLazyLoading="false" subSectionLayout="TitleOnTop" showTitleInHeaderContent="true" showEditHeaderButton="false" busy="{objectView>/busy}" busyIndicatorDelay="{objectView>/delay}"> <headerTitle> <ObjectPageHeader objectTitle="{Description}" objectSubtitle="{ObjectId}" isObjectIconAlwaysVisible="false" isObjectTitleAlwaysVisible="false" isObjectSubtitleAlwaysVisible="false"> <actions> <ObjectPageHeaderActionButton id="idEditBtn" press="onEdit" text="{i18n>btnEditSrvOrder}" type="Emphasized" hideText="false"/>
…
…
onAccept: function (oEvent) {
var oViewModel = this.getModel("objectView"); // @type {sap.ui.model.odata.v2.ODataModel} var oModel = this.getModel();
var that = this;
if (oModel.hasPendingChanges() || this._bDeleteRequest) { oViewModel.setProperty("/busy", true);
oModel.attachEventOnce("batchRequestCompleted", function (event) {
if (that._checkIfBatchRequestSucceeded(event)) { that._onBatchSuccess();
} else {
that._onBatchError(); }
});