介紹
本文介紹使用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服務。