• 使用ABAP CDS视图创建服务(CDSビューでODATAサービスの作成方法)


    介绍
    本文介绍使用ABAP Core Data Services创建OData服务的最快方法。 给出了有关@ OData.publish注释利用率,对数据源CDS实体的引用和从DDIC结构导入的详细信息。 自定义透明表数据上显示的创建,更新和删除操作只是为了简化文章,而不是将重点从OData服务创建转移到业务流程需求实现。

    “R”类型OData服务创建。 在ABAP CDS中使用@ OData.publish注释
    我们假设我们有下列数据表(可能在自定义命名空间中,只是为了简化演示案例并仅关注OData服务,而不是关注SAP功能模块和类使用)

    table_zxeq1
     

    可以使用SAP HANA Studio为其创建ABAP CDS视图

     
    table_sh1

    在CDS激活期间,OData服务将在后台生成。

    服务文档如下所示:

     
    table_1.0-encoding

    “R”类型OData服务创建。 使用ABAP CDS上的参考

    table_zxeq1
     

    可以使用SAP HANA Studio为其创建ABAP CDS视图。 请注意,在这种情况下,没有使用@OData注释

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

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

     
    table_sh14
     

    服务文档如下所示:

    table_sample
     
     

    “CRUD”类型OData服务创建

    transparent_table
     

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

     
    table_lexprmnt01
     

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

    segw
     
    create_an_entity_type
     
    select_parameter
     

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

    SAP将生成运行时对象

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

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

    
    
     
    table_searchable
     

    结论
    本文展示了一种基于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服务。

     

  • 相关阅读:
    现代软件工程_团队项目_阿尔法阶段_后端python部分编程规范_2017.11.28
    现代软件工程_团队项目_阿尔法阶段_阿里云服务器部署_2017.11.24
    现代软件工程_团队项目_阿尔法阶段_前端知识分享_2017.11.22
    JavaScript基础(二)
    JavaScript基础(一)
    Socket接口
    【学习】CSS基础(一)
    【学习】HTML基础(二)
    【学习】HTML基础入门(一)
    现代软件工程_团队项目_阿尔法阶段_前端页面原型v1.0.2_2017.11.14
  • 原文地址:https://www.cnblogs.com/yjyongil/p/10646659.html
Copyright © 2020-2023  润新知