Как обновить данные в backend системе из SAPUI5 приложения?

Как обновить данные в backend системе, используя SAPUI5 приложение?

Согласно статистическим данным, в проектной деятельности у SAP консультантов и разработчиков наличествует мало запросов на создание приложений с применением технологии SAPUI5, где требуется только вывести информацию из backend системы.

См. заметку Создание Web приложения с помощью фреймворка SAPUI5 (8)

Бизнес-пользователь заинтересован в максимальном погружении в процесс работы с данными, которые выводятся на frontend. Все, что будет им (пользователем) изменено/удалено/создано/проанализировано(!), впоследствии, должно найти место в отражении результатов работы какого-то отчета, или стать основой для смежного бизнес-процесса.

Задача

Рассмотреть простой пример, в котором выполняется обновление данных пользовательской таблицы в backend системе, содержимое которой визуализировано посредством SAPUI5 приложения.

Исходные данные

Пользовательская таблица с каким-то набором данных

OData сервис, заполняющий EntitySet с наименование Person

SAPUI5 приложение, которое отражает наполнение пользовательской таблицы

Изменение данных. Шаг 1 (frontend)

По моей задумке, пользователь может внести изменения для какой-то записи таблицы, если нажмет на иконку карандаша. По нажатию на иконку открывается фрагмент с информацией о записи из общей таблицы, которую пользователь впоследствии и меняет.

См. class sap.ui.core.Fragment

Функция, открывающая фрагмент из контроллера приложения

openEditDialog: function(oEvent) {
            var oView = this.getView();
            var oSelectedItem = oEvent.getSource();
            var oContext = oSelectedItem.getBindingContext("person");
            var sPath = oContext.getPath();
            var oView = this.getView();
 
            if (!this._oDialog) {
                Fragment.load({
                    id: "EditFr2",
                    name: "com.app10.view.EditFragment",
                    controller: this
                }).then(function(oDialog) {
                    this._oDialog = oDialog;
                    oView.addDependent(oDialog);
 
                    oDialog.bindElement({
                        path: sPath,
                        model: "person"
                    });
 
                    oDialog.open();
 
                }.bind(this));
            } else {
                this._oDialog.bindElement({
                    path: sPath,
                    model: "person"
                });
                this._oDialog.open();
            }
        }

Исходный код открываемого фрагмента

<core:FragmentDefinition xmlns:l="sap.ui.layout"
xmlns:f="sap.ui.layout.form" xmlns:mvc="sap.ui.core.mvc" xmlns:core="sap.ui.core"
    xmlns="sap.m">
    <Dialog id="idEditDialog" title="">
        <f:SimpleForm editable="true">
            <f:content>
                <VBox class="sapUiSmallMargin">
                    <Input value="{person>Id}" id="idPerson" editable="false"/>
                    <Input value="{person>ZzfirstName}" id="idfName"/>
                    <Input value="{person>ZzlastName}" id="idlName"></Input>
                    <CheckBox text="Active" selected="{person>Active}" id="idChB"></CheckBox>
                </VBox>
            </f:content>
        </f:SimpleForm>
        <FlexBox alignItems="Center">
            <Button type="Accept" icon="sap-icon://refresh" press="onUpdate" text="Update"/>
            <Button icon="sap-icon://decline" press="onCloseDialog" text="Close" type="Reject"/>
        </FlexBox>
    </Dialog>
</core:FragmentDefinition>

Пользователь вносит изменения для выбранной записи и нажимает на кнопку обновления данных. На ниже представленном видеофрагменте функциональность обновления пока недоступна.

Изменение данных. Шаг 2 (backend)

Также необходимо добавить возможность обработки измененных на frontend-e данных, но уже на стороне принимающей системы (backend), коей в моем случае неизменно выступает SAP Netweaver.

В OData сервисе необходимо переопределить метод *UPDATE_ENTITY

Добавить в него, в моем случае, глазки разъедающий ABAP код

См. Service Implementation
METHOD personset_update_entity.
 
    DATA: ls_entity     TYPE zcl_zodata_app_10_mpc=>ts_person,
          ls_key_value  TYPE zcl_zodata_app_10_mpc=>ts_person,
          ls_app_table1 TYPE zapp_table1.
 
    io_data_provider->read_entry_data( IMPORTING es_data = ls_entity ).
    io_tech_request_context->get_converted_keys( IMPORTING es_key_values = ls_key_value ).
 
    SELECT * FROM zapp_table1 INTO ls_app_table1 WHERE  id = ls_key_value.
      ls_app_table1-zzfirst_name = ls_entity-zzfirst_name.
      ls_app_table1-zzlast_name = ls_entity-zzlast_name.
      ls_app_table1-active = ls_entity-active.
      ls_app_table1-zz_login = sy-uname.
      MODIFY zapp_table1 FROM ls_app_table1.
      IF sy-subrc NE 0.
        "raise exception
      ENDIF.
 
    ENDSELECT.
 
    er_entity = ls_entity.
 

Проверяю, что вновь определенный метод может обновить данные в таблице

Изменение данных. Шаг 3 (frontend)

Осталось отправить в backend обновленные данные из SAPUI5 приложения. Для этого необходимо определить событие, вызываемое по нажатию на кнопку Обновить. Код самого события необходимо добавить в контроллер приложения

См. class sap.ui.model.odata.v2.ODataModel
onUpdate: function() {
           
            var oEntry = {};
            oEntry.Id = sap.ui.core.Fragment.byId("EditFr2", "idPerson").getValue();
            oEntry.ZzfirstName = sap.ui.core.Fragment.byId("EditFr2", "idfName").getValue();
            oEntry.ZzlastName = sap.ui.core.Fragment.byId("EditFr2", "idlName").getValue();
            oEntry.Active = sap.ui.core.Fragment.byId("EditFr2", "idChB").getSelected();
           
            var sUrl = "/sap/opu/odata/SAP/ZODATA_APP_10_SRV/";
   
            var oModel = new sap.ui.model.odata.v2.ODataModel(sUrl);
            oModel.update("/PersonSet('" + oEntry.Id + "')", oEntry, {
                success: function(){MessageToast.show(" Entry was successfully updated");},
                error: function(oError){ if(oError) {MessageToast.show("Entry was not updated");}}
            }
            );
        }

Тестирование

Аналогичные действия под другим пользователем