Schulung

Fiori Elements Advanced

RAP Erweitern

Brandeis Consulting & Cadao

Einführung

Wieso Erweiterungen?

  • Standard Anwendungen sollen erweitertert werden um
    • eigene Logik
    • eigene Felder

Wie war es bisher?

  • viele Ansätze bisher:
    • EEWB
    • BADIs
    • User-Exits
    • CFD
Brandeis Consulting & Cadao

RAP Erweiterbarkeit

Erweiterungen mit RAP

  • das neueste Erweiterungsmodell
  • (hoffentlich das Letzte)
  • Mehr Macht an für den Entwickler!

Einschränkung

  • Erweiterungen müssen im Coding vorgesehen sein!

Dokumentation

Brandeis Consulting & Cadao

Erweiterungsstruktur

Datenbankerweiterungen geschehen üblicherweise an einer erweiterbaren
Struktur.

@EndUserText.label : 'Erweiterungsstruktur'
@AbapCatalog.enhancement.category : #EXTENSIBLE_ANY
@AbapCatalog.enhancement.fieldSuffix : 'ZFW'
@AbapCatalog.enhancement.quotaMaximumFields : 350
@AbapCatalog.enhancement.quotaMaximumBytes : 3500
define structure zfw_ext_incl_actor_00 {

  dummy_field : abap.char(1);

}
Brandeis Consulting & Cadao

Verwendung der Struktur

Die zuvor definierte Struktur muss dann natürlich in entsprechen/r
Tabelle(n) verwendet werden - welche die gleiche Erweiterungskategorie hat

@EndUserText.label : 'Actor'
@AbapCatalog.enhancement.category : #EXTENSIBLE_ANY
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zfw_actor_00 {

  key client            : abap.clnt not null;
  key actor_id          : sysuuid_x16 not null;
  name_first            : zfw_name_first_00;
  name_last             : zfw_name_last_00;
  birthday              : zfw_birthday_00;
  email                 : zfw_email_00;
  mobile                : zfw_mobile_00;
  picture_url           : zfw_picture_url_00;
  local_created_by      : abp_creation_user;
  local_created_at      : abp_creation_tstmpl;
  local_last_changed_by : abp_locinst_lastchange_user;
  local_last_changed_at : abp_locinst_lastchange_tstmpl;
  last_changed_at       : abp_lastchange_tstmpl;
  include zfw_ext_incl_actor_00;

}
Brandeis Consulting & Cadao

Draft nicht vergessen

@EndUserText.label : 'Draft Database Table for ZFW_ACTOR_00_D'
@AbapCatalog.enhancement.category : #EXTENSIBLE_ANY
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zfw_actor_00_d {

  key mandt          : mandt not null;
  key actorid        : sysuuid_x16 not null;
  namefirst          : zfw_name_first_00;
  namelast           : zfw_name_last_00;
  birthday           : zfw_birthday_00;
  email              : zfw_email_00;
  mobile             : zfw_mobile_00;
  pictureurl         : zfw_picture_url_00;
  localcreatedby     : abp_creation_user;
  localcreatedat     : abp_creation_tstmpl;
  locallastchangedby : abp_locinst_lastchange_user;
  locallastchangedat : abp_locinst_lastchange_tstmpl;
  lastchangedat      : abp_lastchange_tstmpl;
  "%admin"           : include sych_bdl_draft_admin_inc;
  include zfw_ext_incl_actor_00;

}
Brandeis Consulting & Cadao

CDS Extension Include

Damit diese Erweiterungen auch im CDS-Layer ankommen, wird ein Extension
Include definiert.

@AbapCatalog.viewEnhancementCategory: [#PROJECTION_LIST]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Extension View für Actor'
@Metadata.ignorePropagatedAnnotations: true
@AbapCatalog.extensibility: {
    extensible: true,
    elementSuffix: 'ZFW',
    dataSources: [ 'Actor' ],
    quota: {
        maximumFields: 350,
        maximumBytes: 3500
    }
}
define view entity ZE_FW_Actor_00
  as select from zfw_actor_00 as Actor
{
  key actor_id as ActorId
}
Brandeis Consulting & Cadao

Verwendung des Extension Includes in der View

@AccessControl.authorizationCheck: #NOT_REQUIRED
@Metadata.allowExtensions: true
@EndUserText.label: '###GENERATED Core Data Service Entity'

@AbapCatalog.extensibility: {
    extensible: true,
    elementSuffix: 'ZFW',
    dataSources: [ '_Extension' ],
    quota: {
        maximumFields: 350,
        maximumBytes: 3500
    }
}

define root view entity ZR_FW_ACTOR_00
  as select from zfw_actor_00 as Actor
  association [1] to ZE_FW_Actor_00  as _Extension on $projection.ActorId = _Extension.ActorId
  composition [*] of ZR_FW_ACIMO_00 as _ActorInMovie
{
  key actor_id              as ActorId,
      name_first            as NameFirst,
      ...
      last_changed_at       as LastChangedAt,
      _ActorInMovie,
      _Extension

}
Brandeis Consulting & Cadao

Erweiterbarkeit in der Projection

Am "Ende des Tages" soll man die neuen Felder auch sehen

@Metadata.allowExtensions: true
@EndUserText.label: '###GENERATED Core Data Service Entity'
@AccessControl.authorizationCheck: #NOT_REQUIRED
@AbapCatalog.extensibility: {
    extensible: true,
    elementSuffix: 'ZFW',
    dataSources: [ 'Actor' ],
    quota: {
        maximumFields: 350,
        maximumBytes: 3500
    }
}
define root view entity ZC_FW_ACTOR_00
  provider contract transactional_query
  as projection on ZR_FW_ACTOR_00 as Actor
{
  key ActorId,      
      ...
      LastChangedAt,
      _ActorInMovie : redirected to composition child ZC_FW_ACIMO_00

}

Brandeis Consulting & Cadao

Erstellung Draft-Query-View

@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Draft-Query-View'
@AbapCatalog.extensibility: {
    extensible: true,
    elementSuffix: 'ZFW',
    dataSources: [ 'Actor' ],
    quota: {
        maximumFields: 350,
        maximumBytes: 3500
    }
}
define view entity ZR_FW_ACTOR_00_D
  as select from zfw_actor_00_d as Actor
{
  key actorid                       as Actorid,      
      ...
      draftentityoperationcode      as Draftentityoperationcode,
      hasactiveentity               as Hasactiveentity,
      draftfieldchanges             as Draftfieldchanges
}

Brandeis Consulting & Cadao

Verwendung des Draft-Query-Views

Nun muss zu guter letzt noch die Query-View verwendet werden

...
define behavior for ZR_FW_ACTOR_00 alias Actor
persistent table zfw_actor_00
draft table zfw_actor_00_d query ZR_FW_ACTOR_00_D
...
Brandeis Consulting & Cadao

Erstellung einer Model-Erweiterung

Was ist nötig, damit das Modell erweitert werden kann?

  • Tabelle muss erweitert werden
  • R-View muss erweitert werden
  • C-View muss erweitert werden
  • Feld muss aufgenommen werden
  • Draft-Query-View muss erweitert werden
Brandeis Consulting & Cadao

Neues Tabellenfeld anlegen

  • Erstellung einer neuen Append-Struktur
@EndUserText.label : 'Erweiterung der Struktur'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
extend type zfw_ext_incl_actor_00 with zfw_ext_actor_00 {

  zzname00zfw : abap.char(40);

}

Wichtig
Name beginnt mit ZZ
Suffix wie definiert wird verwendet

Brandeis Consulting & Cadao

Extend-View erweitern

Als erstes muss der als Extension-Point angelegte Extend-View
erweitert werden, um die "Verknüpfung" zwischen Datenbank und CDS-Layer
herzustellen unter Berücksichtigung des Appends

extend view entity ZE_FW_Actor_00 with
{
  Actor.zzname00zfw as ZZName00ZFW
}
Brandeis Consulting & Cadao

R-View erweitern

Danach kann dann eine Extend auf der Originalen View angelegt werden,
mit dem das Feld exponiert wird.

extend view entity ZR_FW_Actor_00 with
{
  _Extension.ZZName00ZFW
}
Brandeis Consulting & Cadao

C-View erweitern

Und um die neue Spalte im Frontend anzuzeigen, wird auch die Projection-View
erweitert.

extend view entity ZC_FW_ACTOR_00 with
{
  @UI: {
      lineItem: [ { position: 90 } ]
  }
  Actor.ZZName00ZFW
}
Brandeis Consulting & Cadao

Erweitern des Query Views

Dieser fehlt noch - wichtig ist hier, dass die Felder in R-View und
Draft-Query-View identisch benannt sind.

extend view entity ZR_FW_ACTOR_00_D with
{
  Actor.zzname00zfw as ZZName00ZFW
}
Brandeis Consulting & Cadao

Übung!

Es ist Zeit für die erste Übung zur Erweiterung des Datenmodells

Brandeis Consulting & Cadao

Erweiterbares Verhalten

  • In den bisherigen Folien wurde allein das Datenmodell betrachtet.
  • Nun wird auch das BO erweitert, damit wir eigene Logik implementieren können.
Brandeis Consulting & Cadao

R-Behavior Erweiterungen ermöglichen

  • Erweiterbarkeit des BOs allgemein ermöglichen
  • In diesem Fall definieren wir die Möglichkeit neuer Validations
managed implementation in class ZBP_R_FW_ACTOR_00 unique;
strict ( 2 );
with draft;
extensible
{
  with validations on save;
}
  • Erweiterbarkeit der Entität ermöglichen
define behavior for ZR_FW_ACTOR_00 alias Actor
persistent table zfw_actor_00
draft table zfw_actor_00_d query ZR_FW_ACTOR_00_D
etag master LocalLastChangedAt
lock master total etag LastChangedAt
authorization master ( global )
extensible
Brandeis Consulting & Cadao

C-Behavior Erweiterung ermöglichen

  • Erweiterbarkeit des BOs allgemein ermöglichen
projection implementation in class ZBP_C_FW_ACTOR_00 unique;
strict ( 2 );
use draft;
use side effects;
extensible
  • Erweiterbarkeit der Entität ermöglichen
define behavior for ZC_FW_ACTOR_00 alias Actor
use etag
extensible
Brandeis Consulting & Cadao

Mapping erweiterbar machen

  • Bei abweichenden Namen zwischen DB und View müssen diese im Mapping ergänzt werden
  • Dazu kann dieses auch als erweiterbar markiert werden.

In unserem Fall irrelevant, da aufgrund der Erzeugung der Draft-Tabelle von abweichenden
Namen abgeraten wird

  mapping for zfw_actor_00 corresponding extensible
    {
      ActorId            = actor_id;
      NameFirst          = name_first;
      NameLast           = name_last;
      Birthday           = birthday;
      Email              = email;
      Mobile             = mobile;
      PictureUrl         = picture_url;
      LocalCreatedBy     = local_created_by;
      LocalCreatedAt     = local_created_at;
      LocalLastChangedBy = local_last_changed_by;
      LocalLastChangedAt = local_last_changed_at;
      LastChangedAt      = last_changed_at;
    }
Brandeis Consulting & Cadao

Eigene Erweiterung ergänzen

Nachdem das BO nun auch eine Verhaltenserweiterung unterstützt, kann der Entwickler
diese auch entsprechend verwenden.

Dazu wird per Rechtsklick auf unsere R-View ZR_FW_X_Actor_00 "New Behavior Extension"
ausgewählt.

Als Ergebnis erhalten wir eine Behavior-Extension und eine zugehörige Behavior-Implementation.
Letztere muss noch per Quick-Fix erstellt werden.

extension implementation in class zbp_r_fw_x_actor_00 unique;

extend behavior for Actor
{
}
Brandeis Consulting & Cadao

Eigene Logik implementieren

Da wir nun alle "Rahmen-Objekte" haben, legen wir unsere eigene Validation an:

extension implementation in class zbp_r_fw_x_actor_00 unique;

extend behavior for Actor
{

  validation ZZcheckComment on save { field ZZName00ZFW; }

  extend draft determine action Prepare
  {
    validation ZZcheckComment;
  }

}
Brandeis Consulting & Cadao

Übung 2

Da nun an einem einfachen Beispiel gezeigt wurde, wie man eine eigene Validation definiert,
ist diese nun in der Übung zu implementieren!

Brandeis Consulting & Cadao