Skip to Content

In these blog I am going to help you ,

How to create the BOPF Objects automatically using CDS views.

How to Publish Odata Service in the Back End.

Overview of BOPF:

Overview of CDS:

Kindly go through above links to know more about CDS & BOPF

i.e These is the new ABAP Development.

Creating the business object using the cds views to enable ODATA service enabled:

1.Root node creation for example : ZBO_MARA (Root node)

For the root node need to specify the annotation: @ObjectModel.modelCategory: #BUSINESS_OBJECT

Zbo_mara is the Root node and created the associations with zbo_marc and zekpo nodes

@ObjectModel.compositionRoot: true

@ObjectModel.modelCategory: #BUSINESS_OBJECT

@AbapCatalog.sqlViewName: 'zbo_mara1'

@AbapCatalog.compiler.compareFilter: true

@AccessControl.authorizationCheck: #CHECK

@EndUserText.label: 'marac'

@ObjectModel.writeActivePersistence: 'mara'

@ObjectModel.transactionalProcessingEnabled: true

@ObjectModel.createEnabled: true

@ObjectModel.updateEnabled: true

@ObjectModel.deleteEnabled: true

@OData.publish: true

define view Zbo_mara as select from mara as ma

association [0..*] to Zbo_marc as mc on $projection.matnr = mc.matnr

association [0..*] to Zekpo    as ek on $projection.matnr = ek.matnr





/* Associations */

@ObjectModel.association.type:  [#TO_COMPOSITION_CHILD  ]





After activation, the CDS, there is a new BOPF. You have to generate the classes and activate it.

Then use CRUD Template in Web IDE.

Business object created in the back end,Please find the attached screen shot:

Double click on the BO , Popup get opens with information message (Business object is generated from the CDS VIEW)

ZBO_MARA  bo got created in the back end:



2.Child node Node creation zbo_marc association with the root node and zekpo


@AbapCatalog.sqlViewName: 'Zbo_marc1'

@AbapCatalog.compiler.compareFilter: true

@AccessControl.authorizationCheck: #NOT_REQUIRED

@EndUserText.label: 'material detail data'

@Search.searchable: true

@ObjectModel.semanticKey:  [ 'Matnr', 'Werks' ]

@ObjectModel.representativeKey: 'Werks'

@ObjectModel.writeActivePersistence: 'marc'

@ObjectModel.createEnabled: true

@ObjectModel.deleteEnabled: true

@ObjectModel.updateEnabled: true

@ObjectModel.transactionalProcessingEnabled: true

define view Zbo_marc as select from marc

association [0..*] to Zbo_mara as _Ma on $projection.matnr = _Ma.matnr

association [0..*] to Zekpo    as ek  on $projection.werks = ek.werks


@Search.defaultSearchElement: true

key matnr,

key marc.werks,

@ObjectModel.association.type:  [#TO_COMPOSITION_PARENT,#TO_COMPOSITION_ROOT]


@ObjectModel.association.type:  [#TO_COMPOSITION_CHILD]



Child node ZBO_MARC created in the back end with the associated associations to the root node(ZBO_MARA) & parent node(ZBO_MARA)


3. Node creation zekpo association with the root node(zbo_mara) and parent node (zbo_marc)


@AbapCatalog.sqlViewName: 'zekpo_1'

@AbapCatalog.compiler.compareFilter: true

@AccessControl.authorizationCheck: #CHECK

@EndUserText.label: 'purchase order'

@Search.searchable: true

@ObjectModel.semanticKey:  [ 'matnr' ]

@ObjectModel.representativeKey: 'matnr'

@ObjectModel.writeActivePersistence: 'ekpo'

@ObjectModel.createEnabled: true

@ObjectModel.deleteEnabled: true

@ObjectModel.updateEnabled: true

@ObjectModel.transactionalProcessingEnabled: true

define view Zekpo as select from ekpo

association [0..*] to Zbo_mara as _Mc on $projection.matnr = _Mc.matnr

association [0..*] to Zbo_marc as _mrc on $projection.matnr = _mrc.matnr



@Search.defaultSearchElement: true



@ObjectModel.association.type:  [#TO_COMPOSITION_ROOT]


@ObjectModel.association.type:  [#TO_COMPOSITION_PARENT]



Child node ZEKPO created in the back end with the associated associations to the root node(ZBO_MARA) & parent node(ZBO_MARC)


Register the OData service in /iwfnd/maint_service.


To register the OData service we need to add the service follow the steps mentioned in the link

To report this post you need to login first.


You must be Logged on to comment or reply to a post.

  1. jugal singh

    Very good blog Surendra!!

    I have a requirement where I have to pass system generated number in post operation.

    How can I achieve through this way….If I am not wrong I need to enhance BOPF methods and pass the value.

    Please let me know where I can put that logic.

    Thanks in Advance..




    1. Surendra Garapati Post author

      Hello Jugal,

      You can write your logic in the BOPF Determination on Save or BO Action also you can Write.

      Call the action from the Odata Service.



  2. jugal singh

    Thanks Surendra!!

    I got another question here, actually i am working on a requirement where i am inserting records in header and item table.

    in first instance i have updated both header and item table in one go, now i want to insert record only in Item table.

    Can you please suggest how can I achieve this.

    Thanks In Advance…


  3. Jörg Spilker

    I tried to follow your example with two custom Z Tables for Orders and Items. However Activation is not possible because Order has association to Item (by associationn.type CHILD) and Item has association to Order (by association.type ROOT,PARENT). How do i solve this?


Leave a Reply