1.说明
在前文中实现了采购订单中EKKO,EKPO,CDS的 ASSOCIATION 关联导航,细节可参看:创建一个带导航功能的CDS,实现数据的关联显示,只是简单的两表导航,在现实业务中,可能还会需要加入更多的业务属性的导航功能,比如从采购订单到供应商,到订单明细,到价格明细,到采购订单历史,到物料属性(物料名称)等等,下面的例子中在HANA STUDIO中创建CDS,实现EKKO,EKPO,KONV间的导航,从而完成订单HEAD,ITEM,到价格的 ASSOCIATION 关联导航。
此部份使用的例子,可能使用了前一部份的一些功能,在看此文之前最好能先看一下 创建一个带导航功能的CDS,实现数据的关联显示
注由于在HANA S4中发现一部份的价格条件并不在KONV中,检查发现是在视图prcd_elements中,所以在CDS中使用此视图来查询,如是ECC中可以把代码中的prcd_elements换成KONV就可以了。
2.一、创建ABAP CDS
2.1.1.主表EKKO中取数的CDS.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@AbapCatalog.sqlViewName: 'zvekko2' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'ekko' @VDM.viewType: #CONSUMPTION @OData:{ publish: true } define view z_sql_ekko2 as select from ekko association [0..*] to z_sql_ekpo2 as _ekpo on _ekpo.ebeln = $projection.ebeln { key ekko.ebeln, ekko.bukrs, ekko.bstyp, ekko.bsart, ekko.knumv, @ObjectModel.association.type: [#TO_COMPOSITION_CHILD] _ekpo } |
2.2.2.明细表EKPO取数的CDS.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@AbapCatalog.sqlViewName: 'zvekpo2' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'ekpo' define view z_sql_ekpo2 as select from ekpo association [1..1] to z_sql_ekko2 as _ekko on _ekko.ebeln = $projection.ebeln association [0..*] to z_sql_konv2 as _konv on _konv.knumv = $projection.knumv and _konv.kposn = $projection.ebelp { key ekpo.ebeln, --转换为EKPO项目号的6位长度 key CONCAT('0',ekpo.ebelp) as ebelp, ekpo.matnr, _ekko.knumv as knumv, @ObjectModel.association:{ type: [ #TO_COMPOSITION_PARENT, #TO_COMPOSITION_ROOT ] } _ekko, _konv } |
2.3. 3.导航到价格条件表KONV
从EKPO导航到价格条件表KONV(S4中使用:prcd_elements)的CDS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@AbapCatalog.sqlViewName: 'zvkonv2' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'EKNV' define view z_sql_konv2 as select from prcd_elements as konv association [1..1] to z_sql_ekpo2 as _ekpo on _ekpo.knumv = $projection.knumv and _ekpo.ebelp = $projection.kposn { key konv.knumv, key konv.kposn, key konv.stunr, key konv.zaehk, konv.kschl, konv.kbetr, @ObjectModel.association:{ type: [ #TO_COMPOSITION_PARENT, #TO_COMPOSITION_ROOT ] } _ekpo } |
2.4.4.CDS说明1.
这三个CDS中,zvekko2的CDS为主表CDS,所在此CDS中使用了ODATA自动生成注释
@OData:{
publish: true
}
以便于自动生成ODATA,在此同时激活此三个CDS后,记得一定要使用 /IWFND/MAINT_SERVICE 激活并创建ODATA服务:Z_SQL_EKKO2_CDS ,激活后,就可以使用地址: http://flt.tpddns.cn:50000/sap/opu/odata/sap/Z_SQL_EKKO2_CDS/ 来查看生成的ODATA了,
2.5.5.CDS说明2
由于ekpo.ebelp字段的长度是5,而konv.kposn的字段长度是不是6,为了在SELECT中能正常连接使用,所以在z_sql_ekpo2的视图中,使用字符串函数CONCAT,在z_sql_ekpo2前面补一个零。
1 2 |
--转换为EKPO项目号的6位长度 key CONCAT('0',ekpo.ebelp) as ebelp, |
2.6.6.CDS说明3
从CDS:zvkonv2,中发现导航到的是EKPO,没有做导航到EKKO的功能,如有需要可以自己研究加入
2.7.7.CDS说明4
为了能在z_sql_konv2中,关联z_sql_ekpo2时能取到knumv,所以在z_sql_ekpo2中引用了EKKO.KNUMV字段。