本文介紹SAP后端系統基於數據結構創建OData服務過程。
1.創建數據字典
2.創建OData service
2.1創建Gateway service project
事務碼:SEGW
點擊Create Project 按鈕
Gateway service Project分四個部分:
♦ Data Model: 數據模型,主要包括 Entity type,( 比如說 product entity,customer entity 等),Entity set (Entity 的集合,多筆數據) 和 Association (Entity 之間的關聯)
♦ Service Implementation: Entity set 的 CRUD 實現
♦ Runtime Artifacts:基於Entity set 的代碼框架,包括數據模型 (Data model),數據提供者 (Data provider)
♦ Service maintenance:注冊服務,測試服務
2.2創建Data Model
2.2.1創建Entity
選中Data Model,右鍵,Import->DDIC Structure
輸入Entity Name以及數據表結構 ZRICO_USR,若勾選Create Default entity set則自動創建Entity set
選中所有字段,點擊NEXT
選擇字段MANDT、USRID為主鍵,並將Name值按照規范首字符需大寫,如下圖所示。
點擊Finish
完成后查看Entity屬性
2.2.2調整Entity Sets
設置Entity集合可CRUD
2.3Generate runtime objects
選中項目名,右鍵Generate Runtime
保持所有值默認,點擊Continue按鈕,運行
系統生成Runtime objects
2.4服務注冊
若之前已創建了Gateway Service別名,則在Service Maintenance下可以看到。
此時Register Status是沒有狀態的,點擊Register按鈕
選擇系統別名LOCAL
確認后,完成服務注冊,狀態已經改變。
2.5測試OData Service
可以通過Browser或是Sap Gateway Client進行測試。
點擊Maintain進入激活並維護服務界面:
調用瀏覽器測試,如下圖所示,測試成功:
瀏覽器測試可能存在問題:
A.點擊 Call Browser 按鈕,系統顯示 host name 或 port 沒有配置好,使用事務碼 SMICM,然后通過菜單 Goto -> Services,看看主機和端口是否配置好,是否啟用。
B.如果服務器沒有在 Internet 上公開,這個 host name 不能通過 Internet 網進行訪問,則需要設置本機的 hosts 文件,讓本機指向這個域名。hosts 文件的位置在 C:\Windows\System32\drivers\etc 文件夾中。
Gateway客戶端測試:
客戶端測試,當前連接出錯,未配置Fiori外部服務環境,可跳過,不影響后續測試,正常測試如下:
2.6服務實現
服務實現是指提供 CRUD 的具體實現,因為讀取數據的時候,存在 Entity 和 EntitySet,SAP 一般把讀取 Entity 叫做 Read,把讀取 EntitySet 叫做 Query。
在 SEGW 界面中 展開 Service Implementation:
需要編寫具體的代碼,這樣外部才能實現對 SAP 數據的增刪改查。
OData Operation | HTTP Method | What it meant to an ABAPer |
---|---|---|
Create | POST | Insert <table> from <workarea> |
Read | GET | Select Single * From <table> into <workarea> |
Update | PUT/PATCH | Update <table> set <workarea> |
Delete | DELETE | Delete from <table> |
Query | GET | Select * From <table> Into Table |
Function Import | GET/POST | Everything covered by GET and POST. But only use if scenario does not fit into CRUDQ operations. |
2.6.1Query重定義
首先我們來看看 GetEntitySet 方法的編寫過程。
選中GetEntitySet(Query) ,右鍵,Go to Abap Workbench
系統提示:
點擊確認按鈕,進入如下界面:
選中ZUSERSET_GET_ENTITYSET方法,右鍵,重定義,改寫該方法實現過程(其他方法改寫類似)
方法代碼改寫:

method zuserset_get_entityset. data: ls_filter type /iwbep/s_mgw_select_option, ls_select_options type /iwbep/s_cod_select_option. data: lt_range_usrid type table of zrange_vhl. field-symbols: <fs_range_usrid> type zrange_vhl. read table it_filter_select_options into ls_filter with key property = 'Usrid'. if sy-subrc = 0. loop at ls_filter-select_options into ls_select_options. append initial line to lt_range_usrid assigning <fs_range_usrid>. move-corresponding ls_select_options to <fs_range_usrid>. unassign <fs_range_usrid>. endloop. endif. select * from zrico_usr into corresponding fields of table et_entityset where usrid in lt_range_usrid. endmethod.
其中ET_ENTITYSET是類方法預設的參數,基於ZRICO_USR內表結構。
修改完成后激活。
然后通過Browser瀏覽器進行測試:
可以通過Gateway客戶端測試:從 SEGW 進入服務維護和 Gateway client 界面。也可以通過另外的事務碼:Service maintain: /IWFND/MAINT_SERVICE。這兩個事務碼比較
怪,不通過/o 系統提示錯誤。所以應該輸入 /O/IWFND/MAINT_SERVICE,SAP Gateway client: /o/iwfnd/gw_client。
Postman使用前請先查看口令及CSRF獲取過程:
UI5-學習篇-7-Postman測試SAP OData Services
通過Postman進行測試(Postman工具后續會大量使用):
測試成功。
2.6.2Read重定義
選中GetEntity(Read),進入ABAP工作台
改寫方法ZUSERSET_GET_ENTITY:
激活后,通過Postman測試:
測試成功。
2.6.3Create重定義
選中Create,右鍵進入ABAP工作台
方法 ZUSERSET_CREATE_ENTITY重定義:
代碼重寫:
Postman測試,需注意以下幾個問題:
♦ Logon Error Message:Postman測試過程中登錄失敗,需維護賬號密碼,刪除Cookies.
♦CSRF token validation failed:CSRF問題請關注https://blogs.sap.com/2014/07/11/issues-with-csrf-token-and-how-to-solve-them/
♦The Data Services Request contains SystemQueryOptions that are not allowed for this Request Type:
請關注:https://blogs.sap.com/2014/03/06/let-s-code-crudq-and-function-import-operations-in-odata-service/
♦Run transaction /IWFND/ERROR_LOG on SAP Gateway hub system and search for entries with the timestamp above for more details:
上述問題以下測試環節會講解。
Create服務測試過程:
<1>執行GET讀取單個實體/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet(Mandt='300',Usrid='1')
<2>單擊“用作請求”按鈕
<3>更新您的請求屬性。
<4>選擇HTTP方法作為POST
<5>執行/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet
Postman測試過程:
<1>執行GET讀取單個實體/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet(Mandt='300',Usrid='1')
設置權限:SAP前端系統登錄賬號/密碼
設置Headers參數 KEY:X-CSRF-Token VALUE: Fetch
執行SEND后獲取CSRF Token值:a-LzHGGnL0PMiFGjzzhgvw==
同時拷貝執行結果:
<2>執行為/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet
上一步獲取了兩個信息:CSRF值 及XML結果
此步驟采用POST方式提交Create服務地址:
執行SEND后,獲取執行結果,如下圖所示,執行成功。
2.6.4Update重定義
選中Update,右鍵,進入ABAP工作台
保存后激活。
Postman測試過程:
設置參數如下
調整記錄值:
執行SEND,返回空值
查詢數據表記錄,如下圖所示,當前記錄已被更新,執行成功。
2.6.5Delete重定義
選中Delete,右鍵,進入ABAP工作台
代碼重寫:
代碼調整后激活。
Postman測試:
采用DELETE方式
執行完成后,查詢該記錄,提示該記錄未找到,即已刪除成功。
2.7Function Import函數導入
如果操作不適合CRUD方案,那么您可以通過函數導入來執行。
選中DataModel,右鍵,Create,Function Import
輸入導入名稱,例如:需要根據用戶名NAME查詢其他信息
確認后,Function Imports節點下顯示創建的名稱。
調整Function Imports相關參數:
Return type Kind:Entity type Return type: ZUSER
Return Cardinality:返回值為實體集合,則選擇 0...n
HTTP:Get方式
為Function Import創建導入參數:
雙擊Function Import Parameters,
選擇創建按鈕,輸入參數名:UsrName,參數類型Edm.String,最大長度值
完成后保存。
查看元數據中相關參數定義,地址(替換域名):
http://gxx.xxxxx.com:8000/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/$metadata
通過Postman測試如下:
如上圖所示,已顯示FunctionImport節點參數。
下一步進行方法重定義:
代碼改寫完成后激活,然后通過Postman進行測試(地址域名替換):
http://gXXX.XXXXX.com:8000/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/UserByName?UsrName='12'