Allgemeines
Die Komprimierung von großen Dateien, die so genannte Datenkompression bzw. Datenkomprimierung, durch entsprechende Programme, ist im täglichen Gebrauch nicht mehr wegzudenken. Die Datenkomprimierung reduziert nicht nur wertvolle Speicherplätze, eine geringere Datenmenge beim Austausch zweier Systeme wirkt sich positiv auf die Übertragungszeit aus.
Komprimieren/Dekomprimieren in SAP
SAP hat mit dem Web AS 6.20 die Komprimierung innerhalb von ABAP™ verfügbar gemacht. In diesem CADAXO Development Tipp werde ich einen kurzen Überblick liefern.
Überblick CL_ABAP_GZIP / CL_ABAP_ZIP
Zwei Klassen stehen zur Verfügung. Die Klasse CL_ABAP_GZIP wird zum Komprimieren/Dekomprimieren von Texten, Strings oder binären Inhalten verwendet. Darüber hinaus gib es die Klasse CL_ABAP_ZIP mit welcher mehrere Objekte zu einem ZIP Ordner zusammengefasst werden können. Auf diese Klasse wird in diesem Development Tipp nicht weiter eingegangen.
Klasse CL_ABAP_GZIP
Zum Komprimieren von einzelnen Texten, Strings oder binären Inhalten kann die Klasse CL_ABAP_GZIP verwendet werden. Die Klasse bietet vier Methoden an:
- COMPRESS_TEXT Komprimierung von Text in GZIP-Format
- DECOMPRESS_TEXT Dekomprimierung von gezippten Textdaten
- COMPRESS_BINARY Komprimierung von Binärdaten in GZIP-Format
- DECOMPRESS_BINARY Dekomprimierung von gezippten Binärdaten
Methode COMPRESS_TEXT – Komprimierung von Texten bzw. Strings
Diese Methode wird verwendet, um einen Text/Textstring zu komprimieren. Der zu zippende Text muss in einem CSEQUENCE Typ vorliegen. Zur Erinnerung, bei CSEQUENCE handelt es sich um einen generischen, textartigen ABAP Typ wie STRING oder C.
Der Text wird durch den einzigen Pflichtparameter Parameter TEXT_IN übergeben. Als Ergebnis erhält man zwei Parameter nämlich GZIP_OUT und GZIP_OUT_LEN. Wie vermutet, wird mit GZIP_OUT der komprimierte Inhalt und in GZIP_OUT_LEN die Länge zurückgeliefert. Für GZIP_OUT ist ein XSEQUENCE Typ (X oder XSTRING) zu verwenden.
Nachfolgend ein Beispiel für eine Komprimierung eines Textes:
1 2 3 4 5 6 7 8 9 |
DATA: l_string TYPE string, l_gzip_out TYPE xstring. MOVE 'CADAXO GesmbH - my first ABAP ZIP' TO l_string. cl_abap_gzip=>compress_text( EXPORTING text_in = l_string IMPORTING gzip_out = l_gzip_out ). |
Die Methode bietet noch weitere optionale Eingabeparameter an:
- TEXT_IN_LEN Wenn keine Textlänge angegeben ist, wird der gesamte übergebene Text komprimiert, ansonsten erfolgt die Komprimierung auf den Teilbereich des Textes.
- COMPRESS_LEVEL Durch die Angabe des Komprimierungslevels kann die Größe und Geschwindigkeit der Komprimierung gesteuert werden. 1 bedeutet höchste Geschwindigkeit und 9 beste Komprimierung. Wenn keine Angabe erfolgt, wird 6 als Default-Wert gesetzt. 0 bedeutet keine Komprimierung.
- CONVERSION Die Eingabedaten können vor der Komprimierung noch in eine andere Codepage konvertiert werden. Hier kann entweder die gewünschte Codepage, UTF-8, NONE oder DEFAULT angegeben werden. Bei DEFAULT wird in Unicode Systemen auf UTF-8 umgewandelt, in nicht Unicode Systemen erfolgt keine Konvertierung. DEFAULT ist als Default-Wert gesetzt.
Methode DECOMPRESS_TEXT – Dekomprimierung von Texten bzw. Strings
Um einen gezippten Text wieder in eine CSEQUENCE zu dekomprimieren, ist die Methode DECOMPRESS_TEXT zu verwenden. Die Methode verfügt über die gleichen Parameter wie COMPRESS_TEXT deshalb hier nur kurz die Parameter zusammengefasst:
- GZIP_IN Hier wird der XSEQUENCE Typ mit dem gezippten Wert übergeben.
- GZIP_IN_LEN Optionale Angabe der Länge.
- CONVERSION Mit DEFAULT wird in einem Unicode-System auf UTF-8 umgewandelt, in nicht UNICODE-Systemen auf die Systemcodepage. Weitere mögliche Angabe NONE und eine gewünschte Codepage.
- TEXT_OUT Liefert den dekomprimierten Text.
- TEXT_OUT_LEN enthält die Länge des dekomprimierten Textes.
Beispiel:
1 2 3 4 5 6 7 8 9 10 |
DATA: l_string TYPE string, l_gzip_in TYPE xstring. MOVE l_gzip_out to l_gzip_in. cl_abap_gzip=>decompress_text( EXPORTING gzip_in = l_gzip_in IMPORTING text_out = l_string_out ). |
Methoden COMPRESS_BINARY und DECOMPRESS_BINARY – Binärdaten
Die Komprimierung bzw. Dekomprimierung von Binärdaten unterscheidet sich nicht wesentlich von der Vorgehensweise mit Texten. Zum Komprimieren wird die Methode COMPRESS_BINARYverwendet. Die einzigen beide Unterschiede betreffen den Typ des zu komprimierenden/dekomprimierenden Feldes und das Fehlen der optionalen Parameter zur Codepage Konvertierung. Zur Dekomprimierung ist die Methode DECOMPRESS_BINARY zu verwenden.
Als Typ des zu komprimierenden/dekomprimierenden Feldes wird ein XSEQUENCE, also entweder ein Feld vom Typ X oder XSTRING, benötigt.
Anwendungsfälle
Wo ist nun eine Anwendung der Klasse denkbar und sinnvoll?
Beispielsweise werden in einer Anwendung Langtexte/Notizen erfasst oder Dokumente/Bilder hochgeladen. Komprimiert können diese wesentlich platzsparender in SAP Tabellen abgelegt werden. In Programmen verwendete XML Strings können auf diese Weise platzsparend im System abgelegt werden. Bei einer RFC Kommunikation zwischen zwei SAP Systemen bietet sich diese Technik an, um bei großen Datenmengen die Netzwerkbelastung wesentlich zu reduzieren und den Datenaustausch somit zu beschleunigen.