Jerry在今年2月28日,SAP Customer Management for S/4HANA 1.0正式問世這個具有紀(jì)念意義的日子,同時發(fā)布了中英文版的博客進(jìn)行介紹。 英文版發(fā)在SAP社區(qū)上,至今超過16000的閱讀量: 而發(fā)布在微信公眾號上的中文版,也有兩千多的閱讀量: 一轉(zhuǎn)眼大半年就過去了,如今SAP S4CRM的標(biāo)準(zhǔn)開發(fā),進(jìn)行得怎么樣了呢?在SAP社區(qū)上我寫的那個英文博客里,有很多國外的partners在上面留言詢問各種各樣的問題。由于今年4月份起Jerry就離開了S4CRM開發(fā)團(tuán)隊(duì),所以很多問題我沒有辦法回答,于是我邀請了SAP S4CRM的首席產(chǎn)品經(jīng)理Frick Oliver在社區(qū)上回答大家提出的問題: 這是Oliver介紹S4CRM的視頻,節(jié)選自SAP官方招聘公眾號上的一篇文章。大家可以一睹這位德國老帥哥的風(fēng)采。 今天這篇文章我邀請了SAP成都研究院S4CRM團(tuán)隊(duì)的開發(fā)人員宋浩,由他介紹所在團(tuán)隊(duì)設(shè)計(jì)并開發(fā)的S4CRM里服務(wù)訂單(Service Order)創(chuàng)建和更新的API。關(guān)于宋浩的背景介紹,大家可以參考他之前的文章:一個SAP顧問在美國的這些年。 在宋浩的文章里,Jerry也植入了一些關(guān)于SAP CRM中間件和SAP Cloud for Customer內(nèi)容介紹,這些內(nèi)容都和SAP基于Netweaver的系統(tǒng)集成這個主題相關(guān),希望能對大家有所幫助。 為什么SAP要成立專門的團(tuán)隊(duì)來做API開發(fā)呢?最簡單的4個字答案:系統(tǒng)集成。 Jerry的另一篇文章:SAP S4CRM vs C4C, 諸葛亮和周瑜? 曾經(jīng)比較過這兩個產(chǎn)品的方方面面,下圖"系統(tǒng)集成"這一行,就是本文要詳細(xì)闡述的內(nèi)容。 如我上圖中高亮強(qiáng)調(diào)的,SAP C4C和其他系統(tǒng)做集成,SAP推薦采用基于Netweaver的PI或者HCI作為中間件,而S4CRM同其他系統(tǒng)的集成方式,就由宋浩給大家做詳細(xì)介紹。 下面是宋浩的正文。本文已獲作者授權(quán)轉(zhuǎn)發(fā)。 大家好,我是宋浩,今年6月份剛加入SAP這個大家庭,平日里喜歡旅行,看恐怖片,玩單機(jī)恐怖游戲,從生化危機(jī),零紅蝶,再到惡靈附身,恐怖元素一直是我閑暇時光的點(diǎn)綴,歡迎各位道友切磋指導(dǎo)。 S4CRM API是我在SAP經(jīng)歷的第一個項(xiàng)目,我們就從開發(fā)這個API的初衷說起吧。CRM市場這些年瞬息萬變,百家爭鳴。亂世必出英雄,我們新一代的產(chǎn)品S4CRM可以說是生于亂世,肩扛重任。 要實(shí)現(xiàn)一個企業(yè)的良好運(yùn)營,一個高效且穩(wěn)定的系統(tǒng)體系是必不可少的。而CRM便是這體系中重要的一員。如果一個已經(jīng)采用SAP S4CRM的客戶本身還有其他第三方系統(tǒng),那么如何確保S4CRM與這些外部系統(tǒng)之間高效地運(yùn)行與交互呢?我們的S4CRM API由此應(yīng)運(yùn)而生。 借助我們開發(fā)的服務(wù)訂單領(lǐng)域相關(guān)的S4CRM API,外部系統(tǒng)可以同S4CRM進(jìn)行一系列的服務(wù)流程操作,一個典型的場景就是,在外部系統(tǒng)調(diào)用S4CRM API,實(shí)現(xiàn)創(chuàng)建和修改服務(wù)訂單或者服務(wù)確認(rèn)(Service Confirmation)等需求。 如何找到我們11月份剛剛發(fā)布的這些API文檔呢? 瀏覽器訪問help.,看到這位美女后,輸入關(guān)鍵字S/4HANA cloud進(jìn)行搜索: 進(jìn)入S/4HANA cloud的產(chǎn)品頁面,輸入service order - Create, Change, 即可打開我們的API幫助文檔。 對于我輸入的關(guān)鍵字S/4HANA cloud,大家不用覺得費(fèi)解,因?yàn)閷τ谶@些API,S/4HANA On-Premise和Cloud共享同一套ABAP代碼實(shí)現(xiàn)。 幫助文檔里詳細(xì)介紹了API請求和響應(yīng)結(jié)構(gòu)里每個字段的技術(shù)名稱,長度和業(yè)務(wù)含義。對于SAP的老司機(jī)來說,拿到這份文檔就可以開工了。 另外在SAP Best Practices Explorer網(wǎng)站上,對于這些API的使用有更詳細(xì)的說明文檔。 您可以直接通過下面的鏈接瀏覽這些文檔。 https://rapid./bp/scopeitems/3D2 文檔里最有用的三部分:
(圖太大了,一屏顯示不完全)
因?yàn)門est script里包含了使用API的詳細(xì)步驟,這里不再重復(fù)了,咱們來談?wù)凷4CRM API的實(shí)現(xiàn)細(xì)節(jié)。 在介紹S4CRM API之前,讓我們先來回顧SAP CRM顧問都非常熟悉的SAP CRM中間件的消息流設(shè)計(jì)。 還是拿前面提到的例子來說明,假設(shè)外部系統(tǒng)通過CRM中間件觸發(fā)CRM端的服務(wù)訂單創(chuàng)建。那么從外部系統(tǒng)向CRM中間件發(fā)送消息,到我們能夠在CRM的數(shù)據(jù)庫表CRMD_ORDERADM_H里看到一條對應(yīng)的服務(wù)訂單抬頭記錄,主要經(jīng)歷了下圖標(biāo)注的三個步驟。 第一步: Inbound Adapter的字段映射 為什么需要這個字段映射呢?無論是老的CRM On-Premise還是新的S4CRM,只要涉及到服務(wù)訂單的創(chuàng)建,最終必定會調(diào)用到函數(shù)CRM_ORDER_MAINTAIN。而下圖中的Data Container,其數(shù)據(jù)格式同CRM_ORDER_MAINTAIN的輸入?yún)?shù)個數(shù)截然不同,因此必須要經(jīng)過Inbound Adapter做一個格式映射,這個思想和設(shè)計(jì)模式里的Adapter模式是一個道理。 因?yàn)镃RM中間件里做格式轉(zhuǎn)換的Inbound Adapter需要支持各種業(yè)務(wù)對象的數(shù)據(jù)同步,比如服務(wù)訂單,物料主數(shù)據(jù),產(chǎn)品主數(shù)據(jù)等等,因此Adapter用于接收Data Container的輸入?yún)?shù)類型必然是一個通用類型: 第二步:Validation Service 一般情況下每一個CRM中間件數(shù)據(jù)同步對象都有一個對應(yīng)的用于做校驗(yàn)的函數(shù),在調(diào)用實(shí)際的創(chuàng)建/修改API之前,使用該校驗(yàn)函數(shù)執(zhí)行錯誤檢測,實(shí)現(xiàn)Fail Fast,F(xiàn)ail Early的目的。 Fail Fast, Fail Early是大神Jim Shore和Martin Fowler提出的一種軟件開發(fā)實(shí)現(xiàn)理念,詳細(xì)介紹參考Martin的著作。 例如下圖中的COM_PRODUCT_MAT_VALIDATE就是物料主數(shù)據(jù)同步對象對應(yīng)的數(shù)據(jù)校驗(yàn)函數(shù),該截圖來自事務(wù)碼SMW01。 第三步:調(diào)用對應(yīng)的CRM函數(shù) 如果是服務(wù)訂單同步,意味著函數(shù)CRM_ORDER_MAINTAIN的調(diào)用;如果是物料主數(shù)據(jù),就是COM_PRODUCT_MAINTAIN,以此類推。 從事基于ABAP Netweaver的SAP產(chǎn)品相關(guān)的二次開發(fā)的顧問們可以享受一個優(yōu)勢:很多作用相似的功能API,在不同的SAP產(chǎn)品中實(shí)現(xiàn)理念也類似,這種風(fēng)格的相似性不容易用語言來描述,簡單地說就是都帶著一股“SAP味兒”。 比如我之前做過多年的SAP SD開發(fā),創(chuàng)建銷售訂單用的是函數(shù)SD_SALESDOCUMENT_CREATE,而加入SAP S4CRM團(tuán)隊(duì)后使用函數(shù)CRM_ORDER_MAINTAIN創(chuàng)建CRM里的服務(wù)訂單。當(dāng)我瀏覽了后者的參數(shù)定義,試著寫了一些測試代碼之后,不由得發(fā)出感嘆,“啊,一切都是熟悉的味道?!?/p> 同樣,我們S4CRM API的實(shí)現(xiàn)思路,同剛剛回顧過的SAP CRM中間件思路一致,也是三大步驟。 1. Validation 2. Mapping 3. Business Processing 除了Validation和Mapping調(diào)換了順序之外,整體思路和CRM中間件的三大步驟完全一致: 接下來我們看看在S4CRM里開發(fā)一個API的詳細(xì)步驟。 1. 模型 首先需要的是建模,沒有模型,API何從談起? 工欲善其事必先利其器,所以我們第一步要做的就是根據(jù)具體的服務(wù)場景中的銷售訂單在SAP系統(tǒng)中建立我們的數(shù)據(jù)模型。 使用事務(wù)碼SXMB_IFR,選擇Enterprise Service Builder, 系統(tǒng)會在本機(jī)尋找Java運(yùn)行環(huán)境,此項(xiàng)為必須項(xiàng),所以在建模前務(wù)必要安裝JRE。 模型是需要建在相對應(yīng)的namespace下面的,我這里使用的是SAP S4CRM標(biāo)準(zhǔn)開發(fā)用的namespace: 建模有四大元素:
首先要做的是創(chuàng)建基本數(shù)據(jù)類型,可以參考現(xiàn)有的global的基礎(chǔ)數(shù)據(jù)元素,將API需要使用到的global數(shù)據(jù)元素從global namespace引入到我們自己的namespace里面來。 舉個例子,下圖是SalesArea這個復(fù)合字段,里面包含了“五朵金花”,大多數(shù)基于Netweaver的SAP產(chǎn)品里,對于SalesArea的建模都沿用了這一最佳實(shí)踐: 實(shí)際我們這里是在做一個拼裝工作,樂高(LEGO)大家一定聽說過或者玩過吧。 如下圖所示,我們像拼裝樂高玩具那樣,把各種數(shù)據(jù)類型拼裝成一個結(jié)構(gòu),用于接收外部數(shù)據(jù)(也就是服務(wù)訂單)。 業(yè)務(wù)模型的結(jié)構(gòu)創(chuàng)建好之后,我們需要再拼裝一個供Message Type引用的整體數(shù)據(jù)類型,其實(shí)就是將Message Header的信息引入進(jìn)來,相信有經(jīng)驗(yàn)的顧問們已經(jīng)知道這個Message Header里維護(hù)什么信息了。是的,就是一些用來做傳輸?shù)臉?biāo)識性信息。 我們可以回顧下SAP CRM中間件Inbound Adapter的輸入?yún)?shù),同樣具有這個Message Header:一切都是熟悉的味道。 所有數(shù)據(jù)類型都就位后,我們可以組裝最終的Service Interface模型了,這個模型才是最終開放給外部去調(diào)用的Webservice 對象。這里我們采用的是異步傳輸?shù)姆绞?,?dāng)然您也可以選擇同步,取決于大家的實(shí)際需求和業(yè)務(wù)場景。 上圖Service Interface的名稱,ServiceOrderRequest_In, 就是出現(xiàn)在SAP幫助文檔里的API技術(shù)名稱。 這些模型創(chuàng)建好之后,再到事務(wù)碼SPROXY里生成Proxy對象,實(shí)際上就是能夠被ABAP代碼訪問到的ABAP DDIC結(jié)構(gòu)。 2. 使用ABAP實(shí)現(xiàn)服務(wù)訂單的創(chuàng)建和修改 前面已經(jīng)提過,我們首先要做的是對外部接收進(jìn)來的數(shù)據(jù)進(jìn)行校驗(yàn),以期在調(diào)用CRM_ORDER_MAINTAIN之前最大程度的保證數(shù)據(jù)的正確性。 在數(shù)據(jù)校驗(yàn)執(zhí)行完并且沒有拋出任何校驗(yàn)錯誤以后,我們需要將外部接進(jìn)來的數(shù)據(jù)結(jié)構(gòu)與SAP CRM_ORDER_MAINTAIN里的數(shù)據(jù)結(jié)構(gòu)進(jìn)行字段映射。 實(shí)際在CRM_ORDER_MAINTAIN里面相關(guān)數(shù)據(jù)字段是分散存儲在對應(yīng)的結(jié)構(gòu)里的。比如抬頭數(shù)據(jù)大部分是存放在ORDERADM_H中,行項(xiàng)目數(shù)據(jù)大部分是放在ORDERADM_I里,狀態(tài)數(shù)據(jù)存放在STATUS里。 基于這種特性,您會很容易發(fā)現(xiàn),變化的始終是模型,而CRM_ORDER_MAINTAIN這邊相對來說是固定不變的。所以我們專門設(shè)計(jì)了一個類用于完成數(shù)據(jù)映射。在這個類的設(shè)計(jì)上,我們傾向于以固定不變的一邊為主,每一個結(jié)構(gòu)創(chuàng)建一個方法,這樣有利于以后的復(fù)用和維護(hù),設(shè)計(jì)也相對清晰和有層次感。 下圖是這個數(shù)據(jù)映射類的方法列表: 我們以O(shè)RDERADM_H來舉例說明,Inbound端我們將對應(yīng)的外部數(shù)據(jù)映射到SAP CRM_ORDER_MAINTAIN對應(yīng)的結(jié)構(gòu)ORDERADM_H上面。 下圖展示的是數(shù)據(jù)映射類如何將外部數(shù)據(jù)中包含的服務(wù)訂單抬頭字段里包含的ID,類型和描述信息映射給CRM_ORDER_MAINTAIN需要的輸入?yún)?shù)格式。其中紅色高亮的部分是訂單ID這個字段的映射處理。 所有字段映射完成后,我們就可以進(jìn)行業(yè)務(wù)的處理了,調(diào)用CRM_ORDER_MAINTAIN去創(chuàng)建或者更新服務(wù)訂單。 如果是服務(wù)訂單創(chuàng)建場景,訂單的ID是在S4CRM系統(tǒng)自動生成的,創(chuàng)建完畢后需要將生成的服務(wù)訂單數(shù)據(jù)讀取出來,作為API響應(yīng)發(fā)送給外部系統(tǒng)。 上圖紅色區(qū)域代表調(diào)用CRM_ORDER_MAINTAIN創(chuàng)建服務(wù)訂單的代碼,藍(lán)色區(qū)域代表調(diào)用CRM_ORDER_READ將創(chuàng)建好的訂單明細(xì)從內(nèi)存中讀取出來,準(zhǔn)備進(jìn)行Outbound處理,即字段映射和映射后的數(shù)據(jù)發(fā)送至外部系統(tǒng)。 發(fā)送響應(yīng)之前的字段映射,將SAP內(nèi)部結(jié)構(gòu)上的數(shù)據(jù)映射到外部結(jié)構(gòu)上的處理邏輯如下圖: 字段映射完畢之后,調(diào)用函數(shù)/AIF/SEND_WITH_PROXY將映射好的結(jié)構(gòu)發(fā)送出去。發(fā)送的目標(biāo)系統(tǒng)通過Logical Port指定,其值包含在下圖第15行高亮的變量里。 關(guān)于Logical Port在Web Service消費(fèi)場景中的用途,Jerry已經(jīng)在他的SAP博客中詳細(xì)介紹過,這里不再重復(fù): https://blogs./2014/05/20/step-by-step-to-create-consume-and-trace-web-service-in-abap-system/ 而我們仔細(xì)觀察Logical Port的獲取,這個值是通過好幾個參數(shù)共同決定的。 IF_CONF_API_SRO_CONSTANTS=>COMM-SCENARIO_ID: 這個字段是一個常量,值為SAP_COM_0424: SAP_COM_0424代表的communication scenario的配置步驟,可以從我之前介紹的SAP Best Practices Explorer網(wǎng)站下載。 這個communication scenario就是SAP針對實(shí)際系統(tǒng)集成場景抽象出來的一種開箱即用的模型,通過少量簡單的配置就能實(shí)現(xiàn)和其他系統(tǒng)做集成。 比如在SAP Cloud for Customer里同樣存在communication scenario的概念,用法也類似: 最后,我模擬外部系統(tǒng)調(diào)用S4CRM API來創(chuàng)建服務(wù)訂單,給大家一個更直觀的感受。 我使用SOAP UI這個軟件來發(fā)起請求。下圖可以看到我們出發(fā)了一個請求,創(chuàng)建一個事務(wù)類型為SVO1的服務(wù)訂單: SOAP UI里成功調(diào)用Web Service之后,到S4CRM系統(tǒng)查看我們剛才創(chuàng)建的服務(wù)訂單明細(xì): 最后大家或許會好奇真正執(zhí)行發(fā)送動作的函數(shù)/AIF/SEND_WITH_PROXY。 我們還是先來回憶SAP CRM中間件,比如CRM向ERP發(fā)送數(shù)據(jù)這個場景,最后實(shí)質(zhì)是執(zhí)行的RFC調(diào)用: 而S4CRM API使用的/AIF/SEND_WITH_PROXY,這個函數(shù)的前綴AIF代表Application Interface Framework, 是SAP Netweaver上的一個Addon,一個輕量級的數(shù)據(jù)集成中間件的解決方案。 關(guān)于AIF的更多介紹,大家可以閱讀下面這篇SAP博客: https://blogs./2012/04/03/sap-aif-so-what-is-it-all-about/ 我們成都S4CRM團(tuán)隊(duì)負(fù)責(zé)開發(fā)的API還在不斷的功能增強(qiáng)中,敬請期待。感謝大家的閱讀。 相關(guān)閱讀 要獲取更多Jerry的原創(chuàng)文章,請關(guān)注公眾號"汪子熙": |
|