BW/4HANA

ABAP Programmierung im BW

(C) Brandeis Consulting

Einsatzstellen

  • Transformationsroutinen
  • Bex-Queryvariablen Exits
  • DTP Filterroutinen
  • BADI Provider
(C) Brandeis Consulting

Einsatzstellen

  • Transformationsroutinen
  • Bex-Queryvariablen Exits
  • DTP Filterroutinen
  • BADI Provider
(C) Brandeis Consulting

Transformationsroutinen

  • Startroutinen
  • Feldroutinen
  • Endroutinen
  • Expertenroutinen
(C) Brandeis Consulting

Übersicht über die Erweiterungsmöglichkeiten mit ABAP

Transformationsroutinen

Die Logik der Transformationen kann durch ABAP- oder AMDP-Transformationsroutinen erweitert oder auch vollständig ersetzt werden.

Bex-Variablenexits

Die Filter-Variablen im Reporting können durch ABAP Code mit initialen Werten versorgt werden oder es können Filterwerte aus den Eingaben des Nutzers abgeleitet werden.

DTP Filter

Die Filterkriterien für einen Daten Transfer Prozess können mit Hilfe von ABAP Logik ermittelt werden.

BADI Provider

Ein InfoProvider, der vollständig in ABAP implementiert ist. Die Herkunft der Daten ist beliebig.

(C) Brandeis Consulting

Transformationsroutinen

(C) Brandeis Consulting

Arten von Transformationsroutinen

Expertenroutine

Die Expertenroutine ersetzt eine Transformation vollständig. Alle grafische Modellierung, Feldzuweisungen, Formeln usw. werden durch Quellcode ersetzt.

Endroutine

Die Endroutine ergänzt die normale Transformationslogik. Sie wird als aller letzter Schritt nach Verarbeitung der sonstigen Transformationslogik ausgeführt und kann alle Daten übersteuern.

Startroutine

Die Startroutine wird vor der sonstigen Transformationslogik ausgeführt.

Feldroutine

Eine Feldroutine berechnet den Wert eines einzelnen Feldes.

(C) Brandeis Consulting

ABAP Klasse der Transformationsroutinen

  • Globale Klasse mit ähnlichem Namen wie die Transformation
  • Die _M-Klasse ist zum Erfassen des Codes
  • Die Klasse darf nur dort erweitert werden, wo das explizit erlaubt ist:
    ... "insert your code here
  • Sonstiger Code wird nicht in das generierte ABAP übernommen und ggf. beim nächsten Generieren der Klasse gelöscht. :-(

(C) Brandeis Consulting

Beispiel für Routinenklasse

class /BIC/ETBT0DZHGC8LNFL0Y264_M definition
  public
  create public .

public section.

  interfaces IF_AMDP_MARKER_HDB .
  • Definition der Zeilentypen von RESULT_PACKAGE und SOURCE_PACKAGE
  • Definition der Tabellentypen für RESULT_PACKAGE und SOURCE_PACKAGE
METHOD GLOBAL_EXPERT.

     FIELD-SYMBOLS:
       <SOURCE_FIELDS>    TYPE _ty_s_SC_1.

     DATA:
       RESULT_FIELDS      TYPE _ty_s_TG_1.


* Note the _M class are not considered for DTP execution.
* ABAP Breakpoints must be set in the generated program instead

**** begin of routine - insert your code only below this line       ****

... "insert your code here

**** end of routine - insert your code only before this line        ****
ENDMETHOD.
(C) Brandeis Consulting

Lookup optimal

Maßgeschneiderte Puffertabelle definieren

  • Nur die benötigten Spalten
  • Hashed-Table mit passendem Schlüssel

Füllen nur mit den relevanten Daten

Gilt nur für große Tabellen > 1Mio.!

  • Datenmenge mit FOR ALL ENTRIES auf die relevanten Daten reduzieren.

READ TABLE oder Table Expressions

  • Mit dem passenden Tabellenschlüssel
  • Immer den Fall beachten, dass Daten nicht gefunden werden. Was soll dann passieren?
    • Initialwert
    • Defaultwert
    • Sonstiges
(C) Brandeis Consulting

Lookup Beispiel

  METHOD global_end.

    FIELD-SYMBOLS:
      <result_fields>    TYPE _ty_s_TG_1.

    DATA: monitor_rec     TYPE rstmonitor,
          lt_account TYPE HASHED TABLE OF zaccount WITH UNIQUE key account.

* Note the _M class are not considered for DTP execution.
* ABAP Breakpoints must be set in the generated program instead

* ABAP Breakpoints within an ABAP End-Routine must be set
* in the _A class if the transformation runtime is set to SAP HANA!

**** begin of routine - insert your code only below this line       ****

    SELECT *
      FROM zaccount
      FOR ALL ENTRIES IN @result_package
      WHERE account = @result_package-account
      INTO TABLE @lt_account.

    LOOP AT result_package ASSIGNING <result_fields>.
        try.
            <result_fields>-acctype = lt_account[ account = <result_fields>-account ].
        catch CX_SY_ITAB_LINE_NOT_FOUND.

        endtry.
    ENDLOOP.

**** end of routine - insert your code only before this line        ****
  ENDMETHOD.
(C) Brandeis Consulting

Datentypen in den Transformationsroutinen

SourcePackage

  • Bei Startroutinen und Expertenroutinen
  • Struktur wie die Quelle + Feld RECORD

ResultPackage

  • Bei EndRoutinen und Expertenroutinen
  • Struktur wie das Ziel + Feld RECORD

SourceStructure

  • Bei Startroutinen
  • Struktur wie die Quelle + Feld RECORD
(C) Brandeis Consulting

Feld RECORD

Das Feld RECORD muss eindeutig im RESULT-Package sein.

(C) Brandeis Consulting

Nachteile bei Programmierung direkt in der Routine

  • Codeänderungen bewirken Deaktivierung von BW-Objekten. Transport von BW-Objekten ist notwendig. ==> Langsam
  • Modularisierung in Methoden ist nicht möglich ==> Zwang zu episch langen Methoden
  • Automatisierte Unit-Tests sind nicht möglich
  • Wiederverwendbarkeit nicht möglich, z.B. X Datenmodelle mit gleicher Struktur
(C) Brandeis Consulting

Auslagern der Routinen in Z-Klassen

Optionen:

  • Einfache ABAP Klasse - Beispiel folgt
  • Gemeinsame Superklasse oder Interface für alle Routinen
(C) Brandeis Consulting

Beispiel für einen Klassenrumpf

CLASS zcl_trf_demo01 DEFINITION PUBLIC FINAL CREATE PUBLIC .
  PUBLIC SECTION.
    TYPES: BEGIN OF ts_result_package,
             record     TYPE if_rs_bw_types=>tn_rsarecord,
             budat      TYPE d,
             valtype    TYPE c LENGTH 2,
             account    TYPE c LENGTH 6,
             recordmode TYPE rodmupdmod,
             amount     TYPE p LENGTH 9 DECIMALS 2,
             curr       TYPE c LENGTH 5,
             acctype    TYPE c LENGTH 4,
           END OF ts_result_package.           
    TYPES tt_result_package TYPE  STANDARD TABLE OF ts_result_package.

    METHODS end_routine
      IMPORTING
        !request        TYPE if_rs_bw_types=>tn_rsrequest
        !datapackid     TYPE if_rs_bw_types=>tn_rsdatapid
        !segid          TYPE if_rs_bw_types=>tn_rsbk_segid
      EXPORTING
        !monitor        TYPE if_rs_bw_types=>tn_rstr_ty_t_monitors
      CHANGING
        !result_package TYPE tt_result_package
      RAISING
        cx_rsrout_abort
        cx_rsbk_errorcount .
ENDCLASS.
CLASS zcl_trf_demo01 IMPLEMENTATION.
  METHOD end_routine.

  ENDMETHOD.
ENDCLASS.
(C) Brandeis Consulting

Aufruf der ausgelagerten Klasse

Das geht leider nicht!

METHOD global_end.



  new zcl_trf_demo01( )->end_routine(
    EXPORTING
      request        =  request
      datapackid     =  datapackid
      segid          =  segid
    IMPORTING
      monitor        =  monitor
    CHANGING
      result_package =  result_package
  ).


ENDMETHOD.

Alternative mit MOVE-CORRESPONDING

METHOD global_end.
  DATA: lt_result_package TYPE zcl_trf_demo01=>tt_result_package.
  MOVE-CORRESPONDING result_package TO lt_result_package.

  NEW zcl_trf_demo01( )->end_routine(
    EXPORTING
      request        =  request
      datapackid     =  datapackid
      segid          =  segid
    IMPORTING
      monitor        =  monitor
    CHANGING
      result_package =  lt_result_package
  ).

  MOVE-CORRESPONDING lt_result_package TO result_package.
ENDMETHOD.

Die Definition des RESULT_PACKAGE ist leider im Runtime-Code anders als im Designtime-Code. Darum mit MOVE-CORRESPONDING entkoppeln.

(C) Brandeis Consulting

Auslagern in eine Z-Klasse

(C) Brandeis Consulting

Das Monster-LOOP Problem

Ein Monsterloop ist ein typisches Anti-Pattern in BW-Transformationsroutinen:
Alle Logik findet in einem einzigen, großen LOOP über das RESULT_PACKAGE statt. Wenn dieser viel Logik bzw. viel Quelltext enthält, dann führt das zu Folgeproblemen:

  • Meist kann niemand mit Sicherheit sagen, welche Anforderungen in dem LOOP implementiert sind.
  • Die Komplexität steigt, weil alle Bereiche miteinander gekoppelt sein können. Änderungen an einer Stelle können unerwartete bzw. -erwünschte Verhaltensänderungen an anderen Stellen bewirken.
  • Neue Anforderungen werden mehr oder weniger kunstvoll eingefügt.
  • Im Debugger ist die Navigation schwer
(C) Brandeis Consulting

Optimierung des Codes

  • Zerlegung in mehrere LOOPs
  • Verlagerung der LOOPs in Methoden
(C) Brandeis Consulting