ABAP 视图建立

首先 se11 建立视图

输入视图属性后,在Table/Join Conditions 栏中输入需要建立视图的表,Relationships 用来建立表连接。

选择视图属性,在Table Fields 中选择字段。

维护状态

 

 

<think>我们被要求提供关于ABAP视图代码的解答。在ABAP中,视图(View)是数据库表的虚拟表示,它不存储数据,而是提供一种方式来组合和呈现来自一个或多个表的数据。ABAP中有多种类型的视图,如数据库视图(Database View)、维护视图(Maintenance View)、投影视图(Projection View)和帮助视图(Help View)。这里我们将重点介绍数据库视图创建和使用。 ### 数据库视图(Database View)的创建 数据库视图是通过SE11事务码(ABAP字典工具)创建的,并且可以在ABAP程序中使用。视图可以连接多个表,选择字段,并定义条件。 #### 创建步骤(在SE11中): 1. 输入视图名称(以`Z`或`Y`开头)。 2. 选择“视图”类型为“数据库视图”。 3. 添加参与的表,并指定连接条件。 4. 选择需要含在视图中的字段。 5. 可以设置选择条件(Selection Conditions)。 6. 激活视图。 #### 在ABAP程序中使用视图 一旦视图被激活,就可以像普通数据库表一样在ABAP程序中使用`SELECT`语句进行查询。 #### 示例代码:创建一个简单的数据库视图并查询 假设我们有两个表:`SFLIGHT`(航班表)和`SCARR`(航空公司表)。我们创建一个视图`Z_FLIGHT_CARRIER`,它连接这两个表,并含航班号、航线、航空公司名称和货币。 ##### 视图定义(在SE11中创建): - 视图名:`Z_FLIGHT_CARRIER` - 基表:`SFLIGHT`和`SCARR` - 连接条件:`SFLIGHT~CARRID = SCARR~CARRID` - 字段选择: - `SFLIGHT`:`CARRID`, `CONNID`, `FLDATE`, `PRICE`, `CURRENCY` - `SCARR`:`CARRNAME` ##### ABAP程序中使用该视图: ```abap REPORT z_view_demo. DATA: gt_flights TYPE TABLE OF z_flight_carrier, gs_flight TYPE z_flight_carrier. * 从视图中选择数据 SELECT carrid, connid, fldate, carrname, price, currency FROM z_flight_carrier INTO TABLE gt_flights WHERE carrid = 'LH' " 航空公司代码为LH AND fldate BETWEEN '20230101' AND '20231231'. * 输出数据 LOOP AT gt_flights INTO gs_flight. WRITE: / gs_flight-carrid, gs_flight-connid, gs_flight-fldate, gs_flight-carrname, gs_flight-price, gs_flight-currency. ENDLOOP. ``` #### 代码解释: 1. **视图定义**:在SE11中创建视图时,我们选择了两个表,并指定了连接条件,然后选择了需要的字段。视图激活后,在ABAP字典中就可以像表一样使用。 2. **ABAP程序**: - 声明了一个内表`gt_flights`,其结构为视图`Z_FLIGHT_CARRIER`的结构。 - 使用`SELECT`语句从视图中读取数据,条件为航空公司代码为'LH'(汉莎航空)且航班日期在2023年内。 - 循环内表并输出每条记录的字段。 #### 注意事项: - 数据库视图在数据库层实现,因此查询时会转换为底层数据库的SQL语句(如OpenSQL转换为本地SQL)。 - 视图只能用于读取数据,不能用于更新(除非是单表视图且满足更新条件)。 - 在视图中可以定义参数化条件(使用参数`:`),但在ABAP中查询时不能直接使用参数化视图,而是使用选择条件。 ### 其他类型的视图 1. **维护视图(Maintenance View)**:用于通过SM30维护数据,可以基于多个表,但要求这些表通过外键关联。 2. **投影视图(Projection View)**:用于屏蔽表中某些字段,只暴露部分字段。只能基于一个表。 3. **帮助视图(Help View)**:用于为输入帮助(F4)提供数据源。 ### 视图的维护 - 可以通过SE11修改视图定义,然后重新激活。 - 在ABAP程序中,视图的使用和表类似,但要注意性能,特别是当视图连接多个大表时。 §§相关问题§§: 1. ABAP中数据库视图和表连接(JOIN)在性能上有何区别? 2. 如何在ABAP创建和维护维护视图(Maintenance View)? 3. ABAP投影视图(Projection View)的主要用途是什么? 4. 在ABAP中,如何通过视图实现数据的增删改查?</think>### ABAP 视图(View)代码详解 在 ABAP 中,视图(View)是数据库表的虚拟表示,它提供了一种灵活的数据访问方式而无需物理存储数据。ABAP 支持多种视图类型,每种都有特定用途: #### 视图类型对比 | 视图类型 | 事务码 | 基表数量 | 主要用途 | 是否可写 | |----------|--------|----------|----------|----------| | 数据库视图 | SE11 | 多个 | 复杂数据关联 | 只读 | | 投影视图 | SE11 | 单个 | 字段屏蔽 | 只读 | | 维护视图 | SE11 | 多个 | 数据维护界面 | 可写 | | 帮助视图 | SE11 | 多个 | 搜索帮助 | 只读 | | CDS 视图 | Eclipse | 多个 | 现代数据建模 | 只读 | #### 1. 数据库视图(Database View)示例 用于连接多个相关表的数据: ```abap " SE11 创建视图 ZV_FLIGHT_DETAILS VIEW ZV_FLIGHT_DETAILS AS SELECT FROM sflight JOIN scarr ON sflight~carrid = scarr~carrid JOIN spfli ON sflight~carrid = spfli~carrid AND sflight~connid = spfli~connid { // 选择字段 sflight.carrid, sflight.connid, sflight.fldate, scarr.carrname, spfli.cityfrom, spfli.cityto, sflight.price, sflight.currency } WHERE sflight~planetype = '747' // 筛选条件 ``` **程序中使用:** ```abap REPORT z_flight_report. DATA: gt_flights TYPE TABLE OF zv_flight_details, gs_flight TYPE zv_flight_details. START-OF-SELECTION. SELECT * FROM zv_flight_details INTO TABLE gt_flights WHERE cityfrom = 'FRANKFURT' AND fldate >= '20230101'. LOOP AT gt_flights INTO gs_flight. WRITE: / gs_flight-carrid, gs_flight-connid, gs_flight-carrname, gs_flight-cityfrom, '->', gs_flight-cityto, gs_flight-price, gs_flight-currency. ENDLOOP. ``` #### 2. 维护视图(Maintenance View)示例 用于创建可维护的数据界面: ```abap " SE11 创建维护视图 ZV_CUSTOMER_MAINT VIEW ZV_CUSTOMER_MAINT WITH HEADER LINE BASED ON { kna1, // 客户主数据 knb1 // 公司代码数据 } RELATION kna1~kunnr = knb1~kunnr FIELDS ( kna1.kunnr AS Customer, kna1.name1 AS Name, kna1.ort01 AS City, knb1.bukrs AS Company, knb1.akont AS ReconAccount ) MAINTENANCE STATUS zcust_mnt // 维护状态 MAINTENANCE SCREEN 1000. // 维护屏幕 ``` **生成维护程序:** ```abap " 在 SE11 中生成维护程序 FUNCTION-POOL z_customer_maintenance. MODULE status_0100 OUTPUT. SET PF-STATUS 'MAINTAIN'. SET TITLEBAR 'CUST_MNT'. ENDMODULE. MODULE user_command_0100 INPUT. CASE sy-ucomm. WHEN 'SAVE'. CALL METHOD cust_mnt->save( ). WHEN 'BACK'. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE. ``` #### 3. CDS 视图(Core Data Services)示例 现代 ABAP 开发推荐的数据建模方式: ```abap // CDS 视图 ZCDS_FLIGHT_ANALYSIS @AbapCatalog.sqlViewName: 'ZCDSFLTANL' @AccessControl.authorizationCheck: #NOT_REQUIRED define view ZCDS_FLIGHT_ANALYSIS as select from sflight association [1..1] to scarr as _carrier on $projection.carrid = _carrier.carrid { key carrid, key connid, key fldate, price, currency, seatsocc, seatsmax, // 计算字段 cast( seatsocc as abap.fltp ) / seatsmax as occupancyRate, // 关联字段 _carrier.carrname } where planetype = '747'; ``` **ABAP 程序中使用 CDS 视图:** ```abap REPORT z_cds_flight_report. DATA: lt_results TYPE TABLE OF zcds_flight_analysis. START-OF-SELECTION. SELECT * FROM zcds_flight_analysis INTO TABLE @lt_results WHERE carrid = 'LH' ORDER BY fldate DESCENDING. cl_demo_output=>display( lt_results ). ``` #### 4. 投影视图(Projection View)示例 用于简化表结构: ```abap " SE11 创建投影视图 ZV_PROJ_CUSTOMER VIEW ZV_PROJ_CUSTOMER AS PROJECTION FROM kna1 { kunnr, name1, ort01, land1, pstlz } ``` #### 关键注意事项 1. **性能优化**: - 避免在视图的WHERE子句中使用复杂函数 - 限制连接表的数量(通常不超过5个) - 使用索引字段作为连接条件 2. **更新限制**: - 只有维护视图支持数据修改 - 数据库视图/投影视图是只读的 - 更新需要基础表有适当的维护视图 3. **权限控制**: ```abap @EndUserText.label: 'Flight Data' @AccessControl.authorizationCheck: #CHECK define view ZCDS_FLIGHT_AUTH as select from sflight { carrid, connid, fldate, price } where planetype = '747' ``` 4. **调试技巧**: - 使用`EXPLAIN`查看SQL执行计划 - 激活运行时检查工具(ST05) - 使用`CL_DEMO_OUTPUT`快速测试CDS视图
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值