ABAP CDS开发

ABAP CDS开发

🎯 CDS概念

==Core Data Services==(CDS)是SAP的战略性技术解决方案之一。其目的是在数据的物理存在和用户需求中间构建一个==虚拟层==,满足用户对访问SAP系统数据的需求。



graph TD
    A[CDS] --> B[HANA CDS]
    A --> C[ABAP CDS]
    B --> B1["仅支持HANA数据库<br>功能丰富"]
    C --> C1["支持多种数据库<br>通过ADT开发"]

CDS类型对比

类型 支持平台 特点
HANA CDS 仅支持HANA数据库 功能丰富,直接在数据库内开发
ABAP CDS 支持多种数据库平台 通过ADT工具开发,功能相对较少

CDS设计目标

  1. 易于定义和创建
  2. 能够满足==复杂业务逻辑==编写的需求
  3. 能够充分发挥数据库,尤其是SAP HANA的==性能==
  4. 具有==充足的语意信息==
  5. 具有良好的==复用性==和适应性
  6. 易于管理和传输
  7. 与现有系统的安全机制集成
  8. 具有一定的==自解释==功能
  9. 同时满足OLTP(ABAP,Fiori)和OLAP(BW、BO)的调用需求

📋 CDS特点

主要特性

  1. 将==数据计算逻辑下推==到数据库层
  2. 可以使用 UNIONUNION ALL 叠加查询结果
  3. 支持 CASE 条件语句
  4. 支持 Arithmetic、String 和 CAST 等语句
  5. 支持 INNER JOINOUTER JOIN
  6. 可以使用 ==Annotation==(注解)
  7. 支持 Aggregations、Grouping 功能
  8. 支持==90%以上的SQL功能==

开发环境

ABAP CDS==不能在SAP GUI==上进行开发,只能在 ==Eclipse== 上通过安装ABAP Development Tools(ADT)的方式进行开发。

💡ADT安装步骤
  1. 下载安装 Eclipse
  2. 打开 Eclipse → Help → Install New Software
  3. 输入网址:https://tools.hana.ondemand.com/xxxx(xxxx为Eclipse版本号)
  4. 选择 ABAP Development Tools for SAP NetWeaver

🏗️ ABAP CDS部分语法

基本语法

1
2
3
4
5
6
7
8
9
10
11
@AbapCatalog.sqlViewName: 'ZMY_CDS_VIEW'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view ZMY_CDS
as select from mara
{
key matnr,
mtart,
maktx,
@Semantics.unitOfMeasure: 'EA'
meins
}

使用CASE条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@AbapCatalog.sqlViewName: 'ZMATERIAL_STATUS'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view ZMATERIAL_STATUS
as select from mara
{
key matnr,
mtart,
maktx,
case
when mtart = 'FERT' then 'Finished Goods'
when mtart = 'HALB' then 'Semi-finished'
when mtart = 'ROH' then 'Raw Material'
else 'Other'
end as MaterialStatus
}

使用WHERE条件

1
2
3
4
5
6
7
8
9
10
11
@AbapCatalog.sqlViewName: 'ZMATERIAL_ACTIVE'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view ZMATERIAL_ACTIVE
as select from mara
{
key matnr,
mtart,
maktx,
meins
}
where matnr in ('1000', '1001', '1002')

使用CAST语句

1
2
3
4
5
6
7
8
9
10
11
@AbapCatalog.sqlViewName: 'ZMATERIAL_PRICE'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view ZMATERIAL_PRICE
as select from mara as Material
join mbew as Price on Material.matnr = Price.matnr
{
key Material.matnr,
Material.maktx,
cast( Price.price as abap.dec(15,2) ) as MaterialPrice,
cast( Price.currency as abap.cuky ) as Currency
}

使用Association

1
2
3
4
5
6
7
8
9
10
11
12
@AbapCatalog.sqlViewName: 'ZMATERIAL_SUPPLIER'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view ZMATERIAL_SUPPLIER
as select from mara as Material
association [1] to EKPO as PurchaseOrder
on $projection.matnr = PurchaseOrder.matnr
{
key Material.matnr,
Material.maktx,
PurchaseOrder.ebeln,
PurchaseOrder.ebelp
}

定义选择参数

1
2
3
4
5
6
7
8
9
10
11
@AbapCatalog.sqlViewName: 'ZMATERIAL_SEL'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view ZMATERIAL_SEL
as select from mara
{
key matnr,
mtart,
maktx,
meins
}
parameters p_matnr : matnr
⚠️参数限制
目前CDS视图的选择屏幕只支持==单值==(parameters),不支持多值(selection-options)。

🔍 S/4 数据表查看对应CDS视图方法

mseg 表为例:在使用CDS View查询MSEG时发现查不出数据,这是因为S/4部分表需要使用对应的CDS视图查询才会生效。

查找步骤

  1. 在 ==SE16== 中输入需要查询的表名
  2. 在视图框中输入 NSDM_E_MSEG,查出结果:NSDM_V_MSEG
  3. 使用 NSDM_V_MSEG 作为数据源创建CDS视图

💡 使用CDS创建oData Service

步骤1:创建CDS view

创建带有oData注解的CDS视图:

1
2
3
4
5
6
7
8
9
10
11
12
13
@AbapCatalog.sqlViewName: 'ZWX_CDS3'
@AccessControl.authorizationCheck: #NOT_REQUIRED
@OData.publish: true
define view ZWX_CDS3
as select from EKPO
{
key ebeln,
key ebelp,
matnr,
menge,
netpr,
waers
}
📌关键注意
  1. 加上 @OData.publish: true 可以将CDS发布为oData
  2. ==一定要定义主键==(在字段前加上 key 关键字),否则会报错

步骤2:激活并维护服务

  1. 事务代码:/N/IWFND/MAINT_SERVICE
  2. 点击==添加服务==
  3. 输入筛选条件,点击获取服务
  4. 查出对应服务后点击==添加所选服务==
  5. ==激活==服务

步骤3:测试oData服务

使用事务代码 /N/IWFND/GW_CLIENT 测试:

1
request uri: /sap/opu/odata/sap/zwx_cds3_cds/ZWX_CDS3?$filter=posnr eq '000010'
⚠️大小写敏感
URI需要==区分大小写==。

🏗️ 开发流程总结



graph LR
    A["1. 安装Eclipse<br>+ ADT"] --> B["2. 创建ABAP<br>项目"]
    B --> C["3. 创建CDS<br>Data Definition"]
    C --> D["4. 定义CDS<br>视图"]
    D --> E["5. 检查并<br>激活"]
    E --> F["6. 添加oData<br>注解"]
    F --> G["7. 激活服务<br>+ 测试"]

⚠️ 注意事项

  1. CDS视图激活后==不能修改==,只能删除重新创建
  2. sqlViewNamedefine view 后面的名称==不能相同==
  3. 选择屏幕目前只支持==单值==(parameters)
  4. S/4系统的某些表需要使用对应的==CDS视图==才能查询到数据
  5. URI需要==区分大小写==
  6. 在ABAP程序中调用时使用的是 sqlViewName

ABAP程序调用CDS视图

1
2
3
4
5
6
7
8
9
10
11
12
13
REPORT z_cds_call_example.

SELECT *
FROM ZMATERIAL_COMPLETE
INTO TABLE @DATA(lt_material)
WHERE matnr = '1000'.

cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_table)
CHANGING t_table = lt_material
).

lo_table->display( ).