這篇文章將為大家詳細(xì)講解有關(guān)怎樣分析SAP產(chǎn)品的Field Extensibility,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、拉孜網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為拉孜等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
SAP開發(fā)人員的工作職責(zé),除了實(shí)現(xiàn)軟件的功能性需求外,還會(huì)花費(fèi)相當(dāng)?shù)木?shí)現(xiàn)一些非功能性需求,來滿足所謂的SAP Product Standard(產(chǎn)品標(biāo)準(zhǔn))。這些產(chǎn)品標(biāo)準(zhǔn),包含在SAP項(xiàng)目實(shí)施中大顯身手的Extensibility,為客戶業(yè)務(wù)流程的安全運(yùn)行保駕護(hù)航的Security,也有看起來不太起眼,但實(shí)際上體現(xiàn)了SAP作為一家偉大企業(yè)所具有的社會(huì)擔(dān)當(dāng)?shù)腁ccessibility,以及Internationalization等等。
今天咱們就來說說SAP產(chǎn)品的Extensibility。盡管SAP產(chǎn)品對現(xiàn)實(shí)世界中的業(yè)務(wù)流程做了一定程度的抽象,但是部分客戶在實(shí)際使用過程中仍然會(huì)發(fā)現(xiàn)自己企業(yè)有些特殊的業(yè)務(wù)流程無法用SAP產(chǎn)品的標(biāo)準(zhǔn)功能來支持。此時(shí)SAP產(chǎn)品的Extensibility就有了用武之地:所謂Extensibility,即SAP產(chǎn)品的底層框架提供了足夠的靈活性,確??蛻艉蛯?shí)施伙伴借助SAP提供的標(biāo)準(zhǔn)工具,能夠?qū)AP產(chǎn)品進(jìn)行增強(qiáng)(Enhancement),以此來滿足自己特殊的業(yè)務(wù)需求。這種增強(qiáng)和直接修改SAP產(chǎn)品(Modification)的區(qū)別在于,前者是SAP推薦的方式,增強(qiáng)實(shí)現(xiàn)本身和被增強(qiáng)的SAP標(biāo)準(zhǔn)資源是不同的實(shí)體,分別存儲(chǔ)于不同的包內(nèi)。每次版本升級時(shí),增強(qiáng)實(shí)現(xiàn)本身不會(huì)受到任何影響;而修改,則改動(dòng)了SAP產(chǎn)品的標(biāo)準(zhǔn)代碼或模型,每次版本升級這些修改都會(huì)全部丟失掉。而且在基于Netweaver的Cloud產(chǎn)品里,比如S/4HANA Cloud和SAP Cloud for Customer,客戶和實(shí)施伙伴沒有任何途徑直接去修改Netweaver后臺(tái)的資源。
SAP產(chǎn)品的Extensibility分為Field Extensibility和Process Extensibility。Field Extensibility,即用戶可直接在瀏覽器里,通過簡單的步驟在UI上期望的區(qū)域創(chuàng)建新的字段,我們稱其為擴(kuò)展字段(Extension Field)。有時(shí)候我們又會(huì)在這個(gè)術(shù)語前加上Simple的前綴,這個(gè)前綴強(qiáng)調(diào),客戶在創(chuàng)建新字段時(shí),既不需要具備任何技術(shù)知識(shí),也不需要了解該產(chǎn)品底層的數(shù)據(jù)模型的設(shè)計(jì)細(xì)節(jié),而是通過類似我們在Windows系統(tǒng)下安裝軟件的向?qū)б粯?,通過向?qū)崾镜暮唵尾襟E即可完成。Process Extensibility,強(qiáng)調(diào)流程的增強(qiáng),即通過SAP提供的增強(qiáng)工具,比如Business Add-In(BAdI), Post-Exit等等,對SAP產(chǎn)品的標(biāo)準(zhǔn)流程做一定程度的增強(qiáng)。沒有接觸過BAdI和Post-Exit的朋友們,如果做過Java Spring開發(fā),可以把BAdI類比成Spring里各種各樣的hook,把Post-Exit類比成Spring AOP(面向切面編程)。
下面會(huì)介紹SAP CRM和S/4HANA的Field Extensibility。
SAP CRM的擴(kuò)展字段的創(chuàng)建通過Application Enhancement Tool(AET)這個(gè)工具完成。用戶在創(chuàng)建擴(kuò)展字段之前,先要進(jìn)入配置模式(Configuration mode),然后可以進(jìn)行擴(kuò)展字段創(chuàng)建的UI會(huì)自動(dòng)被高亮。
點(diǎn)擊高亮區(qū)域后,即可看到創(chuàng)建字段的按鈕。點(diǎn)Create Field進(jìn)入擴(kuò)展字段的創(chuàng)建向?qū)В?/p>
這里需要維護(hù)待創(chuàng)建擴(kuò)展字段的明細(xì)信息,比如字段標(biāo)簽,字段類型,長度,字段所在的BO模型(下圖的ORDERADM_H)等等。
上圖我創(chuàng)建了一個(gè)標(biāo)簽為city name的擴(kuò)展字段,保存并激活后,在UI上顯示如下。
這一切步驟僅僅幾分鐘內(nèi)就可完成,然而背后發(fā)生的事情遠(yuǎn)遠(yuǎn)沒有這么簡單。為了實(shí)現(xiàn)Simple Field Extensibility,SAP開發(fā)人員需要進(jìn)行一系列的開發(fā),我們稱其為Extensibility registration and enablement。這種開發(fā)需要SAP Extensibility框架開發(fā)人員和SAP應(yīng)用開發(fā)人員雙方共同參與。因?yàn)楸M管從客戶眼中看到的效果,僅僅是UI新出現(xiàn)了一個(gè)擴(kuò)展字段,然而這只是冰山一角——后臺(tái)的數(shù)據(jù)庫表,BO模型和每一個(gè)交互層相關(guān)的接口數(shù)據(jù)結(jié)構(gòu)也應(yīng)該自動(dòng)被該擴(kuò)展字段所增強(qiáng)。
下面是一些例子,我在UI創(chuàng)建的標(biāo)簽為city name的擴(kuò)展字段,自動(dòng)出現(xiàn)在后臺(tái)數(shù)據(jù)庫表中:
和CRM Order相關(guān)的函數(shù)的接口結(jié)構(gòu)也自動(dòng)包含了這個(gè)擴(kuò)展字段:
One Order的BO模型的BTAdminH節(jié)點(diǎn)也自動(dòng)被這個(gè)擴(kuò)展字段增強(qiáng)。
那么Extensibility框架怎么知道當(dāng)擴(kuò)展字段被創(chuàng)建時(shí),這些屬于某個(gè)應(yīng)用程序的資源也需要被增強(qiáng)呢?原來,SAP Extensibility框架開發(fā)人員和SAP應(yīng)用開發(fā)人員達(dá)成了一個(gè)契約:Extensibility框架開發(fā)人員定義了一個(gè)注冊表,應(yīng)用開發(fā)人員如果想讓自己負(fù)責(zé)的UI支持Simple Field Extensibility,需要把自己應(yīng)用的各種需要被框架自動(dòng)增強(qiáng)的模型信息和數(shù)據(jù)庫表信息填寫到這個(gè)注冊表里,這樣當(dāng)用戶使用AET工具進(jìn)行增強(qiáng)時(shí),Extensibility框架就知道到底有哪些應(yīng)用層相關(guān)的模型也需要跟著增強(qiáng)。
這個(gè)注冊表的外觀見下圖:
除了注冊之外,應(yīng)用開發(fā)人員還有很多其他事情要做,因此SAP內(nèi)部有個(gè)Application Extensibility Guideline的編程規(guī)范,我們做開發(fā)時(shí)就是照著這個(gè)文檔來的。
如果實(shí)施伙伴自己開發(fā)了一個(gè)UI,也想讓其支持Simple Field Extensibility,那么也需要按照這個(gè)Guideline來開發(fā)。
我以前做過一個(gè)例子供大家參考:
注冊表的填寫:
https://blogs.sap.com/2013/10/25/step-by-step-to-enable-your-genil-component-with-aet
按照Application Extensibility Guideline讓您的應(yīng)用支持Simple Field Extensibility
https://blogs.sap.com/2013/10/25/step-by-step-to-enable-your-genil-component-with-aet-part-two/
有的CRM顧問朋友們會(huì)不時(shí)問我,"為什么我的AET UI看不到Create Field的按鈕,或者變成灰色了?”其實(shí)原因不外乎下面三種:
1. 您的用戶沒有AET使用權(quán)限
2. 您的系統(tǒng)上AET沒有正確setup起來
3. 您選擇的UI不可被AET增強(qiáng)(即UI對應(yīng)的UI沒有注冊成"可擴(kuò)展”)
在給SAP提incident之前,可以按照我這篇博客的步驟,自行去調(diào)試找到原因:
https://blogs.sap.com/2013/09/29/inside-aet-why-create-field-button-is-visible-in-some-ui-while-invisible-in-others/
用AET創(chuàng)建的這些擴(kuò)展字段,在運(yùn)行時(shí)是如何畫到UI上的呢?
簡單地說,CRM WebClient UI的視圖配置信息(即視圖上需要顯示的字段明細(xì),字段間的相對位置,字段標(biāo)簽等等),都維護(hù)在一個(gè)所謂Configuration Context的實(shí)體中,以16位的GUID標(biāo)識(shí)。
Context內(nèi)容以XML格式存儲(chǔ)在數(shù)據(jù)庫表BSP_DL_XMLSTRX2里。
運(yùn)行時(shí),UI框架首先從上述數(shù)據(jù)庫表里把XML數(shù)據(jù)讀出來,解析成DOM, 然后根據(jù)DOM里每個(gè)節(jié)點(diǎn)對應(yīng)的不同UI控件類型,實(shí)例化不同的UI控件。比如XML里定義的某個(gè)字段類型為inputfield, 則創(chuàng)建一個(gè)CL_THTMLB_INPUTFIELD類的實(shí)例。Jerry在之前的公眾號文章SAP UI和Salesforce UI開發(fā)漫談介紹過,每個(gè)WebClient UI支持的控件都會(huì)有一個(gè)類似SAP UI5中的Render類,負(fù)責(zé)生成該控件對應(yīng)的原生HTML代碼。而將AET創(chuàng)建出來的擴(kuò)展字段添加到UI上,從UI視圖配置的角度講,僅僅是在XML源代碼里增加了一個(gè)擴(kuò)展字段對應(yīng)的節(jié)點(diǎn),如下圖所示:
更多關(guān)于擴(kuò)展字段在運(yùn)行時(shí)的渲染原理講解,請參考我的博客:
https://blogs.sap.com/2016/12/22/how-extension-field-created-by-aet-is-rendered-in-web-client-ui/
和SAP CRM在具體的應(yīng)用程序UI上直接創(chuàng)建擴(kuò)展字段稍有不同,S/4HANA通過一個(gè)統(tǒng)一的Tile(Custom Fields and Logic)作為入口來創(chuàng)建擴(kuò)展字段:
擴(kuò)展字段的明細(xì)維護(hù)界面和SAP CRM的AET工具大同小異。下圖的Business Context指用戶希望這個(gè)字段出現(xiàn)在S/4HANA Fiori應(yīng)用,Product Master的明細(xì)界面的General區(qū)域內(nèi)。
擴(kuò)展字段創(chuàng)建完畢后,客戶進(jìn)到Product Master明細(xì)頁面內(nèi),點(diǎn)擊右鍵然后從Available Fields列表里選擇出剛才創(chuàng)建的擴(kuò)展字段,即可將此擴(kuò)展字段顯示在Fiori UI上。
S/4HANA的應(yīng)用開發(fā)人員需要做的事情和前一章節(jié)介紹的SAP CRM類似,同樣需要做注冊。
下圖是S/4HANA Extensibility的注冊表。高亮的一行,代表我在擴(kuò)展字段創(chuàng)建對話框從Business Context下拉菜單里選中的"Product Master General":
上述注冊表針對Product Master General維護(hù)了兩個(gè)ABAP DDIC include結(jié)構(gòu),意思是一旦這個(gè)擴(kuò)展字段創(chuàng)建保存后,會(huì)自動(dòng)出現(xiàn)在這兩個(gè)DDIC include結(jié)構(gòu)上。
從注冊表上方高亮的標(biāo)簽頁還可看出,在S/4HANA里通過瀏覽器創(chuàng)建的這些擴(kuò)展字段,除了直接顯示在Fiori UI之外,還能放到CDS view,OData模型,Web Service,IDoc這些模型中去。注冊表里出現(xiàn)的這些選項(xiàng)僅僅表明它們可以支持用Extensibility擴(kuò)展框架添加擴(kuò)展字段,至于是否真正把擴(kuò)展字段放進(jìn)去,由客戶自行決定。通過點(diǎn)擊Enable Usage即可將擴(kuò)展字段添加到對應(yīng)模型中去。
那么顯示在Fiori UI上的S/4HANA擴(kuò)展字段,在運(yùn)行時(shí)又是如何被渲染出來的呢?為了回答這個(gè)問題,我們先分析當(dāng)我們把擴(kuò)展字段添加到Fiori UI時(shí),F(xiàn)iori UI發(fā)送給S/4HANA后臺(tái)的HTTP請求到底包含了哪些信息。
使用Jerry之前的公眾號文章 Jerry和您聊聊Chrome開發(fā)者工具介紹的老套路,用Chrome開發(fā)者工具找到這個(gè)HTTP請求的明細(xì)。請求的payload是一個(gè)JSON字符串,保存到本地詳細(xì)研究,里面有7個(gè)重要的字段。
1. jstype: sap.ui.comp.smartfield.SmartField
表明該擴(kuò)展字段在Fiori UI視圖中的實(shí)現(xiàn)類型為Smart Field。什么是Smart Field?它也是UI5提供的控件之一,但和sap.m.Button, sap.m.Input這些擁有具體類型的UI控件不同,Smart Field在XML視圖開發(fā)階段,并沒有和任何確定的UI顯示類型綁定,實(shí)際上只是一個(gè)占位符。下圖是一個(gè)Smart Field的例子,僅僅憑借這個(gè)XML視圖片段,我們根本不知道id為idPrice的Smart Field,在運(yùn)行時(shí)到底會(huì)被渲染成一個(gè)什么樣的UI5控件。相反,該控件的類型,在運(yùn)行時(shí)才能決定下來,取決于其綁定的字段Price在OData模型的元數(shù)據(jù)中具有何種注解(annotation)。
在我的例子里,字段Price在元數(shù)據(jù)中被注解為一個(gè)擁有單位的Decimal字段,其代為字段為OData模型里另一個(gè)字段:CurrencyCode。
因此在運(yùn)行時(shí),這個(gè)Smart Field會(huì)被UI5框架渲染成兩個(gè)UI5控件,一個(gè)控件顯示價(jià)格的數(shù)字, 綁定到OData模型上的字段Price,另一個(gè)控件顯示價(jià)格單位,綁定到OData模型的字段CurrencyCode。
更多Smart Field和渲染邏輯的講解,請參考我的博客:
https://blogs.sap.com/2016/03/14/currency-example-how-smart-field-works/
2. id:mdm.cmd.product.maintain::sap.suite.ui.generic.template.ObjectPage.view.Detail::C_Product...
表明了該擴(kuò)展字段到底添加到哪個(gè)Fiori應(yīng)用的哪一個(gè)具體UI區(qū)域。ID前半部分的mdm.cmd.product.maintain代表S/4HANA Product Master這個(gè)Fiori應(yīng)用,sap.suite.ui.generic.template.ObjectPage.view.Detail代表這個(gè)Fiori應(yīng)用是基于SAP Smart Template框架構(gòu)建而成,擴(kuò)展字段所在的UI基于Smart Template的ObjectPage的Detail頁面構(gòu)建。
什么是Smart Template的ObjectPage?請參考我的博客:
https://blogs.sap.com/2016/05/03/my-understanding-about-how-object-page-in-smart-template-is-rendered/
3. YY1_JDKminimumversionJ_PRD
Fiori UI擴(kuò)展字段綁定的OData模型的字段名稱。我們可以做個(gè)實(shí)驗(yàn):在Fiori UI上該擴(kuò)展字段里隨便維護(hù)一個(gè)值,比如"1.7", 然后保存。關(guān)掉UI再重新打開,很容易在Chrome開發(fā)者工具里觀察到從后臺(tái)返回的OData響應(yīng)結(jié)構(gòu)里,有一個(gè)名為"YY1_JDKminimumversionJ_PRD"的字段包含了"1.7"這個(gè)值。Fiori UI的擴(kuò)展字段正是綁定到了該模型字段上,因而能顯示出"1.7"。
4. fileName
5. layer:CUSTOMER,packageName:$tmp
這幾個(gè)字段需要聯(lián)合起來解釋。前面CRM章節(jié)已經(jīng)介紹過,SAP CRM WebClient UI視圖的配置信息,以XML的格式維護(hù)在后臺(tái)數(shù)據(jù)庫表中。然而S/4HANA Fiori應(yīng)用因?yàn)榛赨I5開發(fā),不存在這種配置信息對應(yīng)的存儲(chǔ)數(shù)據(jù)庫表,而是用文件的方式,把擴(kuò)展字段和Fiori UI的對應(yīng)關(guān)系存儲(chǔ)起來,放到一個(gè)特殊的倉庫里。文件的內(nèi)容大體上就是我現(xiàn)在正在介紹的從Chrome開發(fā)者工具里觀察到的JSON字符串,文件存儲(chǔ)的區(qū)域稱為LREP(Layered Repository)。LREP實(shí)際是ABAP實(shí)現(xiàn)的一個(gè)文件系統(tǒng),可以用report /UIF/GET_CHANGES_4_TARGET瀏覽其內(nèi)容。
執(zhí)行report,最醒目的就是這幾個(gè)layer,這也是LREP命名的由來,一個(gè)分層的文件系統(tǒng)。
Vendor layer:即SAP layer,包含SAP發(fā)布的標(biāo)準(zhǔn)內(nèi)容。
Partner layer:Partner可以基于SAP layer的內(nèi)容做增強(qiáng)。例如同CRM AET一樣,Partner的增強(qiáng)可以通過配置放到一個(gè)可以傳輸?shù)腁BAP包里,那么Partner在Fiori UI上創(chuàng)建的擴(kuò)展字段均存儲(chǔ)在這個(gè)ABAP包內(nèi),從開發(fā)系統(tǒng)傳到測試和生產(chǎn)系統(tǒng)。
Customer layer:客戶通過S/4HANA的擴(kuò)展工具做的增強(qiáng),一般都配置為存儲(chǔ)于$tmp包內(nèi),不可傳輸,對同一系統(tǒng)的其他所有用戶均可見。
Draft layer:和本文主題無關(guān),用于S/4HANA的Draft概念處理,參考SAP help: https://help.sap.com/viewer/468a97775123488ab3345a0c48cadd8f/1709%20002/en-US/ed9aa41c563a44b18701529c8327db4d.html
User layer:存儲(chǔ)personalization信息,僅對創(chuàng)建該資源的用戶可見。
為什么要引入這個(gè)分層機(jī)制呢?還是為了實(shí)現(xiàn)文章開頭提到的中心思想:確保合作伙伴和客戶做的增強(qiáng)不會(huì)因?yàn)镾AP的產(chǎn)品升級而丟失。通過內(nèi)容的分層存儲(chǔ),SAP,合作伙伴和客戶做的內(nèi)容彼此隔離,互不影響。在運(yùn)行時(shí),假設(shè)對于同一UI模型,SAP,合作伙伴和客戶均有各自的資源,則最終用戶看到的UI是這些資源的一個(gè)并集,我們稱產(chǎn)生這個(gè)并集的過程為Merge。在Merge過程中如果遇到?jīng)_突,比如一個(gè)UI字段的標(biāo)簽,SAP,合作伙伴和客戶均有各自的定義,則Merge結(jié)果以優(yōu)先級最高的layer包含的內(nèi)容為準(zhǔn)。不同layer優(yōu)先級從低到高,即上圖report從上到下的layer依次為:
SAP->Partner->Customer->User。
再回到我們正在進(jìn)行的payload分析。執(zhí)行report,結(jié)果如下。點(diǎn)擊按鈕顯示LREP里這個(gè)文件的完整內(nèi)容:
可以發(fā)現(xiàn)該文件內(nèi)容就是我們在Chrome開發(fā)者工具里觀察到的從Fiori UI發(fā)送到S/4HANA后臺(tái)服務(wù)器的HTTP請求的payload:
因此,我們在Fiori UI從右鍵菜單的Available Fields里選擇擴(kuò)展字段放到Fiori UI上時(shí),F(xiàn)iori UI通過HTTP請求將該擴(kuò)展字段的明細(xì),即包含了迄今為止我們分析的這幾個(gè)字段的JSON字符串發(fā)送到S/4HANA后臺(tái),存儲(chǔ)在LREP中。
Fiori UI與S/4HANA LREP的交互通過sap.ui.fl.LrepConnector.js完成,由后者調(diào)用LREP暴露出來的service來實(shí)現(xiàn)文件內(nèi)容存儲(chǔ)。
6. reference: mdm.cmd.product.maintain.Component
Product Master這個(gè)Fiori應(yīng)用的Component ID,可以在BSP應(yīng)用MD_PROD_MAS_S1的Component.js里找到。前面說過了,Product Master這個(gè)Fiori應(yīng)用基于Smart Template構(gòu)建,并沒有自己的前端實(shí)現(xiàn),因此Component.js只是一個(gè)wrapper,僅有不到6行代碼。
當(dāng)包含了擴(kuò)展字段的Fiori UI即將渲染時(shí),首先有一個(gè)HTTP請求將待渲染UI包含的所有擴(kuò)展字段信息從LREP中讀取出來。注意下圖藍(lán)色高亮區(qū)域內(nèi)的/sap/bc/lrep/flex/data, 這就是S/4HANA后臺(tái)LREP暴露給Fiori UI的存儲(chǔ)服務(wù)。
Fiori UI讀取到LREP返回的JSON后,解析到changeType為addFields,于是調(diào)用Fiori UI框架對應(yīng)的處理邏輯,根據(jù)JSON里包含的擴(kuò)展字段明細(xì)將其渲染出來。這實(shí)際上就是前面提到的,SAP layer的Fiori標(biāo)準(zhǔn)UI同Customer layer的擴(kuò)展字段的Merge動(dòng)作。
擴(kuò)展字段Merge到Fiori UI的入口在AddFields.applyChange:
addElementIntoGroupElement會(huì)將擴(kuò)展字段添加到Fiori UI對應(yīng)的區(qū)域內(nèi):
addElementIntoGroupElement又會(huì)調(diào)用createControl將擴(kuò)展字段的定義轉(zhuǎn)換成對應(yīng)的UI5控件實(shí)例,后者的Render負(fù)責(zé)將控件實(shí)例渲染成原生的HTML代碼。至此,S/4HANA擴(kuò)展字段的渲染就完成了。
關(guān)于怎樣分析SAP產(chǎn)品的Field Extensibility就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。