加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

如何在SAP Gateway中实现CREATE_DEEP_ENTITY

(2017-12-03 17:13:27)
标签:

create_deep_entity

分类: SAP_Gateway

标题中出现的CREATE_DEEP_ENTITY指XXX_DPC_EXT类中的继承方法名称,这个方法的主要用途是针对非扁平数据结构,即纵深数据结构进行数据的创建,修改,删除等。例如,对采购订单(PO)的抬头数据和行项目数据同时做创建,更新或者删除操作,此场景下,就需要对CREATE_DEEP_ENTITY方法进行重定义以实现对纵深结构数据的创建。

1.前提条件

1.1 能偶使用SEGW创建实体类型;

1.2 能够注册服务;

1.3 编写JavaScript代码调用后端发布的OData服务;

1.4 阅读历史文章;

a) 如何在SAP Gateway中通过导入DDIC结构创建简单实体类型【Entity Type】
b) 如何在SAP Gateway中注册OData服务
c) 如何在SAP Gateway中创建关联实体类型【Association Entity Type】

2. SE11创建如下抬头和行项目参考结构

2.1 Header结构

http://s1/mw690/0034z1Idzy7gi63uY7Kd0&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

2.2 Items结构

http://s7/mw690/0034z1Idzy7gi65eG6ac6&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

3. 使用SEGW创建实体类型Header,Item,HeaderToItems并生成运行对象

3.1 Header

http://s11/mw690/0034z1Idzy7gi66i80qca&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

3.2 Items

http://s9/mw690/0034z1Idzy7gi6blgJaf8&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

3.3 关联实体类型HeaderToItems

http://s10/mw690/0034z1Idzy7gi6ciWuZ59&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />
http://s15/mw690/0034z1Idzy7gi6debJc3e&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

3.4 生成运行对象

http://s13/mw690/0034z1Idzy7gi6e3vFW2c&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

4. 注册OData服务

http://s5/mw690/0034z1Idzy7gi6fBQ8s64&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

5. 对XXX_MPC_EXT类做如下修改

5.1 创建纵深结构复杂类型

http://s7/mw690/0034z1Idzy7gi6gOTkif6&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

5.2 纵深结构中定义的Item名称必须与ItemsSet完全相同,即上图中itemsset必须与下图标记中的实体集合名称完全一样,ABAP代码中不区分大小写。

http://s5/mw690/0034z1Idzy7gi6ih9Mo34&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

5.3 重定义XXX_MPC_EXT~DEFINE方法,编写如下ABAP代码为Header实体类型设置之前新定义的纵深结构。

http://s16/mw690/0034z1Idzy7gi6kGGvBff&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

6. 对XXX_DPC_EXT类做如下修改

6.1 重定义XXX_DPC_EXT~CREATE_DEEP_ENTITY方法

a) 获得前段传输到后端的数据;
b) 进行数据处理【创建,修改或者删除】;
c) 将处理完的数据返回前端;

http://s1/mw690/0034z1Idzy7gi6lJL3y40&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

ABAP源码

METHOD /iwbep/if_mgw_appl_srv_runtime~create_deep_entity.
    DATA: ls_deep_entity TYPE zcl_zdemo_deep_mpc_ext=>ty_header_items,
          ls_header      TYPE zsdeep_header,
          lt_items       TYPE TABLE OF zsdeep_items.

    FIELD-SYMBOLS: LIKE LINE OF lt_items.

    io_data_provider->read_entry_data(
      IMPORTING
         es_data = ls_deep_entity ).

*Data-action here****************
    LOOP AT ls_deep_entity-itemsset ASSIGNING .
      -item_no = -item_no + 10.
      CONDENSE -item_no NO-GAPS.
    ENDLOOP.
*Data-action here****************

    copy_data_to_ref( EXPORTING  is_data = ls_deep_entity CHANGING cr_data = er_deep_entity ).

    CLEAR ls_deep_entity.
  ENDMETHOD.

7. 编写前端JavaScript代码调用CREATE_DEEP_ENTITY

假设我们传入的纵深数据为

{
Id:"10001",
ItemsSet:[{Id:"10001",ItemNo:"10"},
                {Id:"10001",ItemNo:"20"}]
}

即抬头数据Id=10001,当前此单号包含两个行项目“10”,“20”.

http://s2/mw690/0034z1Idzy7gi6rFYWt41&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

而ODataModel.create方法的第一个参数"/HeaderSet"为SEGW中我们创建的Header实体集合名称,请见下图

http://s2/mw690/0034z1Idzy7gi6t2tsBe1&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

8.在后端CREATE_DEEP_ENTITY设置外部断点.调试界面如下

http://s3/mw690/0034z1Idzy7gi6uZqca12&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

获得前端传递数据-抬头数据10001

http://s1/mw690/0034z1Idzy7gi6wMAFOf0&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

行项目数据{10001,10},{10001,20}

http://s6/mw690/0034z1Idzy7gi6yxAihd5&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

9.在前端设置断点,观察后端返回的数据

在后端的处理数据部分,我仅仅是简简单单的将每个行项目的行项目数值+10,所以我们预期得到的后端返回行项目数据为{10001,20},{10001,30}

http://s4/mw690/0034z1Idzy7gi6BqcaT13&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

oData为前端Create方法用以接收后端返回的数据内容

http://s13/mw690/0034z1Idzy7gi6CZMjWcc&690Gateway中实现CREATE_DEEP_ENTITY" TITLE="如何在SAP Gateway中实现CREATE_DEEP_ENTITY" />

由上图可以看出,行项目数据已经被分别更新为{10001,20}和{10001,30}.

 

本人所使用的SAPUI5开发IDE为SAP Web IDE个人版,以前也使用过Eclipse和HANA Studio作为SAPUI5的开发工具。至于使用哪种IDE开发SAPUI5程序,就个人使用习惯而定。后续会更新关于如何使用安装并使用SAP Web IDE开发SAPUI5应用的文章。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有