天天看點

SAP S/4HANA系統CDS view擴充原理分析

After extension field is created, I would like to retrieve its data from interface view, like I_PRODUCT. That is, the extension field is already in MARA, I want to consume it via I_PRODUCT instead of MARA.

When using the following ABAP code, it does not work:

data: lt_table TYPE TABLE OF I_Product.

SELECT * INTO TABLE @lt_table FROM I_Product.           

The reason is corresponding extension field does not appear in SQL view of I_PRODUCT at all. Why?

Simply because the extension field is not enabled for I_PRODUCT.

The enablement should also be done in custom field logic tile:

(1). select your extension field.

(2). tab UIs and Reports:

(3). Click "Enable Usage" button:

Never forget to publish your change.

Once done, it works now:

我來解答這兩天我們讨論的問題。Key user 點了enable usage之後,如下圖這個例子,

為什麼之後我們 SELECT FROM I_PRPODUCTWD 就能把extension field一起select出來,這些extension field不是做在E_PRODUCT上嗎? E_PRODUCT 是通過association和I_PRODUCTWD連接配接起來的,為什麼select 能夠把association view裡的field一起讀出來?

首先,上述紅色的說法就是錯誤的,extension field并不是通過association從E_PRODUCT裡讀的. 我們要明确我們點enable usage的出發點是某個具體的extension field, 而不是從CDS view出發。選擇了具體的extension field之後,再選擇要extend的CDS view,點選publish,此時将會自動建立一個帶有目前extension field的extension view,對選中的CDS extensible view進行擴充。這樣造成的結果是,從SE11裡觀察SQL view能發現extension field會通過append的方式直接成為extensible view的一部分,這之後和E_PRODUCT再無任何關系。

比如這個extension view 在點publish時是什麼時候生成的?

你可以自己debug,在這個方法裡設個斷點,然後點publish,你會發現publish時,有10個object會自動生成,其中第三個就是上面圖裡的extension view.

那架構咋知道我這個extension field在publish時要生成這10個東西?

答案還是在registry裡:

如果想研究具體架構的generation實作,看這個class,裡面每個sub class負責一種特定的repository generation實作,

其中CL_CFD_ENH_CDS_ENH_ABSTRACT又包含了所有CDS view相關的generation邏輯,裡面又分了三種不同的類型。

所有這些協同工作,最後確定從application developer的眼裡,看到extension field在design time時即出現在extensible view本身。額外補充一點哈。

E_PRODUCT一個最主要的目的就是為了register使用,同時在建立custom field時點publish時,能夠自動生成一個E_Product的extension view。

如下圖。當然在此之前需要先去自動擴充Product table的這個字段,這也是在點publish時自動完成的。

然後當你需要把這個custom field暴露在上層的view時,比如I_ProductWD,這時去Jerry提到的點選Enable時就會生成I_ProductWD的extension view。

其實你如果點選對應的字段,你會發現其實就是從上面的E_Product的extension view裡去讀取的。

總結一下,I_ProductWD裡定義的E_PRODUCT的association更多是用于design time(register),之後在enable時知道如何建立extension view。然後有了extension view時,就跟E_Product沒有直接關系了,因為extension view:ZZ1_PRE47GXHDI6P2ZLO3ADGY4HHFE裡的内容是自動暴露為hosting view:I_PRODUCTWD的interface的。這也是為什麼select *能自動出來,并不需要通過association。

本文來自雲栖社群合作夥伴“汪子熙”,了解相關資訊可以關注微信公衆号"汪子熙"。