Ausgangssituation
Beim Einsatz von HANA nativer Modellierung auf der Datenbank eines SAP BW Systems stellt sich immer wieder die Frage, ob HANA Datenbank (HDB) Tabellen angelegt und verwendet werden sollen. Die Entscheidung fällt oft gegen den Einsatz aus, da die Applikationsschicht des BW einige Vorteile insbesondere für die Datenbeladung und Pflege bietet. In einigen Fällen, wie zum Beispiel bei Pruning Tabellen für HANA Calculation Views, ist es jedoch nicht möglich eine Tabelle im ABAP Dictionary zu verwenden, so dass an einer HDB Tabelle kein Weg vorbeiführt.
Das Anlegen der Tabelle ist jedoch noch nicht alles. Die Tabelle muss auch mit Daten gefüllt, transportiert und gegebenenfalls zu einem späteren Zeitpunkt um weitere Daten ergänzt werden. Hierzu sind entsprechende Berechtigungen notwendig, die in vielen SAP BW on HANA und BW4/HANA Systemen erst noch gesondert implementiert werden müssten. Dies erfordert einen entsprechenden Aufwand, der jedoch mit ein paar Tricks vermeidbar ist.
Dieser Blog beschäftigt sich mit der Möglichkeit HDB Tabellen aus dem BW heraus anzulegen und deren Inhalte per Synchronisation aus dem BW heraus zu pflegen.
Vorgehen
Dazu wird zunächst im BW eine Tabelle mit der gleichen Struktur angelegt, wie sie die HANA native Tabelle auch haben wird. In diesem Beispiel heißt die Tabelle Z_PRUNING. Da einige der bei Pruning Tabellen fest definierten Spaltennamen im BW reservierte Wörter sind, wird allen Spaltennamen ein „Z“ vorangestellt.
Für diese Tabelle wird mit einen Standard Pflegedialog angelegt mit dem Datensätze erstellt, verändert und auch wieder gelöscht werden können. Alternativ ist natürlich auch eine Pflege über sämtliche andere Wege, wie zum Beispiel per ABAP Programm, BW Datenfluss oder Fiori Interface denkbar.
Im BW wird dann bei jeder Änderung oder in regelmäßigen Abständen ein anzulegendes ABAP Programm eingeplant, das die folgenden Schritte zur Synchronisation der BW Tabelle mit der HANA Tabelle übernimmt:
- Sofern die HDB noch nicht existiert, anlegen dieser unter Verwendung von HANA nativer DDL.
- Löschen aller Daten aus der HANA Tabelle unter Verwendung von HANA nativer DML.
- Kopieren aller Datensätze aus der entsprechenden ABAP Tabelle in die HANA Tabelle unter Verwendung von HANA nativer DML.
Für die HANA nativen DDL und DML Statements wird jeweils die Klasse cl_sql_statement verwendet.
Zusammenfassung
Auf diese Weise ist es einfach möglich die BW Funktionalitäten zur Tabellenpflege zu nutzen und die Werte der Tabelle mit einer entsprechenden HDB Tabelle zu synchronisieren. Andere HANA nativen Objekte, wie zum Beispiel Calculation Views können dann darauf zugreifen und die Informationen daraus verwenden.
Anhang/Coding
Struktur der BW-Tabelle Z_PRUNING:
Spaltenname | Datentyp |
ZKEY | NUMC 4 |
ZSCHEMA | CHAR 100 |
ZCALC_SCENARIO | CHAR 200 |
ZINPUT | CHAR 200 |
ZCOLUMN | CHAR 20 |
ZOPTION | CHAR 10 |
ZLOW_VALUE | CHAR 20 |
ZHIGH VALUE | CHAR 20 |
ABAP Quellcode für das Programm zur Synchronisation der HDB Tabelle:
REPORT Z_UPDATE_PRUNING_TAB.
CONSTANTS: c_hdb_tablename TYPE STRING VALUE ‚Z_PRUNING_TABLE_01‘,
c_abap_tablename TYPE STRING VALUE ‚Z_PRUNING‘.
DATA: lv_sql_string TYPE string,
lv_count TYPE int8,
l_abap_table TYPE Z_PRUNING,
lt_abap_table TYPE TABLE OF Z_PRUNING,
o_native_sql TYPE REF TO cl_sql_statement,
o_sql_result_set TYPE REF TO cl_sql_result_set,
o_ref_count TYPE REF TO DATA.
GET REFERENCE OF lv_count INTO o_ref_count.
CREATE OBJECT o_native_sql TYPE cl_sql_statement.
* Check if hdb table already exists
CLEAR lv_sql_string.
CONCATENATE ‚SELECT “1“ FROM sys.tables WHERE SCHEMA_NAME = “_SYS_BIC“ AND TABLE_NAME = “‘ c_hdb_tablename ““ INTO lv_sql_string.
CALL METHOD o_native_sql->execute_query
EXPORTING
STATEMENT = lv_sql_string
HOLD_CURSOR = ‚X‘
RECEIVING
RESULT_SET = o_sql_result_set.
o_sql_result_set->set_param( o_ref_count ).
IF o_sql_result_set->next( ) = 0.
* If no entry was read, hdbtable doesn’t exist. Create Table.
CLEAR lv_sql_string.
CONCATENATE ‚CREATE COLUMN TABLE „_SYS_BIC“.“‚
c_hdb_tablename ‚“ (‚
‚ „SCHEMA“ VARCHAR(20),‘
‚ „CALC_SCENARIO“ VARCHAR(100),‘
‚ „INPUT“ VARCHAR(200),‘
‚ „COLUMN“ VARCHAR(20),‘
‚ „OPTION“ VARCHAR(10),‘
‚ „LOW_VALUE“ VARCHAR(20),‘
‘ „HIGH_VALUE“ VARCHAR(20)‘
‚ ) UNLOAD PRIORITY 0 AUTO MERGE‘ INTO lv_sql_string.
CALL METHOD o_native_sql->execute_ddl
EXPORTING
STATEMENT = lv_sql_string.
IF sy-subrc NE 0.
EXIT.
ENDIF.
ENDIF.
* Delete all data in hdb table
CLEAR lv_sql_string.
CONCATENATE ‚DELETE FROM „_SYS_BIC“.“‚ c_hdb_tablename ‚“ WHERE 1=1‘ INTO lv_sql_string.
CALL METHOD o_native_sql->execute_update
EXPORTING
STATEMENT = lv_sql_string.
* Select data from abap table into internal table
SELECT *
FROM (c_abap_tablename)
INTO TABLE lt_abap_table.
LOOP AT lt_abap_table INTO l_abap_table.
* Loop at abap data and insert into hdb table
CLEAR lv_sql_string.
CONCATENATE ‚INSERT INTO „_SYS_BIC“.“‚
c_hdb_tablename ‚“ values(“‘
l_abap_table-zschema “‘,“‘
l_abap_table-zcalc_scenario “‘,“‘
l_abap_table-zinput “‘,“‘
l_abap_table-zcolumn “‘,“‘
l_abap_table-zoption “‘,“‘
l_abap_table-zlow_value “‘,“‘
l_abap_table-zhigh_value “‘ )‘ INTO lv_sql_string.
CALL METHOD o_native_sql->execute_update
EXPORTING
STATEMENT = lv_sql_string.
ENDLOOP.