SAP產(chǎn)品Field Extensibility(sap產(chǎn)品的特點)

      網(wǎng)友投稿 653 2025-03-31

      SAP開發(fā)人員的工作職責(zé),除了實現(xiàn)軟件的功能性需求外,還會花費相當(dāng)?shù)木崿F(xiàn)一些非功能性需求,來滿足所謂的SAP Product Standard(產(chǎn)品標(biāo)準(zhǔn))。這些產(chǎn)品標(biāo)準(zhǔn),包含在SAP項目實施中大顯身手的Extensibility,為客戶業(yè)務(wù)流程的安全運行保駕護(hù)航的Security,也有看起來不太起眼,但實際上體現(xiàn)了SAP作為一家偉大企業(yè)所具有的社會擔(dān)當(dāng)?shù)腁ccessibility,以及Internationalization等等。

      今天咱們就來說說SAP產(chǎn)品的Extensibility。盡管SAP產(chǎn)品對現(xiàn)實世界中的業(yè)務(wù)流程做了一定程度的抽象,但是部分客戶在實際使用過程中仍然會發(fā)現(xiàn)自己企業(yè)有些特殊的業(yè)務(wù)流程無法用SAP產(chǎn)品的標(biāo)準(zhǔn)功能來支持。此時SAP產(chǎn)品的Extensibility就有了用武之地:所謂Extensibility,即SAP產(chǎn)品的底層框架提供了足夠的靈活性,確保客戶和實施伙伴借助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)實現(xiàn)本身和被增強(qiáng)的SAP標(biāo)準(zhǔn)資源是不同的實體,分別存儲于不同的包內(nèi)。每次版本升級時,增強(qiáng)實現(xiàn)本身不會受到任何影響;而修改,則改動了SAP產(chǎn)品的標(biāo)準(zhǔn)代碼或模型,每次版本升級這些修改都會全部丟失掉。而且在基于Netweaver的Cloud產(chǎn)品里,比如S/4HANA Cloud和SAP Cloud for Customer,客戶和實施伙伴沒有任何途徑直接去修改Netweaver后臺的資源。

      SAP產(chǎn)品的Extensibility分為Field Extensibility和Process Extensibility。Field Extensibility,即用戶可直接在瀏覽器里,通過簡單的步驟在UI上期望的區(qū)域創(chuàng)建新的字段,我們稱其為擴(kuò)展字段(Extension Field)。有時候我們又會在這個術(shù)語前加上Simple的前綴,這個前綴強(qiáng)調(diào),客戶在創(chuàng)建新字段時,既不需要具備任何技術(shù)知識,也不需要了解該產(chǎn)品底層的數(shù)據(jù)模型的設(shè)計細(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(面向切面編程)。

      本文會介紹SAP CRM和S/4HANA的Field Extensibility。本文的后續(xù),SAP Cloud for Customer(C4C)的Field Extensibility,會由Jerry的同事,SAP成都研究院C4C開發(fā)團(tuán)隊的Boris來介紹。

      SAP CRM Field Extensibility

      SAP CRM的擴(kuò)展字段的創(chuàng)建通過Application Enhancement Tool(AET)這個工具完成。用戶在創(chuàng)建擴(kuò)展字段之前,先要進(jìn)入配置模式(Configuration mode),然后可以進(jìn)行擴(kuò)展字段創(chuàng)建的UI會自動被高亮。

      點擊高亮區(qū)域后,即可看到創(chuàng)建字段的按鈕。點Create Field進(jìn)入擴(kuò)展字段的創(chuàng)建向?qū)В?/p>

      這里需要維護(hù)待創(chuàng)建擴(kuò)展字段的明細(xì)信息,比如字段標(biāo)簽,字段類型,長度,字段所在的BO模型(下圖的ORDERADM_H)等等。

      上圖我創(chuàng)建了一個標(biāo)簽為city name的擴(kuò)展字段,保存并激活后,在UI上顯示如下。

      這一切步驟僅僅幾分鐘內(nèi)就可完成,然而背后發(fā)生的事情遠(yuǎn)遠(yuǎn)沒有這么簡單。為了實現(xiàn)Simple Field Extensibility,SAP開發(fā)人員需要進(jìn)行一系列的開發(fā),我們稱其為Extensibility registration and enablement。這種開發(fā)需要SAP Extensibility框架開發(fā)人員和SAP應(yīng)用開發(fā)人員雙方共同參與。因為盡管從客戶眼中看到的效果,僅僅是UI新出現(xiàn)了一個擴(kuò)展字段,然而這只是冰山一角——后臺的數(shù)據(jù)庫表,BO模型和每一個交互層相關(guān)的接口數(shù)據(jù)結(jié)構(gòu)也應(yīng)該自動被該擴(kuò)展字段所增強(qiáng)。

      下面是一些例子,我在UI創(chuàng)建的標(biāo)簽為city name的擴(kuò)展字段,自動出現(xiàn)在后臺數(shù)據(jù)庫表中:

      和CRM Order相關(guān)的函數(shù)的接口結(jié)構(gòu)也自動包含了這個擴(kuò)展字段:

      One Order的BO模型的BTAdminH節(jié)點也自動被這個擴(kuò)展字段增強(qiáng)。

      那么Extensibility框架怎么知道當(dāng)擴(kuò)展字段被創(chuàng)建時,這些屬于某個應(yīng)用程序的資源也需要被增強(qiáng)呢?原來,SAP Extensibility框架開發(fā)人員和SAP應(yīng)用開發(fā)人員達(dá)成了一個契約:Extensibility框架開發(fā)人員定義了一個注冊表,應(yīng)用開發(fā)人員如果想讓自己負(fù)責(zé)的UI支持Simple Field Extensibility,需要把自己應(yīng)用的各種需要被框架自動增強(qiáng)的模型信息和數(shù)據(jù)庫表信息填寫到這個注冊表里,這樣當(dāng)用戶使用AET工具進(jìn)行增強(qiáng)時,Extensibility框架就知道到底有哪些應(yīng)用層相關(guān)的模型也需要跟著增強(qiáng)。

      這個注冊表的外觀見下圖:

      除了注冊之外,應(yīng)用開發(fā)人員還有很多其他事情要做,因此SAP內(nèi)部有個Application Extensibility Guideline的編程規(guī)范,我們做開發(fā)時就是照著這個文檔來的。

      如果實施伙伴自己開發(fā)了一個UI,也想讓其支持Simple Field Extensibility,那么也需要按照這個Guideline來開發(fā)。

      我以前做過一個例子供大家參考:

      注冊表的填寫:

      SAP產(chǎn)品的Field Extensibility(sap產(chǎn)品的特點)

      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顧問朋友們會不時問我,"為什么我的AET UI看不到Create Field的按鈕,或者變成灰色了?”其實原因不外乎下面三種:

      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ò)展字段,在運行時是如何畫到UI上的呢?

      簡單地說,CRM WebClient UI的視圖配置信息(即視圖上需要顯示的字段明細(xì),字段間的相對位置,字段標(biāo)簽等等),都維護(hù)在一個所謂Configuration Context的實體中,以16位的GUID標(biāo)識。

      Context內(nèi)容以XML格式存儲在數(shù)據(jù)庫表BSP_DL_XMLSTRX2里。

      運行時,UI框架首先從上述數(shù)據(jù)庫表里把XML數(shù)據(jù)讀出來,解析成DOM, 然后根據(jù)DOM里每個節(jié)點對應(yīng)的不同UI控件類型,實例化不同的UI控件。比如XML里定義的某個字段類型為inputfield, 則創(chuàng)建一個CL_THTMLB_INPUTFIELD類的實例。Jerry在之前的公眾號文章SAP UI和Salesforce UI開發(fā)漫談介紹過,每個WebClient UI支持的控件都會有一個類似SAP UI5中的Render類,負(fù)責(zé)生成該控件對應(yīng)的原生HTML代碼。而將AET創(chuàng)建出來的擴(kuò)展字段添加到UI上,從UI視圖配置的角度講,僅僅是在XML源代碼里增加了一個擴(kuò)展字段對應(yīng)的節(jié)點,如下圖所示:

      更多關(guān)于擴(kuò)展字段在運行時的渲染原理講解,請參考我的博客:

      https://blogs.sap.com/2016/12/22/how-extension-field-created-by-aet-is-rendered-in-web-client-ui/

      SAP S/4HANA Extensibility

      和SAP CRM在具體的應(yīng)用程序UI上直接創(chuàng)建擴(kuò)展字段稍有不同,S/4HANA通過一個統(tǒng)一的Tile(Custom Fields and Logic)作為入口來創(chuàng)建擴(kuò)展字段:

      擴(kuò)展字段的明細(xì)維護(hù)界面和SAP CRM的AET工具大同小異。下圖的Business Context指用戶希望這個字段出現(xiàn)在S/4HANA Fiori應(yīng)用,Product Master的明細(xì)界面的General區(qū)域內(nèi)。

      擴(kuò)展字段創(chuàng)建完畢后,客戶進(jìn)到Product Master明細(xì)頁面內(nèi),點擊右鍵然后從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ù)了兩個ABAP DDIC include結(jié)構(gòu),意思是一旦這個擴(kuò)展字段創(chuàng)建保存后,會自動出現(xiàn)在這兩個DDIC include結(jié)構(gòu)上。

      從注冊表上方高亮的標(biāo)簽頁還可看出,在S/4HANA里通過瀏覽器創(chuàng)建的這些擴(kuò)展字段,除了直接顯示在Fiori UI之外,還能放到CDS view,OData模型,Web Service,IDoc這些模型中去。注冊表里出現(xiàn)的這些選項僅僅表明它們可以支持用Extensibility擴(kuò)展框架添加擴(kuò)展字段,至于是否真正把擴(kuò)展字段放進(jìn)去,由客戶自行決定。通過點擊Enable Usage即可將擴(kuò)展字段添加到對應(yīng)模型中去。

      那么顯示在Fiori UI上的S/4HANA擴(kuò)展字段,在運行時又是如何被渲染出來的呢?為了回答這個問題,我們先分析當(dāng)我們把擴(kuò)展字段添加到Fiori UI時,F(xiàn)iori UI發(fā)送給S/4HANA后臺的HTTP請求到底包含了哪些信息。

      使用Jerry之前的公眾號文章 Jerry和您聊聊Chrome開發(fā)者工具介紹的老套路,用Chrome開發(fā)者工具找到這個HTTP請求的明細(xì)。請求的payload是一個JSON字符串,保存到本地詳細(xì)研究,里面有7個重要的字段。

      1. jstype: sap.ui.comp.smartfield.SmartField

      表明該擴(kuò)展字段在Fiori UI視圖中的實現(xiàn)類型為Smart Field。什么是Smart Field?它也是UI5提供的控件之一,但和sap.m.Button, sap.m.Input這些擁有具體類型的UI控件不同,Smart Field在XML視圖開發(fā)階段,并沒有和任何確定的UI顯示類型綁定,實際上只是一個占位符。下圖是一個Smart Field的例子,僅僅憑借這個XML視圖片段,我們根本不知道id為idPrice的Smart Field,在運行時到底會被渲染成一個什么樣的UI5控件。相反,該控件的類型,在運行時才能決定下來,取決于其綁定的字段Price在OData模型的元數(shù)據(jù)中具有何種注解(annotation)。

      在我的例子里,字段Price在元數(shù)據(jù)中被注解為一個擁有單位的Decimal字段,其代為字段為OData模型里另一個字段:CurrencyCode。

      因此在運行時,這個Smart Field會被UI5框架渲染成兩個UI5控件,一個控件顯示價格的數(shù)字, 綁定到OData模型上的字段Price,另一個控件顯示價格單位,綁定到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ò)展字段到底添加到哪個Fiori應(yīng)用的哪一個具體UI區(qū)域。ID前半部分的mdm.cmd.product.maintain代表S/4HANA Product Master這個Fiori應(yīng)用,sap.suite.ui.generic.template.ObjectPage.view.Detail代表這個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模型的字段名稱。我們可以做個實驗:在Fiori UI上該擴(kuò)展字段里隨便維護(hù)一個值,比如"1.7", 然后保存。關(guān)掉UI再重新打開,很容易在Chrome開發(fā)者工具里觀察到從后臺返回的OData響應(yīng)結(jié)構(gòu)里,有一個名為"YY1_JDKminimumversionJ_PRD"的字段包含了"1.7"這個值。Fiori UI的擴(kuò)展字段正是綁定到了該模型字段上,因而能顯示出"1.7"。

      4. fileName

      5. layer:CUSTOMER,packageName:$tmp

      這幾個字段需要聯(lián)合起來解釋。前面CRM章節(jié)已經(jīng)介紹過,SAP CRM WebClient UI視圖的配置信息,以XML的格式維護(hù)在后臺數(shù)據(jù)庫表中。然而S/4HANA Fiori應(yīng)用因為基于UI5開發(fā),不存在這種配置信息對應(yīng)的存儲數(shù)據(jù)庫表,而是用文件的方式,把擴(kuò)展字段和Fiori UI的對應(yīng)關(guān)系存儲起來,放到一個特殊的倉庫里。文件的內(nèi)容大體上就是我現(xiàn)在正在介紹的從Chrome開發(fā)者工具里觀察到的JSON字符串,文件存儲的區(qū)域稱為LREP(Layered Repository)。LREP實際是ABAP實現(xiàn)的一個文件系統(tǒng),可以用report /UIF/GET_CHANGES_4_TARGET瀏覽其內(nèi)容。

      執(zhí)行report,最醒目的就是這幾個layer,這也是LREP命名的由來,一個分層的文件系統(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)可以通過配置放到一個可以傳輸?shù)腁BAP包里,那么Partner在Fiori UI上創(chuàng)建的擴(kuò)展字段均存儲在這個ABAP包內(nèi),從開發(fā)系統(tǒng)傳到測試和生產(chǎn)系統(tǒng)。

      Customer layer:客戶通過S/4HANA的擴(kuò)展工具做的增強(qiáng),一般都配置為存儲于$tmp包內(nèi),不可傳輸,對同一系統(tǒng)的其他所有用戶均可見。

      Draft layer:和本文主題無關(guān),用于S/4HANA的Draft概念處理,參考SAP help:https://help.sap.com/viewer/468a97775123488ab3345a0c48cadd8f/1709 002/en-US/ed9aa41c563a44b18701529c8327db4d.html

      User layer:存儲personalization信息,僅對創(chuàng)建該資源的用戶可見。

      為什么要引入這個分層機(jī)制呢?還是為了實現(xiàn)文章開頭提到的中心思想:確保合作伙伴和客戶做的增強(qiáng)不會因為SAP的產(chǎn)品升級而丟失。通過內(nèi)容的分層存儲,SAP,合作伙伴和客戶做的內(nèi)容彼此隔離,互不影響。在運行時,假設(shè)對于同一UI模型,SAP,合作伙伴和客戶均有各自的資源,則最終用戶看到的UI是這些資源的一個并集,我們稱產(chǎn)生這個并集的過程為Merge。在Merge過程中如果遇到?jīng)_突,比如一個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é)果如下。點擊按鈕顯示LREP里這個文件的完整內(nèi)容:

      可以發(fā)現(xiàn)該文件內(nèi)容就是我們在Chrome開發(fā)者工具里觀察到的從Fiori UI發(fā)送到S/4HANA后臺服務(wù)器的HTTP請求的payload:

      因此,我們在Fiori UI從右鍵菜單的Available Fields里選擇擴(kuò)展字段放到Fiori UI上時,F(xiàn)iori UI通過HTTP請求將該擴(kuò)展字段的明細(xì),即包含了迄今為止我們分析的這幾個字段的JSON字符串發(fā)送到S/4HANA后臺,存儲在LREP中。

      Fiori UI與S/4HANA LREP的交互通過sap.ui.fl.LrepConnector.js完成,由后者調(diào)用LREP暴露出來的service來實現(xiàn)文件內(nèi)容存儲。

      6. reference: mdm.cmd.product.maintain.Component

      Product Master這個Fiori應(yīng)用的Component ID,可以在BSP應(yīng)用MD_PROD_MAS_S1的Component.js里找到。前面說過了,Product Master這個Fiori應(yīng)用基于Smart Template構(gòu)建,并沒有自己的前端實現(xiàn),因此Component.js只是一個wrapper,僅有不到6行代碼。

      當(dāng)包含了擴(kuò)展字段的Fiori UI即將渲染時,首先有一個HTTP請求將待渲染UI包含的所有擴(kuò)展字段信息從LREP中讀取出來。注意下圖藍(lán)色高亮區(qū)域內(nèi)的/sap/bc/lrep/flex/data, 這就是S/4HANA后臺LREP暴露給Fiori UI的存儲服務(wù)。

      Fiori UI讀取到LREP返回的JSON后,解析到changeType為addFields,于是調(diào)用Fiori UI框架對應(yīng)的處理邏輯,根據(jù)JSON里包含的擴(kuò)展字段明細(xì)將其渲染出來。這實際上就是前面提到的,SAP layer的Fiori標(biāo)準(zhǔn)UI同Customer layer的擴(kuò)展字段的Merge動作。

      擴(kuò)展字段Merge到Fiori UI的入口在AddFields.applyChange:

      addElementIntoGroupElement會將擴(kuò)展字段添加到Fiori UI對應(yīng)的區(qū)域內(nèi):

      addElementIntoGroupElement又會調(diào)用createControl將擴(kuò)展字段的定義轉(zhuǎn)換成對應(yīng)的UI5控件實例,后者的Render負(fù)責(zé)將控件實例渲染成原生的HTML代碼。至此,S/4HANA擴(kuò)展字段的渲染就完成了。

      要獲取更多Jerry的原創(chuàng)技術(shù)文章,請關(guān)注公眾號"汪子熙"。

      ABAP ERP 軟件開發(fā)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:項目項目管理系統(tǒng)
      下一篇:excel定位快捷鍵(excel定位快捷鍵,怎么取消定位)
      相關(guān)文章
      亚洲av中文无码乱人伦在线r▽| 国产精品亚洲色图| 亚洲成AⅤ人影院在线观看| 亚洲一级毛片免观看| 亚洲最大的成网4438| 亚洲成色在线影院| 亚洲不卡av不卡一区二区| 伊人久久大香线蕉亚洲| 91麻豆精品国产自产在线观看亚洲| 亚洲国产中文字幕在线观看| 亚洲精品无码久久久久久| 亚洲欧洲免费无码| 亚洲人成色777777老人头| 国产精品亚洲精品观看不卡| 亚洲国产午夜电影在线入口| 亚洲综合激情另类小说区| 久久精品国产亚洲AV大全| 亚洲精品tv久久久久久久久| 日本亚洲成高清一区二区三区| 亚洲国产精品无码久久SM| 久久国产精品亚洲综合| 亚洲一区中文字幕久久| 亚洲成a人片在线观看中文!!!| 亚洲婷婷在线视频| 亚洲无吗在线视频| 亚洲日本VA午夜在线影院| 亚洲AV成人无码网站| 亚洲?v无码国产在丝袜线观看| avtt亚洲天堂| 国产亚洲精品AA片在线观看不加载| 老司机亚洲精品影视www| 亚洲国产AV无码专区亚洲AV| 亚洲AV综合色区无码一区爱AV| 亚洲欧洲一区二区| 亚洲国产日韩女人aaaaaa毛片在线| 久久久久精品国产亚洲AV无码| 亚洲国产精品网站在线播放 | 亚洲一区影音先锋色资源| 亚洲国产成人久久77| 国产AV旡码专区亚洲AV苍井空| 亚洲av永久无码天堂网|