使用ABAP CDS视图创建服务

Posted yjyongil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ABAP CDS视图创建服务相关的知识,希望对你有一定的参考价值。

 

介绍
本文介绍使用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注释

 
技术图片
 
 
在下一步中,我们将通过事务代码SEGW创建网关项目,并将其引用到上一步ABAP CDS中创建的
 
技术图片
 
技术图片
 

SAP将基于对ABAP CDS的引用生成运行时对象

 
技术图片
 

服务文档如下所示:

技术图片
 
 

“CRUD”类型OData服务创建

技术图片
 

可以使用SAP HANA Studio为其创建ABAP CDS视图(未使用@OData注释)

 
技术图片
 

在下一步中,我们将通过事务代码SEGW创建网关项目并导入DDIC结构(使用ABAP CDS中的@ AbapCatalog.sqlViewName值,请参见上图)

技术图片
 
技术图片
 
技术图片
 

如果您正在使用具有关联的复杂CDS(例如,对于Master-Details视图),则还应创建关联和导航属性。 将添加此部分。

SAP将生成运行时对象

 
技术图片
 
对于“CRUD”类型的OData服务,我们应该设置实体集的参数,然后实现它们中的每一个。
 
技术图片
 
 
导航到ABAP Workbench并重新定义* DPC_EXT类的方法以进行CRUD操作
 
技术图片
 

这里可以直接向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服务。

 技术图片

 

 

以上是关于使用ABAP CDS视图创建服务的主要内容,如果未能解决你的问题,请参考以下文章

SAP ABAP CDS view Association 引入的缘由

ABAP on HANA之CDS Association和Path Expression

使用ABAP CDS views创建一个分析模型并设置参数

SAP ABAP CDS view里的注解在ABAP后台是如何被解析的?

ABAP CDS 替代对象(Replacement Objects)引起的数据错误

SAP ABAP CDS 查看/DCL 检查授权