使用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服務。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM