Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
patrick_winkler
Product and Topic Expert
Product and Topic Expert

Introduction

In this blog post, you will learn how to adapt a RAP business object of a customizing table when you add a new non-key field to the table. Removing a field works very similar.
This blog is relevant for:

Further reading:

Example RAP BO

You have created a RAP BO based on the following customizing table by using the BC Maintenance Object ADT Wizard as described in this tutorial.

Note that this ADT Wizard does not support overwriting existing objects.

 

@EndUserText.label : 'Error Code'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zerrcode {
  key client            : abap.clnt not null;
  key error_code        : z_error_code not null;
  last_changed_at       : abp_lastchange_tstmpl;
  local_last_changed_at : abp_locinst_lastchange_tstmpl;
}

 

Add new field to Data Model & Behavior

You have added the new field reference_id to the table definition:

 

@EndUserText.label : 'Error Code'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zerrcode {
  key client            : abap.clnt not null;
  key error_code        : z_error_code not null;
  reference_id          : abap.numc(3);
  last_changed_at       : abp_lastchange_tstmpl;
  local_last_changed_at : abp_locinst_lastchange_tstmpl;
}

 

Add the field to the CDS entity definition of the table and, if available, to the projection entity definition:

 

@EndUserText.label: 'Error Code'
@AccessControl.authorizationCheck: #CHECK
define view entity ZI_ErrorCode
  as select from ZERRCODE
  association to parent ZI_ErrorCode_S as _ErrorCodeAll on $projection.SingletonID = _ErrorCodeAll.SingletonID
  composition [0..*] of ZI_ErrorCodeText as _ErrorCodeText
{
  key ERROR_CODE as ErrorCode,
  reference_id as ReferenceID,
  @Semantics.systemDateTime.lastChangedAt: true
  LAST_CHANGED_AT as LastChangedAt,
  @Semantics.systemDateTime.localInstanceLastChangedAt: true
  LOCAL_LAST_CHANGED_AT as LocalLastChangedAt,
  1 as SingletonID,
  _ErrorCodeAll,
  _ErrorCodeText
}
@EndUserText.label: 'Maintain Error Code'
@AccessControl.authorizationCheck: #CHECK
@Metadata.allowExtensions: true
define view entity ZC_ErrorCode
  as projection on ZI_ErrorCode
{
  key ErrorCode,
  ReferenceID,
  LastChangedAt,
  @Consumption.hidden: true
  LocalLastChangedAt,
  @Consumption.hidden: true
  SingletonID,
  _ErrorCodeAll : redirected to parent ZC_ErrorCode_S,
  _ErrorCodeText : redirected to composition child ZC_ErrorCodeText,
  _ErrorCodeText.Description : localized
}

 

If the RAP BO is draft-enabled, add the field to the draft table:

 

@EndUserText.label : 'ZI_ErrorCode - Draft'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zerrcode_d {
  key client         : mandt not null;
  key errorcode      : z_error_code not null;
  referenceid        : abap.numc(3);
  lastchangedat      : abp_lastchange_tstmpl;
  locallastchangedat : abp_locinst_lastchange_tstmpl;
  singletonid        : abap.int1;
  "%admin"           : include sych_bdl_draft_admin_inc;
}

 

Add the field to the mapping definition in the behavior definition:

 

define behavior for ZI_ErrorCode alias ErrorCode
persistent table ZERRCODE
draft table ZERRCODE_D
etag master LocalLastChangedAt
lock dependent by _ErrorCodeAll
authorization dependent by _ErrorCodeAll
{
  [...]
  mapping for ZERRCODE
  {
    ErrorCode = ERROR_CODE;
    ReferenceID = reference_id;
    LastChangedAt = LAST_CHANGED_AT;
    LocalLastChangedAt = LOCAL_LAST_CHANGED_AT;
  }
}

 

(Optional) Add the field to the Metadata Extension. If the field does not have a data element, also define a field label.

 

annotate view ZC_ErrorCode with
{
  [...]

  ErrorCode;
  @UI.identification: [ {
    position: 2,
    label: 'Reference ID'
  } ]
  @UI.lineItem: [ {
    position: 2,
    label: 'Reference ID'
  } ]
  ReferenceID;
}

 

The new field is now exposed in the OData service. If you are using the Custom Business Configurations app, the field is displayed on refresh:

New field in CUBCO app

(Optional) If the RAP BO has a copy action generated by the ADT wizard, you should consider adding the new field to the "MODIFY ENTITIES ... FIELDS ( ... )" statement in the behavior implementation class. This ensures that the content of the field is transferred to the copied entity.