【问题标题】:SAPUI5: create deep entity without deep structureSAPUI5:创建没有深层结构的深层实体
【发布时间】:2020-07-29 09:17:31
【问题描述】:

我想一步将一定数量的存储单元从 WebIDE 传递到 SAP。我需要 SAP 的 CREATE_ENTITY 方法中的所有存储单元(CREATE_ENTITY 或 CREATE_DEEP_ENTITY 还是...?),因为我必须对一些值进行比较。

我尝试了一个批处理请求。这不起作用,因为为每个存储单元调用了 CREATE_ENTITY 方法。所以每次调用我只能访问一个存储单元。

我还搜索了有关 deep_entities 的教程。但我只发现一些具有深层结构(头部 - 项目)。但是我有一个平面结构(键:存储单元)并且想将它作为表/数组传递给我的“CREATE_ENTITY”方法。在 SAPUI5 中应该可以做到这一点。

作为解决方法,我可以将所有存储单元传递给一个字符串并将其传递给 CREATE_ENTITY 方法。但这对我来说似乎很业余。

非常感谢和最好的问候

朱莉娅

更新 31.07.20

这是我如何调用 CREATE 方法:

´´´

    onStartVert: function () {
        // TAs zum i-Punkt quittieren & Check ob bereits 
        // TA vom i-Punkt zum VKL angelegt ist, dann 
        // Meldung ausgeben, sonst TA anlegen
        // oData Methode create aufrufen und Tabelle übergeben
        // LenumIPunkt

        // this.getModel().setUseBatch(true);

        // var aDeferredGroup = this.getModel().getDeferredGroups();
        // aDeferredGroup.push("lenum");
        // this.getModel().setDeferredGroups(aDeferredGroup);

        //Create Parameters
        // var oParameters = {
        //  groupId: "lenum"
        // };

        //  31.07.20  this.getModel().setUseBatch(true);

        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;
            //  31.07.20    this.getModel().create("/LenumIPunktSet", { lenum: sLenum } ,oParameters);
            this.getModel().create("/LenumIPunktSet", {
                lenum: sLenum
            });
        }

        //Submit the Changes based on the groupId(doSomething)
        this.getModel().submitChanges({
            //groupId: "lenum"
        });

        //  31.07.20    this.getModel().setUseBatch(false);

        // 2. View aufrufen
        this.getRouter().navTo("iPunkt02");
    },

The signature for the CHANGESET_PROCESS method is:

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

So by now there is no table IT_CHANGESET_REQUEST available.
My entity type has only this one field (lenum) I need as key.

Many thanks again

【问题讨论】:

    标签: javascript odata sapui5


    【解决方案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.
    
    

    有关详细信息,请参阅this blog

    【讨论】:

    • 非常感谢。我会试试这个。
    • 谢谢您的回答。我实现了这些方法,但似乎在方法“changeset_process”中我只有一个可用的更改表“it_changeset_data”。而这个是空的。你知道我做了什么吗?
    • 如何在前端触发CREATE?你能更新你的问题吗?如果一切设置正确,那么每个创建调用都将被捆绑到一个 $batch 请求中(您可以在网络选项卡中看到这一点)。然后在后端it_changeset_request 应该包含所有创建(或更新或删除)的实体。
    • 对不起,上面的评论有一点错误,我不能再改了:在方法/iwbep/if_mgw_core_srv_runtime~changeset_process是一个更改表CT_CHANGESET_DATA 。当我在调试器中查看它时,这个是空的。我没有找到很多关于这张桌子的信息。只有it_changeset_request,但这个不能作为导入或更改参数。
    • 啊,我明白你的问题了。是的,changeset_process 存在两次。首先来自接口/IWBEP/IF_MGW_APPL_SRV_RUNTIME。第二个来自接口/IWBEP/IF_MGW_CORE_SRV_RUNTIME。使用 first 一个(如我的回答所示)。它将包含导入参数。对于changeset_beginchangeset_process,也使用第一个
    最近更新 更多