我想创建一个CDS,实现主从表显示的功能,并且在ODATA中能关联显示,比如,创建一个CDS,生成ODATA后,其中包含采购订单头(EKKO) 的显示,同时当选择一个订单时面能显示采购订单明细(EKPO),再选择一行明细后,能显示其中的价格条件,以此类推,
此种功能当然在SEGW里,要一个个 Entity 的处理,然后,一个个的,创建 Association也是可以实现的,也就是给主Entity创建 Navgitaion 属性也是可以实现,只是想试试,
下面以CDS的方法来实现方法,
1.一、网络上的标准例子
此例子来源于 https://blogs.sap.com/2019/02/08/myinbox-ui-generation-using-cds-views-and-ui.facet-annotation/
经测试是正常可以使用的,涉及到两个CDS分别如下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
@AbapCatalog.sqlViewName: 'ZVC_FLIGHT' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'Flights' @UI.headerInfo:{ typeNamePlural: 'Flights', typeName: 'Flight' } define view ZC_Flight as select from spfli association [1..1] to ZC_Carrier as _carrier on _carrier.carrid = $projection.carrid { key spfli.carrid, @UI.lineItem:{position: 10, importance: #HIGH} key spfli.connid, @UI.lineItem:{position: 20, importance: #HIGH} spfli.countryfr, @UI.lineItem:{position: 30, importance: #HIGH} spfli.countryto, @UI.lineItem:{position: 40, importance: #HIGH} spfli.cityfrom, @UI.lineItem:{position: 50, importance: #HIGH} spfli.cityto, @UI.lineItem:{position: 60, importance: #HIGH} spfli.distance, @ObjectModel.association:{ type: [ #TO_COMPOSITION_PARENT, #TO_COMPOSITION_ROOT ] } _carrier } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
@AbapCatalog.sqlViewName: 'ZVCCARRIER' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'Carrier' @VDM.viewType: #CONSUMPTION @OData:{ publish: true } @UI.headerInfo:{ title.value: 'carrid', title.url: 'url', description.value: 'carrname' } define view ZC_Carrier as select from scarr association [0..*] to ZC_Flight as _Flight on _Flight.carrid = $projection.carrid { @UI.facet: [ // This is for the body { id: 'GeneralInformation', isSummary: true, type: #COLLECTION }, { parentId: 'GeneralInformation', id:'group1Information', type: #FIELDGROUP_REFERENCE, targetQualifier: 'two', label: 'Group 1' }, { parentId: 'GeneralInformation', id:'group2Information', type: #FIELDGROUP_REFERENCE, targetQualifier: 'one', label: 'Group 2' }, // This is for the Items { id:'lineItems', type: #LINEITEM_REFERENCE, targetElement: '_Flight', label: 'Flights' }] @UI.fieldGroup: [{ // Qualifier is mandatory as this is // the way to distinguish between // Multiple groups qualifier: 'one', position: 10 }] @UI.identification: [{position: 10 }] key scarr.carrid, @UI.fieldGroup: [{ qualifier: 'two', position: 10 }] @UI.identification: [{position: 20 }] scarr.carrname, @UI.fieldGroup: [{ qualifier: 'two', position: 20 }] @UI.identification: [{position: 30 }] @Semantics.currencyCode: true scarr.currcode, @UI.identification: [{position: 40 }] scarr.url, @ObjectModel.association.type: [#TO_COMPOSITION_CHILD] _Flight } |
两个CDS激活后,然后使用事务码,激活ODATA服务ZC_Carrier_CDS后,可以进行ODATA测试,显示如图,但由于我的scarr,spfli表没有数据,所以看不了数据结果,所以后面以采购订单的例子来学习CDS的主从关系。
2.二、创建采购订单的主从关系CDS
1.分别创建两个CDS: ZVEKKO,ZVEKPO,主CDS为ZVEKKO,在其中使用
@OData:{
publish: true
}
来自动生成ODATA服务,
2.在主CDS中使用@ObjectModel.association.type: [#TO_COMPOSITION_CHILD]来说明。
3.在子CDS,也就是ITEMS项目的CDS中使用@ObjectModel.association:{ type: [ #TO_COMPOSITION_PARENT, #TO_COMPOSITION_ROOT ] }
来说明使之关系到主CDS中,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@AbapCatalog.sqlViewName: 'zvekko' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'ekko' @VDM.viewType: #CONSUMPTION @OData:{ publish: true } define view z_sql_ekko as select from ekko association [0..*] to z_sql_ekpo as _ekpo on _ekpo.ebeln = $projection.ebeln { key ekko.ebeln, ekko.bukrs, ekko.bstyp, ekko.bsart, @ObjectModel.association.type: [#TO_COMPOSITION_CHILD] _ekpo } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@AbapCatalog.sqlViewName: 'zvekpo' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'ekpo' define view z_sql_ekpo as select from ekpo association [1..1] to z_sql_ekko as _ekko on _ekko.ebeln = $projection.ebeln { key ekpo.ebeln, key ekpo.ebelp, ekpo.matnr, @ObjectModel.association:{ type: [ #TO_COMPOSITION_PARENT, #TO_COMPOSITION_ROOT ] } _ekko } |
3.三、直接测试有主从关系的CDS
1.在HANA STUDIO 中,选择CDS:ZVEKKO,右键,Open with ->Data Preview,显示EKKO,
2.选择一行EKKO的数据,右键,Follow Association ,选择ekko – z_sql_ekpo,

就能显示EKKO单对应的EKPO数据了,同时再选择EKPO,也能再次显示相关的EKKO数据,
4.四、使用CDS创建ODATA并测试
1.创建成功上面两个CDS后,选择两个CDS,同时激活,
2.此时ODATA服务显示未生成,这时使用事务码 /IWFND/MAINT_SERVICE 激活并创建ODATA服务:Z_SQL_EKKO_CDS,具体操作方法,可参看:把ODATA工作生成ODATA服务

3.ODATA生成后,可打开ODATA测试,此时显示一个EKKO中的订单号,
/sap/opu/odata/sap/Z_SQL_EKKO_CDS/z_sql_ekko(‘4500000123’)

4.这其中多出一个“to_ekpo”的连接,此在我们再用新的连接
/sap/opu/odata/sap/Z_SQL_EKKO_CDS/z_sql_ekko(‘4500000123’) /to_ekpo
进行测试,结果如图

5.此时除了多了一个到明细的项目外,每天一个项目都还多了一个连接到EKKO的to_ekko的连接
z_sql_ekpo(ebeln=’4500000123′,ebelp=’00004′)/to_ekko
此时,把开此连接测试会发现,就显示了此行项目的EKKO中的内容了,从而实现了主从表的完全关联。

5.五、在SEGW的项目中使用此CDS
在前面的CDS中使用了参数 @OData:publish: true 。这样会自动创建ODATA服务,但此ODATA服务也是可以导入到SEGW项目中的。
1.在SEGW项目下,Data Model 上右键,选择Reference -》 Data Source,

2.输入EKKO的视图名:z_sql_ekko,选择下一步行街

3.可以看到数据源结构如图


最后生成ODATA服务好也同样能得到第四步中生成的ODATA服务的效果,这一步的操作主要是查看CDS 中ASSOCIATION ,在SEGW中的效果,以便于对比度操作。
总结,
后面会把价格条件,采购订单历史等也加到这个CDS中,做成一个完成的采购订单,实现业务中多表导航ABAP CDS功能。