RAP Tutorial Teil 1: Deine erste Fiori App in 30 Minuten

kategorie
Tutorial
Veröffentlicht
autor
Johannes

Willkommen zum RAP Tutorial für Anfänger! In diesem ersten Teil baust du in 30 Minuten eine vollständige SAP Fiori App - von der Datenbanktabelle bis zur UI. Kein Vorkenntnisse erforderlich!

🎯 Was du bauen wirst

Eine Bücherverwaltung (Book Management App) mit:

  • ✅ Liste aller Bücher
  • ✅ Anlegen neuer Bücher
  • ✅ Bearbeiten/Löschen von Büchern
  • ✅ Such- und Filterfunktion
  • ✅ Automatisch generierte Fiori Elements UI

Ergebnis: Voll funktionsfähige Fiori App ohne eine Zeile UI-Code!


📋 Voraussetzungen

System

Oder:

  • SAP S/4HANA 2022 oder höher (On-Premise/Cloud)

Tools

Wissen

  • Basis ABAP-Kenntnisse hilfreich, aber nicht zwingend
  • Keine RAP-, CDS- oder Fiori-Kenntnisse nötig

Geschätzte Zeit: 30-45 Minuten


🏗️ RAP-Architektur im Überblick

Bevor wir starten, kurz die Struktur:

┌─────────────────────────────────────┐
│ Fiori Elements UI │ ← Automatisch generiert!
├─────────────────────────────────────┤
│ OData Service │ ← Service Binding
├─────────────────────────────────────┤
│ Service Definition │ ← Welche Entities exposen?
├─────────────────────────────────────┤
│ Projection Layer (C_*) │ ← UI-spezifische View
│ + Behavior Definition │
├─────────────────────────────────────┤
│ Business Object Layer (I_*) │ ← Datenmodell (CDS View)
│ + Behavior Definition (BDEF) │ ← CRUD-Logik
│ + Behavior Implementation (BIL) │
├─────────────────────────────────────┤
│ Datenbanktabelle │ ← Daten speichern
└─────────────────────────────────────┘

Keine Sorge! Klingt komplex, ist es aber nicht. Wir gehen Schritt für Schritt durch.


Schritt 1: Package erstellen

Wir brauchen ein Package für alle Objekte.

In ADT:

  1. Rechtsklick auf ZLOCAL (oder dein Package) → NewABAP Package
  2. Name: ZBOOK_RAP_TUTORIAL
  3. Description: RAP Tutorial - Book Management
  4. Package Type: Development
  5. Finish

Ergebnis: Package ZBOOK_RAP_TUTORIAL ist angelegt.


Schritt 2: Datenbanktabelle erstellen

2.1 Neue Tabelle anlegen

  1. Rechtsklick auf PackageNewOther ABAP Repository Object
  2. Suche: Database Table
  3. Name: ZBOOK_TAB
  4. Description: Books Table
  5. NextFinish

2.2 Tabellenstruktur definieren

Ersetze den generierten Code mit:

@EndUserText.label : 'Books Table'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zbook_tab {
key client : abap.clnt not null;
key book_id : abap.char(10) not null;
title : abap.char(100);
author : abap.char(50);
publisher : abap.char(50);
isbn : abap.char(13);
@Semantics.amount.currencyCode : 'zbook_tab.currency_code'
price : abap.curr(16,2);
currency_code : abap.cuky;
pages : abap.int4;
publication_year: abap.numc(4);
language : abap.char(2);
@Semantics.user.createdBy : true
created_by : abap.char(12);
@Semantics.systemDateTime.createdAt : true
created_at : timestampl;
@Semantics.user.lastChangedBy : true
last_changed_by : abap.char(12);
@Semantics.systemDateTime.lastChangedAt : true
last_changed_at : timestampl;
}

2.3 Speichern & Aktivieren

  • Speichern: Ctrl+S
  • Aktivieren: Ctrl+F3

Ergebnis: Tabelle ZBOOK_TAB existiert in der Datenbank.


Schritt 3: CDS Interface View erstellen (I_*)

Die Interface View ist das Datenmodell unseres Business Objects.

3.1 Neue CDS View anlegen

  1. Rechtsklick auf PackageNewOther ABAP Repository Object
  2. Suche: Data Definition
  3. Name: ZI_BOOK
  4. Description: Book - Interface View
  5. Referenced Object: ZBOOK_TAB
  6. NextFinish

3.2 CDS View definieren

Ersetze den Code mit:

@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Book - Interface View'
define root view entity ZI_BOOK
as select from zbook_tab
{
key book_id as BookId,
title as Title,
author as Author,
publisher as Publisher,
isbn as Isbn,
@Semantics.amount.currencyCode: 'CurrencyCode'
price as Price,
@Semantics.currencyCode: true
currency_code as CurrencyCode,
pages as Pages,
publication_year as PublicationYear,
language as Language,
@Semantics.user.createdBy: true
created_by as CreatedBy,
@Semantics.systemDateTime.createdAt: true
created_at as CreatedAt,
@Semantics.user.lastChangedBy: true
last_changed_by as LastChangedBy,
@Semantics.systemDateTime.lastChangedAt: true
last_changed_at as LastChangedAt
}

Wichtig: define root view entity - “root” bedeutet, dass dies das Haupt-Business Object ist.

3.3 Aktivieren

  • Ctrl+F3

Ergebnis: CDS View ZI_BOOK ist aktiviert.


Schritt 4: Behavior Definition erstellen (BDEF)

Die Behavior Definition definiert, was mit dem Business Object gemacht werden kann (Create, Update, Delete, etc.).

4.1 BDEF anlegen

  1. Rechtsklick auf ZI_BOOKNew Behavior Definition
  2. Implementation Type: Managed
  3. NextFinish

4.2 BDEF definieren

Ersetze den Code mit:

managed implementation in class zbp_i_book unique;
strict ( 2 );
define behavior for ZI_BOOK alias Book
persistent table zbook_tab
lock master
authorization master ( instance )
etag master LastChangedAt
{
// Standard CRUD-Operationen
create;
update;
delete;
// Felder, die readonly sind
field ( readonly ) BookId;
field ( readonly ) CreatedBy, CreatedAt, LastChangedBy, LastChangedAt;
// Automatische Nummernvergabe für BookId
field ( numbering : managed ) BookId;
// Mapping: CDS-Feld → Tabellenfeld
mapping for zbook_tab
{
BookId = book_id;
Title = title;
Author = author;
Publisher = publisher;
Isbn = isbn;
Price = price;
CurrencyCode = currency_code;
Pages = pages;
PublicationYear = publication_year;
Language = language;
CreatedBy = created_by;
CreatedAt = created_at;
LastChangedBy = last_changed_by;
LastChangedAt = last_changed_at;
}
}

Erklärung:

  • managed: Framework übernimmt CRUD-Operationen automatisch
  • strict ( 2 ): Best-Practice-Modus
  • create; update; delete;: Diese Operationen sind erlaubt
  • field ( numbering : managed ): BookId wird automatisch vergeben

4.3 Aktivieren

  • Ctrl+F3

Ergebnis: Behavior Definition ZI_BOOK ist aktiviert. ADT generiert automatisch die Behavior Implementation Class ZBP_I_BOOK.


Schritt 5: CDS Projection View erstellen (C_*)

Die Projection View ist die UI-spezifische Sicht auf das Business Object.

5.1 Projection View anlegen

  1. Rechtsklick auf PackageNewOther ABAP Repository Object
  2. Suche: Data Definition
  3. Name: ZC_BOOK
  4. Description: Book - Projection View
  5. NextFinish

5.2 Projection View definieren

@EndUserText.label: 'Book - Projection View'
@AccessControl.authorizationCheck: #NOT_REQUIRED
@Metadata.allowExtensions: true
@Search.searchable: true
define root view entity ZC_BOOK
provider contract transactional_query
as projection on ZI_BOOK
{
key BookId,
@Search.defaultSearchElement: true
@Search.fuzzinessThreshold: 0.8
Title,
@Search.defaultSearchElement: true
Author,
Publisher,
Isbn,
@Semantics.amount.currencyCode: 'CurrencyCode'
Price,
@Semantics.currencyCode: true
CurrencyCode,
Pages,
PublicationYear,
Language,
CreatedBy,
CreatedAt,
LastChangedBy,
LastChangedAt
}

Neu:

  • @Search.searchable: true: Aktiviert Suche
  • @Search.defaultSearchElement: true: Title & Author sind durchsuchbar

5.3 Aktivieren

  • Ctrl+F3

Schritt 6: Projection Behavior Definition

6.1 BDEF für Projection anlegen

  1. Rechtsklick auf ZC_BOOKNew Behavior Definition
  2. Implementation Type: Projection
  3. NextFinish

6.2 Projection BDEF definieren

projection;
strict ( 2 );
define behavior for ZC_BOOK alias Book
{
use create;
use update;
use delete;
}

Kurz und knapp: Wir “verwenden” (use) die CRUD-Operationen vom Interface Layer.

6.3 Aktivieren

  • Ctrl+F3

Schritt 7: Metadata Extensions (UI-Annotations)

Hier definieren wir, wie die UI aussehen soll.

7.1 Metadata Extension anlegen

  1. Rechtsklick auf ZC_BOOKNew Metadata Extension
  2. Name: ZC_BOOK (gleicher Name wie View)
  3. NextFinish

7.2 UI-Annotations definieren

@Metadata.layer: #CORE
annotate view ZC_BOOK with
{
// Kopfbereich der Fiori App
@UI.headerInfo: {
typeName: 'Buch',
typeNamePlural: 'Bücher',
title: { value: 'Title' },
description: { value: 'Author' }
}
// Facetten (Bereiche im Objekt-Detail)
@UI.facet: [
{
id: 'BookDetails',
purpose: #STANDARD,
type: #IDENTIFICATION_REFERENCE,
label: 'Buch-Details',
position: 10
}
]
// Felder in der Liste
@UI: {
lineItem: [{ position: 10, importance: #HIGH }],
identification: [{ position: 10 }],
selectionField: [{ position: 10 }]
}
BookId;
@UI: {
lineItem: [{ position: 20, importance: #HIGH }],
identification: [{ position: 20 }],
selectionField: [{ position: 20 }]
}
Title;
@UI: {
lineItem: [{ position: 30, importance: #HIGH }],
identification: [{ position: 30 }],
selectionField: [{ position: 30 }]
}
Author;
@UI: {
lineItem: [{ position: 40 }],
identification: [{ position: 40 }]
}
Publisher;
@UI: {
identification: [{ position: 50 }]
}
Isbn;
@UI: {
lineItem: [{ position: 50 }],
identification: [{ position: 60 }]
}
Price;
@UI: {
identification: [{ position: 70 }]
}
Pages;
@UI: {
lineItem: [{ position: 60 }],
identification: [{ position: 80 }]
}
PublicationYear;
@UI: {
identification: [{ position: 90 }]
}
Language;
}

Erklärung:

  • @UI.lineItem: Spalten in der Liste
  • @UI.identification: Felder im Detail-Bildschirm
  • @UI.selectionField: Filter-Felder oben
  • position: Reihenfolge
  • importance: HIGH = immer sichtbar

7.3 Aktivieren

  • Ctrl+F3

Schritt 8: Service Definition

8.1 Service Definition anlegen

  1. Rechtsklick auf PackageNewOther ABAP Repository Object
  2. Suche: Service Definition
  3. Name: ZUI_BOOK_O4
  4. Description: Book Service Definition
  5. NextFinish

8.2 Service definieren

@EndUserText.label: 'Book Service Definition'
define service ZUI_BOOK_O4 {
expose ZC_BOOK as Book;
}

Super einfach: Wir “exposen” nur unsere Projection View.

8.3 Aktivieren

  • Ctrl+F3

Schritt 9: Service Binding (OData Service)

Fast geschafft! Jetzt machen wir aus dem Service ein echtes OData-API.

9.1 Service Binding anlegen

  1. Rechtsklick auf PackageNewOther ABAP Repository Object
  2. Suche: Service Binding
  3. Name: ZUI_BOOK_O4
  4. Description: Book Service Binding
  5. Binding Type: OData V4 - UI
  6. Service Definition: ZUI_BOOK_O4
  7. NextFinish

9.2 Service Binding aktivieren & publishen

  1. Speichern: Ctrl+S
  2. Aktivieren: Ctrl+F3
  3. Publish klicken (Button rechts oben im Editor)

Ergebnis: OData Service ist aktiv!


Schritt 10: Fiori App öffnen 🎉

10.1 Preview starten

  1. Im Service Binding (noch offen):
  2. Entity Book markieren
  3. Preview klicken (Rechte Seite)
  4. Browser öffnet sich mit deiner Fiori App!

10.2 Testdaten anlegen

Die Liste ist noch leer. Lass uns Bücher anlegen:

  1. Create klicken
  2. Felder ausfüllen:
    • Title: Harry Potter und der Stein der Weisen
    • Author: J.K. Rowling
    • Publisher: Carlsen
    • Price: 20.00
    • Currency: EUR
    • Pages: 335
    • Publication Year: 1998
    • Language: DE
  3. Create klicken

Glückwunsch! Dein erstes Buch ist angelegt! 🎉

10.3 Features testen

  • Suche: Gib “Harry” in Suchfeld ein → findet das Buch
  • Filter: Klicke auf Filter → Filtere nach Author
  • Edit: Klicke auf Buch → Edit → Ändere Preis → Save
  • Delete: Markiere Buch → Delete

Alles funktioniert - ohne eine Zeile UI-Code!


🎯 Was haben wir gelernt?

Objekte erstellt:

  1. Datenbanktabelle (ZBOOK_TAB)
  2. CDS Interface View (ZI_BOOK)
  3. Behavior Definition Interface (BDEF)
  4. CDS Projection View (ZC_BOOK)
  5. Behavior Definition Projection
  6. Metadata Extension (UI-Annotations)
  7. Service Definition (ZUI_BOOK_O4)
  8. Service Binding (OData V4)

RAP-Prinzipien:

  • Managed Szenario: Framework übernimmt CRUD
  • Interface vs. Projection: Trennung Business Logic / UI
  • Behavior Definition: Was kann mit Daten gemacht werden?
  • Fiori Elements: UI wird aus Annotations generiert

🚀 Nächste Schritte

In Teil 2: Advanced Features lernst du:

  • Actions hinzufügen (z.B. “Als gelesen markieren”)
  • Validations (z.B. ISBN-Prüfung)
  • Determinations (automatische Werte setzen)
  • Value Helps (Dropdown-Listen)

In Teil 3: Best Practices:

  • Performance-Optimierung
  • Error Handling
  • Testing
  • Häufige Fehler vermeiden

📚 Weiterführende Ressourcen

Auf abapcloud.com:

SAP Tutorials:


💬 Fragen?

  • Hat alles funktioniert?
  • Wo bist du hängengeblieben?
  • Was soll in Teil 2 vertieft werden?

Schreib uns in den Kommentaren!

Weiter mit Teil 2: Advanced Features