SAPUI5 (35) - OData Model 連接后端 SAP 系統(tǒng) (中)

完成上一篇的配置篓叶,現(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')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市护桦,隨后出現(xiàn)的幾起案子巧号,更是在濱河造成了極大的恐慌族奢,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丹鸿,死亡現(xiàn)場離奇詭異越走,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)靠欢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門廊敌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人门怪,你說我怎么就攤上這事骡澈。” “怎么了掷空?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵肋殴,是天一觀的道長。 經(jīng)常有香客問我拣帽,道長疼电,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任减拭,我火速辦了婚禮,結(jié)果婚禮上区丑,老公的妹妹穿的比我還像新娘拧粪。我一直安慰自己修陡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布可霎。 她就那樣靜靜地躺著魄鸦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪癣朗。 梳的紋絲不亂的頭發(fā)上拾因,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音旷余,去河邊找鬼绢记。 笑死,一個胖子當(dāng)著我的面吹牛正卧,可吹牛的內(nèi)容都是我干的蠢熄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼炉旷,長吁一口氣:“原來是場噩夢啊……” “哼签孔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窘行,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饥追,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罐盔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體但绕,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年翘骂,在試婚紗的時候發(fā)現(xiàn)自己被綠了壁熄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡碳竟,死狀恐怖草丧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莹桅,我是刑警寧澤昌执,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站诈泼,受9級特大地震影響懂拾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铐达,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一岖赋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓮孙,春花似錦唐断、人聲如沸选脊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恳啥。三九已至,卻和暖如春丹诀,著一層夾襖步出監(jiān)牢的瞬間钝的,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工铆遭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留硝桩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓疚脐,卻偏偏與公主長得像亿柑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棍弄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容