上一章講了 RAP開發中,New Service Definition,Metadata Extension,在Metadata 文件中 復習了 lineItem,selectionField,Search,ObjectModel,Value Help,headerInfo 等內容。
SAP學習筆記 - 開發45 - RAP開發 Managed App New Service Definition,Metadata Extension-CSDN博客
本章繼續學習RAP相關的知識,將其他兩個表的Metadata 也做一下:
-?Booking_M
- BookSuppl_M
目錄
1,Booking_M?
1-1,New Metadata Extension - Z04_PV_Booking_M
1-2,@Metadata.allowExtensions: true -?Z04_PV_Booking_M
1-3,@UI.facet -?Z04_PV_Travel_M
1-4,@UI:{ lineItem /?identification -?Z04_PV_Booking_M
1-5,@UI.headerInfo /?@UI.facet -?Z04_PV_Booking_M
2,BookSuppl_M
2-1,?New Metadata Extension - Z04_PV_BookSuppl_M
2-2,@UI.headerInfo /?@UI.facet -?Z04_PV_BookSuppl_M
3,完整的代碼(Metadata)和頁面截圖
3-1,Travel_M_MD
3-2,Booking_M_MD
3-3,BookSuppl_M_MD
4,Travel_M_MD?其他功能
4-1,@UI.textArrangement: #TEXT_ONLY -?Z04_PV_Travel_M_MD
a,@UI.textArrangement 的選項
b,使用示例
1. 在 CDS View 中定義
2. 效果對比
c,注意事項
d,常見問題
5,Booking_M_MD 其他功能
5-1,Search
5-2,@UI.textArrangement: #TEXT_ONLY -?Z04_PV_Booking_M_MD
以下是詳細內容。
1,Booking_M?
上一章做了Travel_M 的開發,本章繼續做剩下兩個表的開發。
- New Service Definition?
- Metadata Extension:lineItem,identification,Value Help,headerInfo 等
這一章想要干啥呢??
- 顯示 Travel 一覽
? 這個上一章已經做好了
- 點任意行,顯示Object Page
? 在這個位置,將會顯示Booking 列表,因為Travel - Booking 是1:N的關系
- 點擊 上圖Booking 列表里的任意一行,顯示 Booking的Object Page
-??Booking的Object Page 里面,將會顯示Booking的明細,以及 1:N的Booking Supplement 列表
- 點擊Booking Supplement 列表的任意一行,將會顯示 Object Page
- Object Page里面,將會顯示 Booking Supplement詳細內容
也就是把咱之前做的3個表給串起來,一層一層的都可以參考。
(Metadata的代碼,后面一并附上,可以拖到后面參考)
1-1,New Metadata Extension - Z04_PV_Booking_M
輸入Name,Description,Extended Entity,然后按Next
?
選模板,然后點Finish
?
里面先不加任何東西,這樣就會顯示為空,然后我們后面再慢慢加
?
1-2,@Metadata.allowExtensions: true -?Z04_PV_Booking_M
加了這行才會允許使用Metadata文件
?
1-3,@UI.facet -?Z04_PV_Travel_M
?
刷新一下,就是下面這個樣子
?
1-4,@UI:{ lineItem /?identification -?Z04_PV_Booking_M
設定列表中的顯示項目,以及Object Page顯示項目
TODO: 出了個Blocker錯誤,說Bookings 那塊兒沒數據可以顯示,找了半天也沒看出出來為啥
No items available.
If any exist, they will be displayed here.
利用可能なアイテムがありません
存在する場合は、ここに表示されます。
?
如果單獨看 Booking_M 的話,是可以查出來數據的呀
?
查了半天,我發現了確實是數據問題,好像用錯表了😓。
這也是往新建的表里插入數據的方法不同導致的。
-1 我用的方法:參照下面這種,直接把數據放內表里, 然后Insert
SAP學習筆記 - 開發37 - RAP開發流程的具體步驟, 建表,Data Model View,Projection View,Service,Service Binding,Publish-CSDN博客
DATA itab TYPE TABLE OF zt04_travel_m.itab = VALUE #(( CLIENT = '100' TRAVEL_ID = '00005172' BOOKING_ID = '0001' BOOKING_DATE = '20250703' CUSTOMER_ID = '000563' CARRIER_ID = 'LH' CONNECTION_ID = '0400' FLIGHT_DATE = '20250712' FLIGHT_PRICE = '1540.00 ' CURRENCY_CODE = 'EUR' BOOKING_STATUS = 'N'
LAST_CHANGED_AT = '20250625051010.0000000 ' )( 第二條數據 )...) ##NO_TEXT .DELETE FROM zt04_travel_m.INSERT zt04_travel_m FROM TABLE @itab.
?-2 這次因為是從/DMO 中的表,原封不動拷貝過來,數據也要拷過來,所以用下面這種較好
DELETE FROM zt04_Travel_m.DELETE FROM zt04_booking_m.DELETE FROM zt04_bookSuppl_m.INSERT zt04_Travel_m FROM ( SELECT * FROM /dmo/travel_m ).INSERT zt04_booking_m FROM ( SELECT * FROM /dmo/booking_m ).INSERT zt04_Booksuppl_m FROM ( SELECT * FROM /dmo/booksuppl_m ).Commit work.
那么 第1種有啥問題呢?/DMO里除了 /dmo/travel_m 以外,還有/dmo/travel,那可不容易用錯
而要是用SQL,那基本上不會錯,而且簡單:)
大念三遍【所有事情的發生都必然有其目的,并且有利于我!】,洗腦完畢,咱們繼續話題啊。
這樣 Bookings列表 就會顯示出來。
1-5,@UI.headerInfo /?@UI.facet -?Z04_PV_Booking_M
這樣就可以顯示Booking_M 的Object Page頁面,以及顯示明細,和 BookSuppl_M的列表
其實 BookSuppl_M 列表應該顯示不出來,我上面為了調查數據顯示不出來,先把Metadata 做了
2,BookSuppl_M
2-1,?New Metadata Extension - Z04_PV_BookSuppl_M
這個配合1-5,顯示出了 BookSuppl_M 列表。
2-2,@UI.headerInfo /?@UI.facet -?Z04_PV_BookSuppl_M
這樣就可以顯示BookSuppl_M 的Object Page頁面,以及顯示明細
BookSuppl_M 的Object Page頁面就顯示出來了。
?
3,完整的代碼(Metadata)和頁面截圖
3-1,Travel_M_MD
@Metadata.layer: #CORE
@Search.searchable: true
@UI.headerInfo: {typeName: 'Travel',typeNamePlural: 'Travels',title: {type: #STANDARD,label: 'Travel',value: 'TravelId'}
}
annotate view Z04_PV_Travel_M with
{@UI.facet: [{id: 'TravelDetail',purpose: #STANDARD,parentId: '',position: 10,label: 'Travel Detail',type: #IDENTIFICATION_REFERENCE},{id: 'Booking',purpose: #STANDARD,parentId: '',position: 20,label: 'Bookings',targetElement: '_Booking',type: #LINEITEM_REFERENCE}]@UI:{ lineItem:[{ position: 10 }],identification: [{ position: 10 }]}@Search.defaultSearchElement: trueTravelId;@UI:{ lineItem:[{ position: 20 }],selectionField: [{ position: 20 }],identification: [{ position: 20 }]}@Search.defaultSearchElement: true@Consumption.valueHelpDefinition: [{ entity: {name: '/DMO/I_Agency',element: 'AgencyID'},label: 'Agency'}]AgencyId;// AgencyName;@UI:{ lineItem:[{ position: 30 }],selectionField: [{ position: 30 }],identification: [{ position: 30 }]}@Search.defaultSearchElement: true@Consumption.valueHelpDefinition: [{entity: {name: '/DMO/I_Customer',element: 'CustomerID'},label: 'Customer'}]CustomerId;// CustomerName;@UI:{ lineItem:[{ position: 40 }],identification: [{ position: 40 }]}BeginDate;@UI:{ lineItem:[{ position: 50 }],identification: [{ position: 50 }]}EndDate;@UI:{identification: [{ position: 55 }]}BookingFee;@UI:{ lineItem:[{ position: 60 }],identification: [{ position: 60 }]}TotalPrice;@Consumption.valueHelpDefinition: [{entity: {name: 'I_Currency',element: 'Currency'},label: 'Currency'}]CurrencyCode;@UI:{identification: [{ position: 65 }]}Description;@UI:{ lineItem:[{ position: 70 }],selectionField: [{ position: 70 }],identification: [{ position: 70 }]}@Search.defaultSearchElement: true@Consumption.valueHelpDefinition: [{entity: {name: '/DMO/I_Overall_Status_VH',element: 'OverallStatus'},label: 'Overall Status'}]OverallStatus;// OverallStatusText;// CreatedBy;// CreatedAt;// LastChangedBy;@UI.hidden: trueLastChangedAt;// /* Associations */// _Agency;// _Booking;// _Currency;// _Customer;// _Status;}
點 開始
3-2,Booking_M_MD
@Metadata.layer: #CORE
@UI.headerInfo: {typeName: 'Booking',typeNamePlural: 'Bookings',title: {type: #STANDARD,label: 'Booking',value: 'BookingId'}
}
annotate view Z04_PV_Booking_M with
{@UI.facet: [{id: 'BookingDetail',purpose: #STANDARD,parentId: '',position: 10,label: 'Booking Detail',type: #IDENTIFICATION_REFERENCE},{id: 'BookSuppl',purpose: #STANDARD,position: 20,label: 'Booking Supplment',type: #LINEITEM_REFERENCE,targetElement: '_BookingSupplement'}]// TravelId;@UI:{ lineItem:[{ position: 20 }],identification: [{ position: 20 }]}BookingId;@UI:{ lineItem:[{ position: 30 }],identification: [{ position: 30 }]}BookingDate;@UI:{ lineItem:[{ position: 40 }],identification: [{ position: 40 }]}CustomerId;@UI:{ lineItem:[{ position: 50 }],identification: [{ position: 50 }]}CarrierId;@UI:{ lineItem:[{ position: 60 }],identification: [{ position: 60 }]}ConnectionId;@UI:{ lineItem:[{ position: 70 }],identification: [{ position: 70 }]}FlightDate;@UI:{ lineItem:[{ position: 80 }],identification: [{ position: 80 }]}FlightPrice;// CurrencyCode;@UI:{ lineItem:[{ position: 90 }],identification: [{ position: 90 }]}BookingStatus;@UI.hidden: trueLastChangedAt;
}
?3-1 中 Travel_M 列表點任意一條,顯示Travel_M的明細(Object Page)
3-3,BookSuppl_M_MD
@Metadata.layer: #CORE
@UI.headerInfo: {typeName: 'Booking Supplement',typeNamePlural: 'Booking Supplements',title: {type: #STANDARD,label: 'Booking Supplement',value: 'BookingSupplementId'}
}
annotate view Z04_PV_BookSuppl_M with
{@UI.facet: [{id: 'BookSuppl',purpose: #STANDARD,position: 10,label: 'Booking Supplment',type: #IDENTIFICATION_REFERENCE}]// TravelId;// BookingId;@UI:{ lineItem:[{ position: 10 }],identification: [{ position: 10 }]}BookingSupplementId;@UI:{ lineItem:[{ position: 20 }],identification: [{ position: 20 }]}SupplementId;@UI:{ lineItem:[{ position: 30 }],identification: [{ position: 30 }]}Price;// CurrencyCode;@UI.hidden: trueLastChangedAt;// /* Associations */// _Booking;// _Supplement;// _SupplementText;// _Travel;}
?3-2 中 Booking_M 列表點任意一條,顯示Booking_M的明細(Object Page)
然后點 Booking Supplement 列表中的任意一項,會顯示其 Object Page頁面
上面是我們想實現的主要功能。
除此之外,還有一些功能也想加上,比如Search,ObjectModel 等等。
4,Travel_M_MD?其他功能
4-1,@UI.textArrangement: #TEXT_ONLY -?Z04_PV_Travel_M_MD
這個是啥呢?
其實就是 Key - Value 值的顯示方式設定。
比如OverallStatus 在Projection View里用?@ObjectModel.text.element: [ 'OverallStatusText' ]顯示名稱,默認是 Value(Key) 的形式。
多數情況下客戶也喜歡這種方式,但是也不總是如此,比如這里的Status,就不想顯示Key,只要Value,那該怎么辦呢?
就是用這個@UI.textArrangement: #TEXT_ONLY。
深入看一下各個選項:
在 SAP RAP (ABAP RESTful Application Programming) 和 Fiori Elements 中,@UI.textArrangement
注解用于控制字段文本的顯示方式,特別是在表格列或表單中。以下是該注解的可用選項及其含義:
a,@UI.textArrangement
的選項
選項值 | 說明 | 適用場景 | 示例 |
---|---|---|---|
#TEXT_ONLY | 僅顯示文本值,不顯示圖標或附加信息 | 純文本字段(如名稱、描述) | Name: John |
#TEXT_FIRST | 文本在前,圖標或其他元素在后 | 帶狀態圖標的文本(如狀態+文本) | Completed ? |
#TEXT_LAST | 文本在后,圖標或其他元素在前 | 圖標優先的顯示(如貨幣符號+金額) | $ 100.00 |
#TEXT_SEPARATE | 文本與圖標/附加信息分開顯示(通常分行) | 需要清晰分隔的復雜字段 | Status: ? Approved |
#ICON_ONLY | 僅顯示圖標,隱藏文本 | 空間有限時(如操作欄圖標) | 🛑 (無文本) |
#ICON_FIRST | 圖標在前,文本在后 | 狀態指示(如錯誤圖標+消息) | ?? Warning |
#ICON_LAST | 圖標在文本后 | 次要圖標補充(如鏈接后的外部圖標) | Details ↗ |
b,使用示例
1. 在 CDS View 中定義
abap
@UI: {lineItem: [{position: 10,label: 'Status',// 文本在前,狀態圖標在后textArrangement: #TEXT_FIRST}],identification: [{position: 20,label: 'Price',// 貨幣符號在前,金額在后textArrangement: #TEXT_LAST}]
}
define view Z_MyEntity {@UI.hidden: truekey id,@Consumption.valueHelpDefinition: [{ entity: { name: 'I_StatusIcon' } }]status,@Semantics.amount.currencyCode: 'CurrencyCode'price,CurrencyCode
}
2. 效果對比
-
#TEXT_FIRST
:
Completed ?
-
#ICON_FIRST
:
?? Error
-
#TEXT_SEPARATE
:
Status:
? Approved
c,注意事項
-
依賴字段類型:
-
如果字段沒有關聯圖標(如通過
@UI.statusIcon
或值幫助定義),#ICON_*
選項可能無效。
-
-
Fiori Elements 兼容性:
-
部分選項可能因 Fiori 版本不同而表現略有差異(建議測試目標版本)。
-
-
組合使用:
-
常與以下注解配合使用:
abap
-
-
-
@UI.statusIcon: // 定義狀態圖標 @UI.dataPoint: // 控制數據點樣式
-
d,常見問題
Q:為什么設置了 #ICON_FIRST
卻不顯示圖標?
A:檢查是否缺少圖標定義(如 @UI.statusIcon
或值幫助實體未提供圖標元數據)。
如果需要更具體的場景示例,可以提供您的字段類型和預期效果!
畫面效果如下:
Object Page頁面:
?
5,Booking_M_MD 其他功能
5-1,Search
-?@Search.searchable: true:顯示檢索框
-?@Search.defaultSearchElement: true:定義檢索框對應的檢索對象
? -?TravelId;
? -?BookingId;
? -?CustomerId;
畫面效果就是這個搜索框
TODO:不知為啥,這個搜索框好像不太好用
5-2,@UI.textArrangement: #TEXT_ONLY -?Z04_PV_Booking_M_MD
先給幾個字段加上Name/or Text -?Z04_PV_Booking_M
-?CustomerId ,CustomerName
-?CarrierId,CarrierName
-?BookingStatus,BookingStatusText
然后再到?Z04_PV_Booking_M_MD 里面,給BookingStatus 字段加上下面annotation:
-?textArrangement: #TEXT_ONLY
?
運行看效果:
- 列表中 Booking Status項目只顯示名稱
還有些需要添加的內容,尤其是Value Help 部分,放到下一章說。
現在文章是越寫越長了😓
以上就是本篇的全部內容。
更多SAP顧問業務知識請點擊下面目錄鏈接或東京老樹根的博客主頁
https://blog.csdn.net/shi_ly/category_12216766.html
東京老樹根-CSDN博客