介绍
本文介绍使用ABAP Core Data Services创建OData服务的最快方法。 给出了有关@ OData.publish注释利用率,对数据源CDS实体的引用和从DDIC结构导入的详细信息。 自定义透明表数据上显示的创建,更新和删除操作只是为了简化文章,而不是将重点从OData服务创建转移到业务流程需求实现。
“R”类型OData服务创建。 在ABAP CDS中使用@ OData.publish注释
我们假设我们有下列数据表(可能在自定义命名空间中,只是为了简化演示案例并仅关注OData服务,而不是关注SAP功能模块和类使用)
可以使用SAP HANA Studio为其创建ABAP CDS视图
在CDS激活期间,OData服务将在后台生成。
服务文档如下所示:
“R”类型OData服务创建。 使用ABAP CDS上的参考
可以使用SAP HANA Studio为其创建ABAP CDS视图。 请注意,在这种情况下,没有使用@OData注释
SAP将基于对ABAP CDS的引用生成运行时对象
服务文档如下所示:
“CRUD”类型OData服务创建
可以使用SAP HANA Studio为其创建ABAP CDS视图(未使用@OData注释)
在下一步中,我们将通过事务代码SEGW创建网关项目并导入DDIC结构(使用ABAP CDS中的@ AbapCatalog.sqlViewName值,请参见上图)
如果您正在使用具有关联的复杂CDS(例如,对于Master-Details视图),则还应创建关联和导航属性。 将添加此部分。
SAP将生成运行时对象
这里可以直接向ABAP CDS指出SELECT语句的Get_EntitySet方法
METHOD experimentset_get_entityset. SELECT * FROM zxeq1_lexprmnt01 INTO CORRESPONDING FIELDS OF TABLE @et_entityset ORDER BY PRIMARY KEY. ENDMETHOD.
如果设置实体集的可搜索参数,则ABAP代码实现应如下所示
METHOD experimentset_get_entityset. DATA: lv_osql_where_clause TYPE string. "Prepare where clause lv_osql_where_clause = io_tech_request_context->get_osql_where_clause( ). "Select data SELECT * FROM zxeq1_lexprmnt01 INTO CORRESPONDING FIELDS OF TABLE @et_entityset WHERE (lv_osql_where_clause) ORDER BY PRIMARY KEY. ENDMETHOD.
如果您另外设置实体集的Pageable参数,则ABAP代码应如下所示
METHOD experimentset_get_entityset. DATA: lv_osql_where_clause TYPE string, lv_top TYPE i, lv_skip TYPE i, lv_max_index TYPE i. "Prepare top and skip lv_top = io_tech_request_context->get_top( ). lv_skip = io_tech_request_context->get_skip( ). IF lv_top IS NOT INITIAL. lv_max_index = lv_top + lv_skip. ENDIF. "Prepare where clause lv_osql_where_clause = io_tech_request_context->get_osql_where_clause( ). "Select data SELECT * FROM zxeq1_lexprmnt01 INTO CORRESPONDING FIELDS OF TABLE @et_entityset UP TO @lv_max_index ROWS WHERE (lv_osql_where_clause) ORDER BY PRIMARY KEY. "Process skip IF lv_skip IS NOT INITIAL. DELETE et_entityset TO lv_skip. ENDIF. "Process inline couter IF io_tech_request_context->has_inlinecount( ) = abap_true. SELECT COUNT(*) FROM zxeq1_lexprmnt01 WHERE (lv_osql_where_clause). es_response_context-inlinecount = sy-dbcnt. ELSE. CLEAR es_response_context-inlinecount. ENDIF. ENDMETHOD.
在Get_Entity方法中,我们应该使用ABAP CDS和其他数据类型相关的对象和关键字段名称
METHOD experimentset_get_entity. DATA: ls_data TYPE zcl_xeq1s_exprmnt01p_mpc=>ts_experiment. "Convert keys to data CALL METHOD io_tech_request_context->get_converted_keys IMPORTING es_key_values = ls_data. "Select data by keys SELECT SINGLE * INTO CORRESPONDING FIELDS OF @er_entity FROM zxeq1_lexprmnt01 WHERE uname = @ls_data-uname. ENDMETHOD.
如果设置Creatable参数,则应实现Create_Entity方法,ABAP代码可能如下所示。 在我们当前的示例中,我们使用数据库表作为INSERT数据的目标(在更复杂和更现实的业务案例中,SAP BAPI或功能模块或ABAP类应在此处用于实现所需的业务逻辑)
METHOD experimentset_create_entity. DATA: ls_data TYPE zxeq1_dexprmnt01. "Insert data in database MOVE-CORRESPONDING er_entity TO ls_data. INSERT zxeq1_dexprmnt01 FROM @ls_data. ENDMETHOD.
如果您设置Updatable参数,那么您应该实现Update_Entity方法,如下面的示例。 在我们当前的示例中,我们使用数据库表作为UPDATE数据的目标(在更复杂和更现实的业务案例中,SAP BAPI或功能模块或ABAP类应在此处用于实现所需的业务逻辑)
METHOD experimentset_update_entity. DATA: ls_data TYPE zxeq1_dexprmnt01. "Update data in database MOVE-CORRESPONDING er_entity TO ls_data. UPDATE zxeq1_dexprmnt01 FROM @ls_data. ENDMETHOD.
如果设置了Entity Set的Deletable参数,那么您应该实现Delete_Entity方法,如下例所示。 在我们当前的示例中,我们使用数据库表作为删除数据的目标(在更复杂和更现实的业务案例中,SAP BAPI或功能模块或ABAP类应在此处用于实现所需的业务逻辑)
METHOD experimentset_delete_entity. DATA: ls_data TYPE zcl_xeq1s_exprmnt01p_mpc=>ts_experiment. "Convert keys to data CALL METHOD io_tech_request_context->get_converted_keys IMPORTING es_key_values = ls_data. "Delete data from database DELETE FROM zxeq1_dexprmnt01 WHERE uname = @ls_data-uname. ENDMETHOD.
创建了以下OData服务文档
结论
本文展示了一种基于ABAP CDS技术的完整CRUD功能支持的快速简单的OData服务创建方法。 可以看到基于ABAP CDS的CRUD OData服务的包装器可以创建为几个小时的活动。 我们需要的只是在其中添加ABAP逻辑,这与我们在使用Web服务之前在ABAP开发中完成的活动大致相同。 此外,在ABAP CDS视图上创建的OData服务已准备好供SAP HTML5(UI5)应用程序使用,可以从SAP Cloud Platform部署到公司本地SAP Fiori Launchpad或SAP Fiori Cloud Launchpad(Portal)。
附: 请注意,在使用SAP Fiori Cloud Launchpad的情况下,我们必须使用SAP Cloud Platform OData Provisioning Service来包装OData服务。