SQLScript in BW Transformationsroutinen

SQLScript in BW Transformationsroutinen
Jörg Brandeis

(C) Brandeis Consulting.

Demo AMDP Anlegen

Aufgabenstellung
Lege eine Methode GET_COUNTRIES_TEXT an, die für eine gegebene Sprache alle Texte der Länder aus der Tabelle T005T ausliest.

Schritte

  1. Implementierung in ABAP
  2. Testprogramm anlegen, das die Methode aufruft und das Ergebnis ausgiebt.
  3. Implementierung in SQLScript
(C) Brandeis Consulting.

Demo: Im AMDP anderer Prozedur aufrufen

Aufgabenstellung
Rufe die Methode aus der vorherigen Demo mit der Sprache 'E' in einer neuen AMDP Methode GET_COUNTRIES_TEXT_EN auf.

(C) Brandeis Consulting.

SAP-HANA-Ausführung eines DTPs

Wenn eine Transformation gewisse Bedingungen erfüllt, kann sie ab Release 7.40 SPS05 direkt auf der SAP-HANA-Datenbank ausgeführt werden. Die wichtigste Voraussetzung hierfür ist, dass keine ABAP-Routinen vorhanden sind.

Ob eine Ausführung in SAP HANA möglich ist, sieht man unter 7.40/7.50 am Feld Laufzeitstatus:

(C) Brandeis Consulting.

ABAP-Ausführung eines DTPs (Abbildung)

(C) Brandeis Consulting.

SAP-HANA-Ausführung eines DTPs (Abbildung)

(C) Brandeis Consulting.

Performancegewinn bei HANA-Ausführung

Die höhere Performance bei der SAP-HANA-Ausführung hat mehrere Gründe:

  • Kein Kopieren der Daten zwischen ABAP und HANA
  • Größere Datenpakete (typisch: 1.000.000 vs. 50.000) reduzieren den Overhead für die Statusverwaltung und das Monitoring.
  • Durch die Verarbeitung direkt auf der SAP-HANA-Datenbank kann die Datenverarbeitung gut parallelisiert werden.
  • Vorhandene Routinen sind bei SAP-HANA-Transformationen in SQLScript implementiert. Diese lassen sich dann gut optimieren.
(C) Brandeis Consulting.

Werkzeuge

  • Die Implementierung von AMDP-Routinen erfordert die Verwendung der ABAP Development Tools (ADT) in Eclipse.
  • Die Modellierung der BW-Transformation sollte mit den BW Modelling-Tools (BW-MT) in Eclipse erfolgen, da hier der Absprung in die Routine-Implementierung besser funktioniert.
  • Mit dem AMDP-Debugger können die Routinen debuggt werden.
  • Mit der HANA SQL-Konsole können Transformationsroutinen direkt getestet bzw. simuliert werden.
(C) Brandeis Consulting.

Transformationsroutinen als AMDP

Alle Routinen einer Transformation müssen in der gleichen Technologie implementiert werden: Entweder ABAP oder AMDP

(C) Brandeis Consulting.

Aufeinanderfolgende Transformationen und gemischte Ausführung

  • Zwischen einer Quelle und einem Ziel können auch mehrere Transformationen liegen, wenn dazwischen eine InfoSource modelliert wurde
  • Die Laufzeitumgebung darf sich unterscheiden, solange die unteren Transformationen auf HANA-Ausführbar sind.
  • Eine ABAP-Transformation darf nie unter einer HANA-Transformation liegen.
    Im Falle einer gemischten Ausführung ist keine Fehlerverarbeitung möglich.
  • SAP empfiehlt pro Datenfluss maximal zwei InfoSources, siehe Blog von Thorsten Kessler
(C) Brandeis Consulting.

Die generierte AMDP-Klasse

BW on HANA

  • Für jede Routine wird eine eigene AMDP-Klasse im $TMP Paket mit kryptischem GUID-Namen im /BIC/-Namensraum generiert.
  • Die Verbindung von Routine zu Transformation wird in der Transformation gespeichert
  • Diese enthält immer genau eine Methode mit dem Namen PROCEDURE.

BW/4HANA

  • Für jede Transformation werden zwei AMDP-Klasse im /BIC/-Namensraum generiert.
  • Der TRF-Name ist im Klassennamen enthalten.
  • Die Klassen haben die Endung _M(=Modifiziert) und _A (=Aktiv).
  • Die Klassen enthalten pro Routine eine Methode.

(C) Brandeis Consulting.

Demo & Übung: Endroutine anlegen

Exercise 0 - Anlegen einer Transformationsroutine für die Ableitung der CAL-Merkmale.

(C) Brandeis Consulting.

Simulation einer Transformationsroutine in der Konsole

Der wiederholte Test von Transformationen ist zeitraubend. Dabei kann man den Code einer Transformation relativ einfach in der SQL-Konsole testen.

Vorgehen:

  • Anlegen eines anonymen Blocks: DO BEGIN..END
  • Einfügen des Transformationscodes
  • Am Anfang des Blocks die Tabelle INTAB definieren und füllen
  • Am Ende die OUTTAB abfragen
DO BEGIN
  intab = SELECT *, 
                 '' AS record, 
                 '' AS sql__procedure__source__record
            FROM "/BIC/A<DSO-Name>2";            
            --ggf. WHERE Bedingung oder LIMIT 1000 um die Datenmenge klein zu halten 
--------------------------------
  --Hier kommt der Routinen-Code hin
--------------------------------
  SELECT * FROM :outtab;
END;
(C) Brandeis Consulting.

Transport der Routine

  • Die AMDP-Klasse ist lokal ($TMP) und kann deshalb nicht transportiert werden.
  • Stattdessen wird der Quellcode jeweils in den Metadaten der Transformationen (Tabelle RSTRANSTEPROUT) gespeichert.
  • Beim Aktivieren der Transformation wird daraus dann die Klasse im Zielsystem jeweils neu generiert.
(C) Brandeis Consulting.

Signatur der AMDP-Methoden

Die Schnittstelle der Methode PROCEDURE wird jeweils passend zu der Transformation generiert. Dabei gibt es für alle vier Routine-Typen die gleichen Parameter:

  • Eingangstabelle INTAB – Die Daten werden über den IN-Parameter mit dem Namen INTAB an die Routine übergeben.
  • Ausgabetabelle OUTTAB – Das Ergebnis der Routine wird in den Tabellenparameter OUTTAB geschrieben. Zum Aktivieren der AMDP-Klasse ist es erforderlich, dass dieser Parameter mit einer entsprechenden SELECT-Abfrage gefüllt wird.

Ab BW/4HANA nur noch, falls die Fehlerverarbeitung angeschaltet ist:

  • Ausgabetabelle ERRORTAB – Fehlerhafte Datensätze werden in diese Tabelle geschrieben. Sie besteht aus zwei Feldern:
    • ERROR_TEXT – Beschreibung des Fehlers
    • SQL__PROCEDURE__SOURCE__RECORD – Feld aus dem zugehörigen Datensatz der INTAB
  • skalarer Parameter I_ERROR_HANDLING – Dieser Parameter hat den Wert TRUE, wenn der aktuelle Prozeduraufruf die Fehlertabelle ERRORTAB abfragt.
(C) Brandeis Consulting.

Erweiterte Signatur (ab BW/4HANA)

Parameter Beschreibung
I_REQ_DTP_NAME Technischer DTP Name
I_REQ_LOGSYS Name des logischen Quellsystems
I_REQ_SRC_NAME Quellobjekt des DTPs
I_REQ_SRC_TYPE Typ des Quellobjektes
I_REQ_TGT_NAME Zielobjekt des DTPs
I_REQ_TGT_TYPE Typ des Zielobjektes
I_REQ_REQUID Request ID - Ein Zeitstempel der für alle Pakete gleich ist!
(C) Brandeis Consulting.

Das Feld RECORD in den Tabellen

Das Feld RECORD ist eine 56 Zeichen lange Zeichenkette.

Nach der Transformation werden die Datensätze nach diesem Feld sortiert.

Das kann für die Reihenfolge des Einfügens in das Ziel der Transformation relevant sein. Initial enthält das Feld RECORD die verketteten Felder REQUESTID, DATAPAKID und RECORD aus der Quelle der Transformation.

Bei aufeinanderfolgenden Transformationen enthält es den Wert des Feldes RECORD der vorhergehenden Transformation.

(C) Brandeis Consulting.

Verändern des Feldes RECORD

  • Wenn die Sortierreihenfolge in einem Szenario relevant ist, so müssen Sie als Entwickler der AMDP-Routine dafür sorgen, dass das Feld RECORD mit einem entsprechenden Inhalt gefüllt wird.
  • Wenn die Daten z. B. nach einem Datumsfeld und einem Zeitfeld sortiert werden sollen, so können Sie dieses beiden verkettet in die Spalte RECORD schreiben.

Codebeispiel / Demo

Sie können mit der Window-Funktion ROW_NUMBER() auch eine laufende Nummer erzeugen. Beachten Sie bitte hierbei, dass das Feld den Datentyp Zeichenkette hat und entsprechend eine alphanumerische Sortierung stattfindet. Damit hierbei die 10 nicht vor der 2 kommt, müssen Sie mit LPAD ( <LfdNr.>, 56, '0') führende Nullen anfügen.

outtab = SELECT ...          
                LPAD( ROW_NUMBER() OVER (ORDER BY <Sortierung>), 56, '0')  AS RECORD,
                SQL__PROCEDURE__SOURCE__RECORD
       FROM :intab ;
(C) Brandeis Consulting.

SQL__PROCEDURE__SOURCE__RECORD

In dem Feld SQL__PROCEDURE__SOURCE__RECORD steht ein eindeutiger Schlüssel für Datensätze in der Tabelle INTAB.

Durch diesen Schlüssel können Einträge in der Fehlertabelle ERRORTAB dem jeweiligen Datensatz aus der INTAB zugeordnet werden. Falls in einer Routine neue Datensätze generiert werden, soll der Wert des jeweiligen Quell-Datensatzes übernommen werden.

(C) Brandeis Consulting.

Demo: Testprogramm für eine AMDP-Routine

Optional, falls eine Ausführung in der SQL-Konsole nicht möglich ist.

REPORT Z_TEST_AMDP.

DATA lt_intab TYPE /BIC/GJXH4BF0CQHVTB53PRRU_M=>tn_t_in_global_end.

SELECT * FROM /bic/azbr_e1_s2
    INTO CORRESPONDING FIELDS OF TABLE lt_intab UP TO 100 ROWS.

new /BIC/GJXH4BF0CQHVTB53PRRU_M( )->GLOBAL_END(
  EXPORTING
    I_REQ_DTP_NAME = ''
    I_REQ_LOGSYS   = ''
    I_REQ_SRC_NAME = ''
    I_REQ_SRC_TYPE = ''
    I_REQ_TGT_NAME = ''
    I_REQ_TGT_TYPE = ''
    I_REQ_REQUID   = ''
    intab            = lt_intab
  IMPORTING
    outtab           = data(lt_outtab)
).

cl_demo_output=>display(  lt_outtab ).
(C) Brandeis Consulting.

Zuweisung der Ausgabetabellen

Die Ausgabetabelle OUTTAB und ggf. auch ERRORTAB müssen im SQLScript-Quellcode zugewiesen werden, sonst gibt es Syntaxfehler. Dies ist auch dann erforderlich, wenn Sie keine Fehlerverarbeitung durchführen wollen.

 METHOD global_end BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY.
    OUTTAB   = SELECT * FROM :INTAB;
    ERRORTAB = SELECT '' AS ERROR_TEXT,
                      '' AS SQL__PROCEDURE__SOURCE__RECORD
                 FROM DUMMY WHERE DUMMY <> 'X';
  ENDMETHOD.

Dieser Code entspricht dem initialen Code der generierten Methode einer Endroutine auf einem BWoH 7.50, auch wenn er in dem Beispiel etwas ansprechender formatiert wurde.

  • Die Tabelle OUTTAB wird 1:1 aus der INTAB gefüllt.
  • Die Tabelle ERRORTAB bleibt offenbar leer.
ERRORTAB = SELECT * FROM :ERRORTAB;
(C) Brandeis Consulting.

Zugriff Datenbanktabellen mit USING

Falls Sie andere Datenbanktabellen, Views, AMDP-Prozeduren oder -Funktionen verwenden, müssen Sie diese zuvor mit der USING-Klausel in der METHOD-Anweisung hinzufügen:

 METHOD global_end BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT 
  OPTIONS READ-ONLY USING /bi0/aepm_adso32.
    OUTTAB   = SELECT
                    IT.epm_po,
                    IT.epm_ipos,
                    ...
 		        	lookup.epm_langu,
                    lookup.epm_poovs,
                    it.record,
                    it.sql__procedure__source__record
                    FROM :INTAB as IT
                    left outer join "/BI0/AEPM_ADSO32" as lookup
                    on it.epm_po = lookup.epm_po
                    and it.epm_ipos = lookup.epm_ipos;
  ENDMETHOD.
  • Im ABAP wird die Tabelle ohne Gänsefüßchen geschrieben
  • Im SQL wird die Tabelle mit Gänsefüßchen geschrieben!
(C) Brandeis Consulting.

Tabellen & Views der ADSOs

Die Tabellen- und Viewnamen für die ADSOs werden nach dem folgenden Schema gebildet:
/BIC/A<DSO-Name><Suffix>

Tabellen

Unabhängig vom Typ des ADSOs werden immer drei Tabellen angelegt. Je nach Typ werden jedoch teilweise nur manche davon genutzt:

  • Eingangstabellen (1)
  • Aktive Tabelle (2)
  • Änderungstabelle (3)

Die Tabellen sind nicht für den öffentlichen Gebrauch freigegeben SAP Hinweis 1682131
"Diese Fälle werden zwar unterstützt, für das Testen und die Update-/Upgrade-Kompatibilität ist jedoch der Kunde verantwortlich."

Views

Zusätzlich zu den Tabellen werden noch zwei bis drei Views erzeugt:

SAP Hinweis 2723506

"Der externe SAP-HANA-SQL-View bietet eine stabile Schnittstelle, die einen offiziellen und autorisierten Zugriff auf die in einem aDSO enthaltenen Daten ermöglicht"

(C) Brandeis Consulting.

Lesen aus anderen DDIC-Tabellen

Beim lesen aus nicht-/BIC/ Tabellen muss ggf. der Mandat berücksichtigt werden. Dafür gibt es die Session-Variablen, die die notwendigen Informationen enthalten.

 SELECT ...
  FROM <DDic-Table>
  WHERE mandt = session_context( 'CLIENT' )

Falls die Routine auf den Mandaten aus dem Session Context zugreift, lässt sich die Routinen nicht so einfach in der Konsole simulieren.
Dazu muss dann in der Benuztzerverwaltung der HANA der entsprechende Parameter Session Client gepflegt sein:

(C) Brandeis Consulting.

NOT NULL

In den Ergebnisstabellen dürfen keine NULL-Werte stehen. Falls doch, kommt es zu einer Fehlermeldung:

Die automatische Initialisierung existiert ab BW/4HANA 2021:

(C) Brandeis Consulting.

Vermeidung von NULL

  • Spalten, die durch einen OUTER JOIN gefüllt werden, sollte hier immer mit der COALESCE oder IFNULL-Funktion abgesichert werden.
  • Die SQL-Funktion COALESCE liefert aus einer Reihe von Werten den ersten (linkesten) Wert zurück, der nicht NULL ist.
  • Die SQL-Funktion IFNULL funktioniert genauso, nur mit exakt zwei Parametern
  • CASE Ausdrücke sollten immer einen ELSE Zweig haben, auch wenn dieser theoretisch nie aufgerufen wird.
(C) Brandeis Consulting.

Startroutinen

Die Startroutine wird am Anfang der Transformation durchlaufen, also bevor die Zuweisung der einzelnen Felder und deren Verarbeitung mit den Feldregeln erfolgt. Dementsprechend umfassen die beiden Tabellenparameter INTAB und OUTTAB die Felder der Datenquelle.

Typische Aufgaben der Startroutinen sind:

  • Filtern von Datensätzen, wenn die Selektionskriterien im DTP nicht ausreichen, z.B. weil sie erst durch einen Join ermittelt werden können.
  • Hinzufügen von Datensätzen, die dann in den weiteren Schritten der Transformation genau wie die ursprünglichen Daten verarbeitet werden.

Beides kann genauso in der End- oder Expertenroutine geschehen!

(C) Brandeis Consulting.

Endroutinen

Die Endroutine wird als letzter Schritt der Transformation durchgeführt. Deswegen enthält die Feldliste von INTAB und OUTTAB die Feldnamen des Datenziels.
Das Ergebnis der Endroutine wird direkt an das Datenziel übergeben. Dementsprechend kann sie alle anderen zu diesem Zeitpunkt bereits durchgeführten Verarbeitungsschritte übersteuern.

Typische Anwendungsfälle für Endroutinen:

  • Filterung der Daten auf das Ergebnis der vorherigen Verarbeitungsschritte.
  • Berechnung bzw. Ableitung von mehreren Feldern mit (teilweise) gemeinsamer Logik. DRY-Prinzip
  • Abhängigkeiten unter den zu berechnenden Feldern.
(C) Brandeis Consulting.

Expertenroutinen

Die Expertenroutine ersetzt die gesamte Transformationslogik. Wenn also eine Expertenroutine angelegt wird, sind keine Feldregeln (1:1-Mapping, Formeln, Lookups etc.) mehr möglich. Die Tabelle INTAB enthält nur die Felder der Quelle und die Tabelle OUTTAB die Felder des Ziels der Transformation.

Typische Anwendungsfälle

  • Felder aus Quelle und Ziel werden benötigt
  • Die Logik würde sich sonst auf viele Stellen verteilen (Feldregeln, Start- und Endroutine)
  • Trigger-DSOs
(C) Brandeis Consulting.

Feldroutinen

Die Feldroutinen ermitteln die Werte für genau ein Zielfeld. Zur Eingabe dienen ein oder mehrere Quellfelder, die in der Definition der Regeldetails zugeordnet werden

  • Eine AMDP-Feldroutine wird nur einmal aufgerufen
  • Alle Quellfelder der Regel stehen in der INTAB zur Verfügung
  • Das Ergebnis wird in die OUTTAB geschrieben
  • Das Ergebnis wird per VERTICAL_UNION mit dem Rest der Daten vereinigt
  • Es dürfen keine Datensätze verlorengehen oder hinzugefügt werden.
  • Der Inhalt der Felder RECORD und SQL__PROCEDURE__SOURCE__RECORD darf nicht verändert werden.

(C) Brandeis Consulting.

Fehlerverarbeitung und Error Stack

TLDR - Es funktioniert nicht sauber!

In allen vier Routinentypen kann eine Fehlerverarbeitung erfolgen. Das bedeutet, dass die Routine die Werte des Feldes SQL__PROCEDURE__SOURCE__RECORD der fehlerhaften Datensätze aus der INTAB in die Tabelle ERRORTAB schreibt. Dort kann in der Spalte ERROR_TEXT auch ein geeigneter Fehlertext mitgegeben werden
Fehlerverarbeitung bitte gründlich testen

In der Vergangenheit hatte der Bereich Fehlerbehandlung und Error-Stack immer wieder Probleme gemacht. Es empfiehlt sich vor der Nutzung dieser Funktionen ein gründlicher Test, auch nach der Einspielung von neuen SPs.

(C) Brandeis Consulting.

SAP Hinweis 2580109 – Error Handling

SAP Hinweis 2580109 – Error Handling

"Grundsätzlich ist mit großen Performance-Einschränkungen zu rechnen, ... längere Ladezeit ergeben kann als mit der ABAP-Runtime"

"Im Allgemeinen ist Szenario 2 zu empfehlen. Die Verwendung von Szenario 1 muss genaustens getestet werden"
==> Errorstack wird von der SAP nicht empfohlen!

(C) Brandeis Consulting.

Ablauf der Verarbeitung im Datentransferprozess

Jede Transformation, und somit auch jede Routine, wird beim Ausführen eines Datentransferprozesses zweimal durchlaufen.
Beim ersten Durchlauf werden die fehlerhaften Datensätze ermittelt und beim zweiten Mal findet erst die eigentliche Verarbeitung statt.

h=400

h=400

  1. Beispiel: DTP Verarbeitung mit Fehlerbehandlung
    Erster Durchlauf des Beispiels
    Das Feld Beleg bildet eine semantische Gruppe. Das bedeutet, dass wenn eine Position auf einem Beleg fehlerhaft ist, der gesamte Beleg fehlerhaft ist und soll aussortiert werden.
    Datensätze ohne gültige Währung werden als fehlerhaft angesehen und von der Routine beim ersten Durchlauf in die ERRORTAB geschrieben.
    Der Datentransferprozess sortiert daraufhin alle Datensätze aus, die in einer semantischen Gruppe zusammen mit fehlerhaften Datensätzen sind.
    Zweiter Durchlauf des Beispiels
    Die korrekten Datensätze werden im zweiten Durchlauf der Routine von der Tabelle INTAB in die Tabelle OUTTAB verarbeitet.
    Dass die Routine zweimal durchlaufen wird, bedeutet nicht unbedingt, dass sich die Laufzeit verdoppelt. Beim ersten Durchlauf wird vom Datentransferprozess nur die Ausgabetabelle ERRORTAB abgefragt, beim zweiten Durchlauf nur die Ausgabetabelle OUTTAB. Wenn diese voneinander unabhängig ermittelt werden können, dann wird die SAP-HANA-Datenbank die Ausführung so optimieren, dass jeweils nur die tatsächlich benötigten Anweisungen durchlaufen werden.
  2. Beispiel: Fehlerhafte Daten in Tabelle OUTTAB erkennen
    Manchmal lassen sich die fehlerhaften Daten erst nach der Berechnung der Tabelle OUTTAB erkennen. Deswegen wird die Tabelle ERRORTAB häufig durch eine SELECT-Abfrage auf die Tabelle OUTTAB ermittelt, wie in Listing 1.8 zu sehen.
  3. Beispiel: Ungültige Feldinhalte mit regulären Ausdrücken finden
    Ein typischer Fallstrick in der Datenverarbeitung mit SAP BW sind die nicht erlaubten Zeichen. Welche Zeichen erlaubt sind, wird im Customizing des BW-Systems eingestellt. Normalerweise bereiten vor allem die Steuerzeichen wie z. B. Backspace oder der Zeilenumbruch Probleme.
    Sobald die Daten mit unerlaubten Zeichen in SAP BW als Schlüssel für InfoObjects verwendet werden, kommt es zu Aktivierungsfehlern. Da die ADSOs auch feldbasiert, also ohne Zuweisung von InfoObjects, modelliert sein können, fallen die nicht erlaubten Zeichen dort zunächst nicht auf. Neben den unerlaubten Zeichen gibt es Fehler, wenn Merkmalswerte in SAP BW mit einem Ausrufezeichen beginnen oder nur aus dem Doppelkreuz # bestehen.
    In Listing 1.9 habe ich eine AMDP-Routine erstellt, die in der Spalte TEXT diese Steuerzeichen mit regulären Ausdrücken erkennt und die entsprechenden Datensätze in die ERRORTAB schreibt. Diese Routine gibt die Tabelle INTAB ohne Veränderung 1:1 zurück an die Tabelle OUTTAB.
    3.Beispiel Quelltext
    Diese Routine lässt sich einfach um weitere zu prüfende Felder erweitern. Normalerweise müssen aber nicht alle Felder geprüft werden, denn diese Fehler treten nur in Feldern auf, die im Quellsystem manuell (vor allem mit Copy & Paste) erfasst werden, und dort, wo keine Prüftabelle hinterlegt ist, z. B. bei Buchungstexten.
    Eine Alternative zu der gezeigten Implementierung wäre eine Ersetzung der Steuerzeichen mit einem Leerzeichen.
(C) Brandeis Consulting.

Semantic Grouping in der HANA Ausführung

Mit BW/4HANA funktioniert die semantische Gruppierung, Mit BW on HANA (7.40/7.50) nicht. ;-(

Alternativen sind:

  • Große Paketgrössen. Allerdings muss man bedenken, dass mit unter auch Daten komplett neu aufgebaut werden müssen. Dann reicht die Paketgrösse der täglichen Loads vielleicht nicht mehr...
  • Nachlesen der kompletten Quelldaten für die Schlüssel:
 new_intab = select *
                from "/BIC/AZBR_E2_S2"
                WHERE ( "BUDAT",  "ACCOUNT" ) in (select budat,
                                                         account
                                                    from :intab);
(C) Brandeis Consulting.

AMDP Debugging

Der Status des AMDP-Debuggers

Ein Breakpoint wird im AMDP-Debugger, wie im ABAP-Debugger auch, als kleiner runder Kreis links von der Zeilennummer dargestellt:

(C) Brandeis Consulting.

Der Status der Breakpoints

Der Kreis des Breakpoints ändert je nach Status seine Farbe:

Farbe Bedeutung
Blau Nur kurz direkt nach dem Setzen des Breakpoints. Die Routine wird für das Debuggen im Hintergrund nochmals kompiliert.
Grün Der Breakpoint ist bestätigt und der Debugger aktiv.
Grau Der Debugger ist inaktiv. Er kann durch das Kontextmenü auf dem Breakpoint aktiviert werden.
Weiss Der Breakpoint ist deaktivert. Er kann ebenfalls durch das Kontextmenü auf dem Breakpoint aktiviert werden.

Nach 10 Minuten Inaktivität deaktiviert sich der Debugger von alleine.

(C) Brandeis Consulting.

Debugging von BW-Transformationsroutinen

Typische Fehlerquellen beim Debuggen:

  • Keine Daten in der Quelle oder keine Daten abzuholen im Delta Modus
  • Falsche Option beim Ausführen (Parallel statt seriell)
  • In BW/4HANA muss der Breakpoint in der _A-Klasse gesetzt werden! Siehe https://launchpad.support.sap.com/#/notes/2659814
(C) Brandeis Consulting.

Debug Mode vs. Optimized Mode

Damit Prozeduren mit dem AMDP-Debugger analysiert werden können, werden diese im sogenannten Debug-Modus neu kompiliert. Das bedeutet, dass einige Optimierungen nicht durchgeführt werden, die im normalen, optimierten Modus berücksichtigt werden.

Nach dem Debuggen bleibt die Routine eine Weile (ca. 1h) in der Debug-Version.

(C) Brandeis Consulting.

Vorsicht – Routinen können verschwinden

Selbst auf aktuellen BW4-Systemen kann es immer mal vorkommen, dass Routinen nach dem Aktivieren der Transformation bzw. des DTPs verschwunden sind!

Empfehlung deshalb:

  • Quellcode in die Zwischenablage oder das Notepad sichern
  • Objekt schließen, wieder öffnen und prüfen, welcher Code jetzt da ist.
  • Dummy-Änderungen in der Transformation vor dem Aktivieren machen, z.B. Leerzeichen in der Beschreibun einfügen. -
  • Danach Speichern und erst danach Aktivieren.
(C) Brandeis Consulting.

Im BW on HANA: Verwaiste AMDP-Klassen

Wenn Sie in der Transaktion RSA1 aus der Transformation eine AMDP-Routine anlegen, dann wird dafür eine ABAP-Klasse generiert und gespeichert. Die Transformation wird zu dem Zeitpunkt aber noch nicht gespeichert – das geschieht erst, wenn Sie auf Speichern in der Transformation klicken.

Es kommt immer wieder vor, dass man zwar in der generierten Klasse die AMDP-Methode PROCEDURE implementiert, die zugehörige Transformation aber nicht speichert. Damit ist die logische Zuordnung zwischen Transformation und AMDP-Klasse verschwunden.

Über die Tabelle TADIR kann man den alten Klassennamen ermitteln und den Code somit kopieren.

(C) Brandeis Consulting.

Tipps

Im Folgenden kommen ein paar Tips, die das Leben mit Eclipse leichter machen. ;-)

(C) Brandeis Consulting.

Blockmarkierung

Alt.+Shift+A – Sehr nützlich, um die Feldlisten aus der Deklaration zu übernehmen.

(C) Brandeis Consulting.

Feldliste im Editor erzeugen

  1. Die Definition aus dem Element Info kopieren
  2. im Notepad++, Ersetzen: " type.*" durch ","

Das kann auch als Makro aufgezeichnet werden.

Ausserdem kann man auch gleich die Spezielle Notation mit Gänsefüsschen erzeugen.

(C) Brandeis Consulting.

Element Info mit F2 oder als View

Mit F2 können in AMDP-Routinen Details über Methodendefinitionen angezeigt werden.

(C) Brandeis Consulting.

Verknüpfung der Projektsicht mit den Editoren rechts

(C) Brandeis Consulting.

Code Completion mit Strg + Space

(C) Brandeis Consulting.

Automatischer Syntaxcheck ein- und ausschalten

(C) Brandeis Consulting.

Compare with Local History

(C) Brandeis Consulting.

Hintergrundfarbe für SQL-Script einstellen

(C) Brandeis Consulting.