Я хочу передать количество единиц хранения за один шаг. Мне нужны все единицы хранения одновременно в методе CREATE_ENTITY в моей реализации службы OData (CREATE_ENTITY, или CREATE_DEEP_ENTITY, или...?), потому что мне нужно провести сравнение некоторых ценности.

Я попробовал пакетный запрос. Это не работает, потому что метод CREATE_ENTITY вызывался для каждой единицы хранения. Таким образом, я мог получить доступ только к одной единице хранения в каждом вызове.

Я также искал руководства по deep_entities. Но я нахожу только некоторые с глубокими структурами (голова - предметы). Но у меня плоская структура (ключ: единица хранения), и я хочу передать ее как таблицу/массив моему методу CREATE_ENTITY. Это должно быть возможно сделать в SAPUI5.

В качестве обходного пути я мог бы передать все единицы хранения в строку и передать ее методу CREATE_ENTITY. Но мне это кажется довольно дилетантским.

Вот как я вызываю метод CREATE:

onStartVert: function () {
    this.oContext = this.getModel().createEntry("/LenumIPunktSet", {
        success: this._successSave.bind(this),
        error: this._errorSave.bind(this)
    });
    var oBindingPath = {
        path: this.oContext.getPath()
    };
    this.getView().bindObject(oBindingPath);
    var sLenum;
    for (var i = 0; i < this._data.LePool.length; i++) {
        sLenum = this._data.LePool[i].lenum;
        this.getModel().create("/LenumIPunktSet", {
            lenum: sLenum
        });
    }
    this.getModel().submitChanges();
    this.getRouter().navTo("iPunkt02");
},

Сигнатура для метода CHANGESET_PROCESS:

CT_CHANGESET_DATA   TYPE /IWBEP/IF_MGW_CORE_SRV_RUNTIME=>TY_T_CHANGESET_DATA    
/IWBEP/CX_MGW_BUSI_EXCEPTION        Business Exception
/IWBEP/CX_MGW_TECH_EXCEPTION        Technical Exception

Итак, на данный момент нет доступной таблицы IT_CHANGESET_REQUEST. Мой тип объекта имеет только одно поле (lenum), которое мне нужно в качестве ключа.

0
Julia 29 Июл 2020 в 12:17

1 ответ

Лучший ответ

Ключ - реализовать набор изменений.

В вашем DPC_EXT переопределите следующие три метода:


Метод CHANGESET_BEGIN активирует пакетную обработку.

METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_begin.
    cv_defer_mode = 'X'.
ENDMETHOD.
METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_end.
* empty
ENDMETHOD. 

Метод changeset_process будет содержать логику. it_changeset_request содержит все объекты, которые являются частью этого пакетного запроса.

METHOD /iwbep/if_mgw_appl_srv_runtime~changeset_process.
    LOOP AT it_changeset_request ASSIGNING FIELD-SYMBOL(<fs_changeset_request>).
        " <fs_changeset_request>-request_context->get_request_details( ) << which entity is it?
        " <fs_changeset_request>-operation_type << is it CREATE, UPDATE or DELETE?
        " <fs_changeset_request>-entry_provider->read_entry_data( ... ) << read entity into structure
    ENDLOOP.
ENDMETHOD.

См. в этом блоге .

1
Marc 30 Июл 2020 в 09:45
Большое спасибо. Я попробую это.
 – 
Julia
30 Июл 2020 в 15:47
Спасибо за ваш ответ. Я реализовал эти методы, но кажется, что в методе "changeset_process" I доступна только таблица изменения "it_changeset_data". А этот пустой. Ты хоть представляешь, что я наделал?
 – 
Julia
31 Июл 2020 в 13:42
Как вы запускаете CREATE во внешнем интерфейсе? Можете ли вы обновить свой вопрос? Если все настроено правильно, то каждый вызов создания будет объединен в один пакетный запрос $ (это можно увидеть на вкладке сети). Затем в бэкенде it_changeset_request должны содержаться все созданные (или обновленные, или удаленные) сущности.
 – 
Marc
31 Июл 2020 в 14:14
Извините, в комментарии выше есть небольшая ошибка, и я больше не могу его изменить: В методе /iwbep/if_mgw_core_srv_runtime~changeset_process есть изменяемая таблица CT_CHANGESET_DATA . И этот пустой, когда я смотрю на него в отладчике. Я не нахожу много информации об этой таблице. Только it_changeset_request, но он недоступен для импорта или изменения параметра.
 – 
Julia
31 Июл 2020 в 14:16
Ах, я вижу вашу проблему. Да, changeset_process существует дважды. Сначала с интерфейса /IWBEP/IF_MGW_APPL_SRV_RUNTIME. Второй от интерфейса /IWBEP/IF_MGW_CORE_SRV_RUNTIME. Используйте первый (как видно из моего ответа). Он будет содержать параметры импорта. Также используйте первый для changeset_begin и changeset_process.
 – 
Marc
31 Июл 2020 в 14:21