上一章讲了 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; …