为采购收货创建CDS并生成ODATA

经过各种折腾,现在终于把我的采购收货的FIORI APP做成功,测试正常,并发布到了我的SAP 服务器的Gateway上面,配置好了FioriLaunchpad后台配置,可正常访问,手机,电脑上测试都还正常,在手机中用IE打开,感觉效果挺好的,可以进行测试一下试试。

访问地址:https://flt.tpddns.net:44300/sap/bc/ui5_ui5/ui2/ushell/shells/abap/FioriLaunchpad.html?sap-client=100&sap-language=ZH#ZGR_MIGO-display

为采购收货创建CDS并生成ODATA - 第1张  | 优通SAP

账号: ZTEST01
密码:Ut163.com

测试时可以使用4500000700左右的订单,可能数据要完整些,其它的可能不一定能收货。

在这里主要介绍SAPUI5使用的SAP后台ODATA的源码,此ODATA主要使用CDS创建,其它SAPUI5源码参看这里。

1.创建CDS

HANA Studio上创建CDS上创建需要登陆的CDS,设想是从创建订单的按计划收货行EKET汇总出计划收货数量、已收货数据,所以第一步的CDS:ZMM_B_GR_EKET先取出需要收货的EKET数据。

第二个CDS按收货计划汇总到采购项目,生成明细行的CDS:ZMM_B_GR_EKPO

第三个CDS才是为前台最后使用的ODATA的CDS,取出相关前台需要用的数据信息。

  • 1.在此CDS中使用了:createEnabled: true,updateEnabled: true,原来设想是在CDS的POST,PUT方法中写确认收货的功能,但后面发现实现起来不是那么好,所以此功能没使用,此参数也就可以去除。
  • 2.此CDS没有使用@OData.publish: true参数,所以此CDS没有直接生成ODATA所以需要在后面在SEGW中引用此CDS生成ODATA。

2.在SEGW中使用CDS

在事务码SEGW中使用已有的ODATA项目(也可以创建自己的新的ODATA项目),增加引用前面定义的CDS:ZMM_C_POEKPO2,更多学习可参考这里

为采购收货创建CDS并生成ODATA - 第2张  | 优通SAP

引用完成后记得要生成生成一下ODATA,生成完成后在测试时就能得到可收货贩采购订单明细数据了。

3.写采购收货功能函数

在SEGW中增加一个Function Imports,用于用户点收货时,执行GR的MIGO操作。

3.1.1.创建返回结构

SE11先创建一个结构,用于收货函数返回结果使用,并在SEGW中使用此结果生成Entity Types,如图

为采购收货创建CDS并生成ODATA - 第3张  | 优通SAP
为采购收货创建CDS并生成ODATA - 第4张  | 优通SAP

3.2.2.SEGW创建函数引用

在SEGW中创建一个Function Import,名为:ZFM_GR_MIGO,此名字可以自己随便时,后在后面函数中会使用到,其实这并不是真实的SAP函数名。并使用一个Function Import Parameters,名为data1,此名字在后面的函数及SAPUI5中会使用到。

为采购收货创建CDS并生成ODATA - 第5张  | 优通SAP
为采购收货创建CDS并生成ODATA - 第6张  | 优通SAP
  • 在此定义Return type中使用前面定义的ZGR_RETURN,
  • HTTP Method Type 使用GET ,这里也能使用POST,此值在SAPUI5调用时会需要使用要相同的方法,便我总觉得这里设置成POST与真正的POST使用感觉还是不太一样。具体的只自己感觉去吧。
  • 返回参数的DATA1定义为STRING类型,其实在SAPUI5调用时,传入的数据内容是把JSON的结构数据转换为STRING传到这里,然后在后面的函数中会把此DATA1的值转转换为JOSN格式的结构化数据,感觉上Function Import在SAPUI5上使用时都是这样子使用的。

3.3.3.写函数的功能代码

在前面创建引用函数功能后,需要生成一下项目,转到项目的扩展类**_DPC_EXT,进入类中,找到/IWBEP/IF_MGW_APPL_SRV_RUNTIME~EXECUTE_ACTION方法,编辑类,并进行重定义此方法。

为采购收货创建CDS并生成ODATA - 第7张  | 优通SAP
为采购收货创建CDS并生成ODATA - 第8张  | 优通SAP

在类中写下收货的代码,

为采购收货创建CDS并生成ODATA - 第9张  | 优通SAP
  • 在代码中IV_ACTION_NAME = ‘ZFM_GR_MIGO’,就是的收货功能,与我们前面定义的函数名ZFM_GR_MIGO相同,在这里面的代码就是我们收货的功能代码,
  • 在其中调用/UI2/CL_JSON=>DESERIALIZE把传入的DATA1的参数转换为JSON的结构化数据。最后再调用函数ZMM_PO_MIGO_GR2来进行数据的收货处理,
  • 为了定义省事,在这里直接定义传入的结构数据就是前面步骤定义CSD的结构ZMM_C_POEKPO2V,可能有很多 码中IV_ACTION_NAME = ‘ZFM_GR_MIGO’,就是的收货功能,与我们前面定义的函数名ZFM_GR_MIGO相同,在这里面的代码就是我们收货的功能代码,
  • 在其中调用/UI2/CL_JSON=>DESERIALIZE把传入的DATA1的参数转换为JSON的结构化数据。最后再调用函数ZMM_PO_MIGO_GR2来进行数据的收货处理,
  • 为了定义省事,在这里直接定义传入的结构数据就是前面步骤定义CSD的结构ZMM_C_POEKPO2V,可能有很多 数据冗余,其中在这里可以使用自己定义的结构,只定义创建收货时需要的字段就行,当然SAPUI5中也要对应的修改

以下是ZMM_PO_MIGO_GR2函数代码

4.扩展

1.到这里ODATA就算是完成了,激活后此ODATA就可以使用了,在现实使用中SAPUI5代码读取ODATA时默认就读取的CDS的数据(此应该也在UI5代码中应该也是可以修改了默认不读取的),但我们真实收货时,可能需要默认不显示需收货的数据,所以我重定义了ZMM_C_POEKPO2_GET_ENTITYSET方法,当查询条件为空时,不查询数据。

为采购收货创建CDS并生成ODATA - 第10张  | 优通SAP

现在ODATA就完全完成后,后一步就是SAPUI5做FIORI APP了,可参考这里