SAP學習筆記 - 開發46 - RAP開發 Managed App Metadata Extension 2 - Booking_M,BookSuppl_M

上一章講了 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,注意事項

  1. 依賴字段類型

    • 如果字段沒有關聯圖標(如通過 @UI.statusIcon 或值幫助定義),#ICON_* 選項可能無效。

  2. Fiori Elements 兼容性

    • 部分選項可能因 Fiori 版本不同而表現略有差異(建議測試目標版本)。

  3. 組合使用

    • 常與以下注解配合使用:

      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博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89277.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

# Win11開機卡死?無法進入登錄界面?3招強制進安全模式,快速修復系統

Win11開機卡死?無法進入登錄界面?3招強制進安全模式,快速修復系統一、問題描述: 當你的win11電腦開機后卡在圖片界面就死機,無法進入登錄界面,不顯示windows徽標,不能正常啟動,可能的…

快捷支付與網關支付:兩種主流支付方式的深度解析

在當今數字化支付時代,快捷支付和網關支付作為兩種主流的電子支付方式,為消費者和商家提供了多樣化的支付選擇。本文將深入探討這兩種支付方式的區別、適用場景及各自的優劣勢,幫助您更好地理解現代支付生態。一、快捷支付:便捷高…

【WRFDA數據教程第一期】LITTLE_R 格式詳細介紹

目錄LITTLE_R 格式概述LITTLE_R 的結構1-Header Record 詳解:觀測的“身份證”2-Data Record:觀測數據本體3-Ending Record:終止標志4-Tail Integers:尾部校驗字段另-Missing Values(缺測值處理)Mandatory,…

一文讀懂循環神經網絡—從零實現長短期記憶網絡(LSTM)

目錄 一、遺忘門(Forget Gate):決定 “該忘記什么” 二、輸入門(Input Gate):決定 “該記住什么新信息” 三、輸出門(Output Gate):決定 “該輸出什么” 四、候選記憶…

FreeRTOS之鏈表關鍵數據結構和函數操作接口-1

FreeRTOS之鏈表操作相關接口1 FreeRTOS源碼下載地址2 任務控制塊TCB2.1 任務控制塊TCB2.1.1 任務控制塊的關鍵成員2.1.2 TCB 的核心作用2.2 ListItem_t2.3 List_t3 函數接口3.1 vListInitialise3.2 vListInitialiseItem1 FreeRTOS源碼下載地址 https://www.freertos.org/ 2 …

OpenVela之 Arch Timer 驅動框架使用指南

一、概述 在嵌入式系統開發中,定時器是實現任務調度、精確延時等功能的核心組件。Arch Timer 作為基于 Timer Driver 實現的間隔定時器,在系統調度中扮演著重要角色。本文將全面介紹 Arch Timer 驅動框架,從基本概念到實際應用,幫…

AAC編解碼

AAC(Advanced Audio Coding,高級音頻編碼)是一種基于心理聲學原理的有損音頻編解碼技術,廣泛應用于流媒體、數字廣播、移動音頻等場景。其編解碼流程圍繞 “保留人耳可感知信息、去除冗余” 設計,分為編碼(…

STM32 | HC-SR04 超聲波傳感器測距

模塊:HC-SR04感應角度:不大于15度 探測距離:2cm-450cm 高精度:可達0.3cmTrig:觸發信號,接收MCU發送的控制脈沖,MCU對應GPIO 設置為輸出Echo:反饋信號,向MCU發送數據…

【RTSP從零實踐】12、TCP傳輸H264格式RTP包(RTP_over_TCP)的RTSP服務器(附帶源碼)

😁博客主頁😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客內容🤑:🍭嵌入式開發、Linux、C語言、C、數據結構、音視頻🍭 🤣本文內容🤣&a…

【unitrix】 6.1 類型化整數特征(t_int.rs)

一、源碼 這段代碼定義了一個 Rust 特征(trait)TInt 和一些實現,用于表示類型化的整數。 use crate::number::{Null, B, Bit, TNumber};/// 類型化整數標記特征 /// /// 要求: /// - 實現 TNumber /// - 可復制 (Copy) /// - 默認…

速通LVS

一、LVS的使用lvs部署命令介紹lvs軟件相關信息:程序包:ipvsadm Unit File: ipvsadm.service 主程序:/usr/sbin/ipvsadm 規則保存工具:/usr/sbin/ipvsadm-save 規則重載工具:/usr/sbin/ipvsadm-restore 配置文件&#x…

Nginx,MD5和Knife4j

一、 Nginx: 項目網關與流量調度核心原理反向代理 (Reverse Proxy):在Web架構中,Nginx作為系統的統一入口(API網關),接收所有外部客戶端請求。它通過解析請求的URL路徑(location指令),判斷請求的…

多態,內部類(匿名內部類),常用API(1)

多態 什么是多態? 同一個對象在不同時刻表現出來的不同形態(多種形態) 例:Cat extends Animal 第一種形態:Cat c1 new Cat(); //c1是只貓 第二種形態:Animal c2 new Cat(); //c2是個動物 &#xff08…

Qt小組件 - 7 SQL Thread Qt訪問數據庫ORM

簡介網上關于Qt訪問數據庫的資料大多使用QSqlDatabase模塊。雖然這在C中尚可接受,但在Python中使用就顯得過于繁瑣了——不僅要手動編寫SQL語句,還與Python追求簡潔的理念背道而馳。在這里寫一個基于sqlalchemy的示例,也可以使用其他的ORM庫 …

使用Gin框架構建高并發教練預約微服務:架構設計與實戰解析

項目概述 技術棧 Web框架:Gin(高性能HTTP框架)數據存儲:Redis(內存數據庫,用于高并發讀寫) 項目結構 coach-booking-service ├── main.go # 程序入口,路由初始化&am…

深入拆解Spring第二大核心思想:AOP

什么是AOP Aspect Oriented Programming(面向切面編程) 什么是面向切面編程呢? 切?就是指某?類特定問題, 所以AOP也可以理解為面向特定方法編程. 什么是面向特定方法編程呢? 比如對于"登錄校驗", 就是?類特定問題. 登錄校驗攔截器, 就是…

linux服務器stress-ng的使用

安裝方法 ? Ubuntu/Debian:sudo apt update && sudo apt install stress-ng -y? CentOS/RHEL(需EPEL源):sudo yum install epel-release -ysudo yum install stress-ng -y? 源碼編譯(適合定制化需求&#x…

探索阿里云DMS:解鎖高效數據管理新姿勢

一、阿里云 DMS 是什么 阿里云 DMS,全稱為 Data Management Service,即數據管理服務 ,是一種集數據管理、結構管理、安全管理于一體的全面數據庫服務平臺。它能夠有效地支持各類數據庫產品,包括但不限于 MySQL、SQL Server、Post…

python爬取新浪財經網站上行業板塊股票信息的代碼

在這個多行業持續高速發展的時代,科技正在改變著我們的生活。 在世界科技領域中,中國正占據越來越重要的位置。當下,每個行業都提到了區塊鏈、人工智能、大數據、5G等科技力量,強調了科技在行業咨詢與數據分析領域的重要意義。 隨…

【JAVA】監聽windows中鼠標側面鍵的按鈕按下事件

監聽windows中鼠標側面鍵的按鈕按下事件用到的包核心類使用這個類用到的包 jna-5.11.0.jar jna-platform-5.11.0.jar核心類 package sample.tt.mouse;import com.sun.jna.Pointer; import com.sun.jna.platform.win32.*; import com.sun.jna.platform.win32.WinDef.HMODULE; …