完成上一篇的配置篓叶,現(xiàn)在我們可以在 SAP 系統(tǒng)中創(chuàng)建基于 SAP Netweaver Gateway 的 OData Service露筒。本篇主要是介紹在 SAP 系統(tǒng)中創(chuàng)建 OData service 的過程傲须,為后續(xù)在 OpenUI5 中通過 OData Model 使用 SAP 系統(tǒng)提供的 OData 數(shù)據(jù)服務(wù)涩赢。SAP OData service 本身包含很多知識點是越,也需要系統(tǒng)學(xué)習(xí)蔑歌。
本次要實現(xiàn)的功能:創(chuàng)建數(shù)據(jù)庫表 zemployee,并基于 SAP Netweaver OData Service, 實現(xiàn)對 zemployee 的增刪改查掀鹅。
1. 創(chuàng)建 zemployee 數(shù)據(jù)庫表
使用事務(wù)碼 SE11 創(chuàng)建 zemployee 表散休。因為本文主要介紹 OData service 創(chuàng)建的過程,所以并不打算詳細(xì)說明創(chuàng)建表的細(xì)節(jié)乐尊。為了足夠簡單戚丸, zemployee 表只包含 empid
, empname
, empaddr (employee address)
三個字段。
2. 創(chuàng)建基于 Netweaver Gateway 的 OData Service
2.1 創(chuàng)建 Gateway service project
通過事務(wù)碼 SEGW扔嵌,進(jìn)入下面的界面:
點擊 Create Project 按鈕限府,創(chuàng)建一個 Gateway service project, 將 project 命名為 zempprj
。點擊 「Local Object」按鈕痢缎,zempprj 項目創(chuàng)建成功:
本節(jié)完整動圖:
我們可以到胁勺,Gateway service 分為四個部分 (左邊的 panel):
-
Data Model: 數(shù)據(jù)模型,主要包括
Entity type
,( 比如說 product entity牺弄,customer entity 等)姻几,Entity set
(Entity 的集合宜狐,多筆數(shù)據(jù)) 和Association
(Entity 之間的關(guān)聯(lián))
Service Implementation: Entity set 的 CRUD 實現(xiàn)
Runtime Artifacts: 基于 Entity set 的代碼框架,包括數(shù)據(jù)模型 (Data model)蛇捌,數(shù)據(jù)提供者 (Data provider)
Service maintenance:注冊服務(wù)抚恒,測試服務(wù)。
2.2 創(chuàng)建 Data Model
1) 創(chuàng)建 Entity
選中 Data Model络拌,右鍵俭驮,Import -> DDIC Structure,表示從 DDIC 中導(dǎo)入結(jié)構(gòu)作為 Entity:
將 Entity type 命名為 Employee, 字段來自 DDIC 的 zemployee 表:
選中 zemployee 表的所有字段春贸,點擊 Next 按鈕:
系統(tǒng)進(jìn)入如下界面混萝。在這個界面中,定義 Employee 這個 entity 的字段屬性萍恕。將 mandt 和 empid 定義為 primary key逸嘀,并將 Name 的名稱規(guī)范為首字母大寫。
屬性定義完成后允粤,左邊的 panel 中崭倘, Properties 下面可以看到主鍵和屬性:
本節(jié)完整動圖:
2) 創(chuàng)建 Entity set
選中左邊 Panel 的 Entity Set,右鍵类垫,Create司光。將 Entity set 命名為 EmployeeCollection
, Entity type 為剛剛創(chuàng)建的 Employee
。
定義 EmployeeCollection
可以進(jìn)行 CRUD:
本節(jié)完整動圖:
2.3 Generate Runtime Objects
選中左邊 Panel 的 Runtime Artifacts悉患,點擊 Generate Runtime Objects 按鈕残家,系統(tǒng)進(jìn)入下面的界面:
保持所有默認(rèn)不變,點擊 Continue 按鈕售躁。系統(tǒng)生成 Runtime Objects坞淮。
本節(jié)完整動圖:
2.4 服務(wù)注冊
前面我們在 SAP 系統(tǒng)中創(chuàng)建了 Gateway service 的別名,我們可以看到迂求,這個別名出現(xiàn)在 Service maintenance 下面碾盐。雙擊可以進(jìn)入下面的界面。
此時揩局, Registration status 是沒有狀態(tài)的,點擊 Register 按鈕掀虎,系統(tǒng)彈出對話框:
選擇 Sytem Alias 為 local凌盯,進(jìn)入下面的界面
確認(rèn),完成系統(tǒng)注冊烹玉。
本節(jié)動圖:
2.5 測試 OData service
盡管我們還沒有編寫 OData service 的實現(xiàn)代碼驰怎,但已經(jīng)可以通過 Browser 或者 SAP Gateway Client 進(jìn)行測試了。雙擊左邊 Panel Service maintenance 下的 localgateway二打,點擊右邊出現(xiàn)的 Maintain 按鈕县忌,進(jìn)入下面的界面:
我們可以通過點擊左下角的 Call Browser 或者 SAP Gateway Client 按鈕進(jìn)行測試。當(dāng)點擊 SAP Gateway Client 按鈕的時候,界面如下:
后面我們會多次進(jìn)入到這個界面症杏,進(jìn)行 CRUD 的測試装获。
利用 Browser 來進(jìn)行測試,則有可能碰到一些問題厉颤。在這里介紹兩種極有可能的情況及解決方法:
一是點擊 Call Browser 按鈕穴豫,系統(tǒng)顯示 host name 或 port 沒有配置好,這個時候逼友,使用事務(wù)碼 SMICM精肃,然后通過菜單 Goto -> Services,看看主機(jī)和端口是否配置好帜乞,是否激活司抱。
另外,還要注意域名解析黎烈,如果服務(wù)器沒有在 Internet 上公開状植,這個 host name 不能通過 Internet 網(wǎng)進(jìn)行訪問,則需要設(shè)置本機(jī)的 hosts 文件怨喘,讓本機(jī)指向這個域名津畸。Windows 10 中 hosts 文件的位置在 C:\Windows\System32\drivers\etc
文件夾中。
2.6 服務(wù)實現(xiàn) (Service maintenance)
服務(wù)實現(xiàn)是指提供 CRUD 的具體實現(xiàn)必怜,因為讀取數(shù)據(jù)的時候肉拓,存在 Entity 和 EntitySet,SAP 一般把讀取 Entity 叫做 Read梳庆,把讀取 EntitySet 叫做 Query暖途。在 SEGW 界面中展開 Service Implementation:
我們需要編寫具體的代碼,這樣客戶端提交 HTTP 請求膏执,SAP 系統(tǒng)接收到請求驻售,才能實現(xiàn)對數(shù)據(jù)進(jìn)行增刪改查。我們來看看 GetEntitySet()
方法的編寫過程更米。
Query
選中 GetEntitySet (Query)
欺栗,右鍵,Go to ABAP Workbench征峦。系統(tǒng)提示:
點擊 確認(rèn) 按鈕迟几,進(jìn)入下面的界面:
找到 EMPLOYEECOLLECTI_GET_ENTITYSET
,右鍵栏笆,選擇 Redefine类腮,改寫這個方法。其它的方法創(chuàng)建過程類似蛉加,不再重復(fù)說明蚜枢。
改寫后 employeecollecti_get_entityset
方法代碼如下:
METHOD employeecollecti_get_entityset.
SELECT * FROM zemployee
INTO CORRESPONDING FIELDS OF TABLE et_entityset.
ENDMETHOD.
et_entityset
是代碼框架預(yù)設(shè)的方法參數(shù)缸逃,通過追蹤查看,我們知道厂抽,它是基于 zemployee
的內(nèi)表類型需频。
測試方法:在 SAP Gateway Client 界面中:
- HTTP Method: GET
- Request URL:
/sap/opu/odata/sap/ZEMPPRJ_SRV/EmployeeCollection?$format=json
系統(tǒng)返回的結(jié)果:
我們總可以從 SEGW 進(jìn)入服務(wù)維護(hù)和 Gateway client 界面。也可以通過另外的事務(wù)碼:
- Service maintain:
/IWFND/MAINT_SERVICE
修肠。這兩個事務(wù)碼比較怪贺辰,不通過/o
系統(tǒng)提示錯誤。所以應(yīng)該輸入/O/IWFND/MAINT_SERVICE
嵌施。 - SAP Gateway client:
/o/iwfnd/gw_client
饲化。
Read
實現(xiàn) GetEntity (Read)
方法:
METHOD employeecollecti_get_entity.
DATA: ls_key_tab LIKE LINE OF it_key_tab,
l_empid TYPE zemployee-empid.
READ TABLE it_key_tab WITH KEY name = 'EmpId' INTO ls_key_tab.
l_empid = ls_key_tab-value .
SELECT SINGLE * FROM zemployee INTO er_entity WHERE empid = l_empid.
ENDMETHOD.
SAP Gateway Client 測試:
HTTP Method: GET
Request URL:
/sap/opu/odata/sap/ZEMPPRJ_SRV/EmployeeCollection(Mandt='100',EmpId='1')?$format=json
Response:
{
"d" : {
"__metadata" : {
"id" : "http://dph01.ourdomain:8180/sap/opu/odata/sap/ZEMPPRJ_SRV/EmployeeCollection(Mandt='100',EmpId='1')",
"uri" : "http://dph01.ourdomain:8180/sap/opu/odata/sap/ZEMPPRJ_SRV/EmployeeCollection(Mandt='100',EmpId='1')",
"type" : "ZEMPPRJ_SRV.Employee"
},
"Mandt" : "100",
"EmpId" : "1",
"EmpName" : "Stone",
"EmpAddr" : "Wuhan"
}
}
Create
實現(xiàn) Create
方法
METHOD employeecollecti_create_entity.
DATA: ls_employee TYPE zemployee.
" Get requested data from input
io_data_provider->read_entry_data( IMPORTING es_data = er_entity ).
MOVE-CORRESPONDING er_entity TO ls_employee.
INSERT zemployee FROM ls_employee.
ENDMETHOD.
SAP Gateway Client 測試:
因為 Create 操作需要數(shù)據(jù),我們可以先用 GET 方法得到一筆數(shù)據(jù)吗伤,更改后再用 POST 方法進(jìn)行提交吃靠。操作步驟如下:
點擊 「Use as request」配椭,將獲取的數(shù)據(jù)進(jìn)行更改后提交:
返回的狀態(tài)碼為 201 則表示成功扼倘。
Update
實現(xiàn) Update
方法:
method EMPLOYEECOLLECTI_UPDATE_ENTITY.
DATA: ls_employee TYPE zemployee.
" Get requested data
io_data_provider->read_entry_data( IMPORTING es_data = er_entity ).
MOVE-CORRESPONDING er_entity TO ls_employee.
MODIFY zemployee FROM ls_employee.
endmethod.
Update 的測試使用 PUT 方法:
- HTTP Method: PUT
- Request URI:
/sap/opu/odata/sap/ZEMPPRJ_SRV/EmployeeCollection(Mandt='100',EmpId='3')
Delete
實現(xiàn) Delete 方法:
METHOD employeecollecti_delete_entity.
DATA: ls_key_tab TYPE /iwbep/s_mgw_name_value_pair,
l_empid TYPE zemployee-empid,
ls_employee TYPE zemployee.
READ TABLE it_key_tab WITH KEY name = 'EmpId' INTO ls_key_tab.
l_empid = ls_key_tab-value.
DELETE FROM zemployee WHERE empid = l_empid.
ENDMETHOD.
測試刪除的方法:
- HTTP Method: DELETE
- Request URI:
/sap/opu/odata/sap/ZEMPPRJ_SRV/EmployeeCollection(Mandt='100',EmpId='3')