Hoijoijoi. Ich gebe zu, ich tue mich echt schwer mit den neuen Befehlen im ABAP-Sprachschatz. Besonders die ganz neuen Features im ABAP Release 7.50 (oder 7.40 – ich blick da nicht mehr durch) fordern mich ziemlich (REDUCE, COND, FILTER etc).
Angeregt durch den Artikel von Jerry Wang im neuen SCN über REDUCE habe ich mich mit dem Befehl-REDUCE näher beschäftigt. Über die ABAP-Doku bin ich dann auf die Demoprogramme DEMO_REDUCE* gestolpert und beim DEMO_REDUCE_SIMPLE hängen geblieben.
Das Programm ermittelt mit Hilfe des REDUCE-Befehls die Summe von Werten in einer Tabelle. Das Programm DEMO_REDUCE_COND_ITERATION erzeugt mit Hilfe einer FOR-Schleife zusammengesetzte Texte (1 2 3 4 usw).
Ich wollte dann ein bisserl mit den Features herumspielen und hatte die Idee, einen HTML-Text zusammen zusetzen.
Aus der Tabelle
<HTML>
<BODY>
<P>
wollte ich die einzelnen Elemente plus einem separaten Text zu einem String zusammenfügen. Das funktionierte auch noch sehr einfach:
DATA(text) = REDUCE string( INIT html = `` FOR command IN html_commands NEXT html = |{ html }{ command }| ) && 'Hallo Welt'.
Eigentlich nur zum Spaß habe ich versucht, ob ich mit einem erneuten && auch ein erneutes REDUCE benutzen kann. Obwohl ich einigermaßen überrascht war, dass es anstandslos funktionierte, wäre ich auch maßlos enttäuscht gewesen, wenn es nicht geklappt hätte…
Der nächste Schritt war dann etwas komplizierter: Ich wollte die einzelnen Tags auch wieder schließen. Natürlich in umgekehrter Reihenfolge. Und mit dem SLASH, der ein Ende-Tag anzeigt. Hier brauchte es dann etliche Versuche und verwirrte Blicke in die Doku um zu dem folgenden Ergebnis zu gelangen:
Und hier der Quelltext dazu:
REPORT zdemo_reduce_simple. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS main. ENDCLASS. CLASS demo IMPLEMENTATION. METHOD main. DATA(html_commands) = VALUE string_table( ( `<html>` ) ( `<body>` ) ( `<p>` ) ). cl_demo_output=>write( html_commands ). DATA(text) = REDUCE string( INIT html = `` FOR command IN html_commands NEXT html = |{ html }{ command }| ) && 'Hallo Welt' && REDUCE string( INIT html = `` FOR n = lines( html_commands ) THEN n - 1 WHILE n > 0 NEXT html = html && COND #( LET command = html_commands[ n ] IN WHEN command IS NOT INITIAL THEN command(1) && '/' && command+1 ) ). cl_demo_output=>write( text ). cl_demo_output=>display( ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. demo=>main( ).
Ich lasse es einfach so unkommentiert stehen. Wenn man weiß, was der Ausdruck macht, ist es einigermaßen klar.
Hier der Beitrag von Horst Keller zum Thema ABAP-740 Features: https://blogs.sap.com/2014/09/30/abap-news-for-740-sp08-iteration-expressions/
Table Expressions
Sehr gewöhnungsbedürftig für mich ist der Zusatz um die einzelne Tabellenzeile (die Tabelle hat ja keine Struktur) anzusprechen:
COND #( LET command = html_commands[ n ] IN WHEN command IS NOT INITIAL THEN command(1) && '/' && command+1 )
Mein erster Ansatz war Folgendes (was aber nicht funktionierte):
html_commands[ n ]-TABLE_LINE
Also bin ich zum COND-Ausdruck gekommen. Hier finde ich verwirrend, dass anscheinend zwingend eine WHEN-Klausel angegeben werden muss. Vielleicht gibt es auch eine einfachere Alternative?! Bestimmt. Lasst es mich gerne wissen.
Link zur Horst Kellers Blog: https://blogs.sap.com/2013/05/29/abap-news-for-release-740-table-expressions/
Ein komisches Gefühl, auf ein mal wieder Anfänger zu sein…
Der guten alten Zeiten Willen noch mal das Coding mit ABAPvor740. Viel Länger ist es auch nicht. Und ob die Programmierung mit ABAP740 eleganter oder besser ist, wage ich zu bezweifeln.
DATA text TYPE string. LOOP AT html_commands INTO DATA(command). text = text && command. ENDLOOP. text = text && 'Hallo Welt'. DATA line TYPE i. line = lines( html_commands ). DO lines( html_commands ) TIMES. DATA(cmd) = html_commands[ line ]. text = text && cmd(1) && '/' && cmd+1. SUBTRACT 1 FROM line. ENDDO.
Der Beitrag REDUCE ABAP750 FOR x = u IN n = 1 THEN brainf*ck erschien zuerst auf Tricktresor.