Code: Alles auswählen.
DATA:
csv_tab TYPE table_of_strings,
csv_string TYPE string,
csv_xstring TYPE xstring.
APPEND 'erster' TO csv_tab.
APPEND 'zweiter' TO csv_tab.
CONCATENATE LINES OF csv_tab
INTO csv_string SEPARATED BY cl_abap_char_utilities=>cr_lf.
csv_xstring = cl_bcs_convert=>string_to_xstring( csv_string ).
Folgende Benutzer bedankten sich beim Autor zzcpak für den Beitrag:
DeathAndPain
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
DeathAndPain
Nicht ums Verrecken. Es geht nicht darum, die alten Befehle loszuwerden, weil sie alt sind, es muss schon auch was bringen. Deswegen werde ich den FOR-Befehl in Zuweisungen wahrscheinlich auch nie einsetzen, da er in meinen Augen nicht hilfreich ist, die Lesbarkeit des Codes zu verbessern, sondern diese im Gegenteil deutlich verschlechtert. Aber der CONCATENATE-Befehl mit seiner insbesondere bei Leerzeichen sehr umständlichen und schlecht lesbaren Syntax hat mir noch nie gefallen. Bei dem Befehl habe ich mich schon unter 3.1i gefragt, warum die SAP sich dafür keine bessere Lösung hat einfallen lassen. Wenn man z.B. einen Text in eine Variable packen wollte, bei der hinter dem Wert der ersten ein Doppelpunkt und dann der Wert der zweiten kam, wobei - optisch üblich - vor dem Doppelpunkt kein Leerzeichen sein sollte, dahinter aber sehr wohl, dann musste man nacheinander zwei CONCATENATES machen, einen mit und einen ohne SEPARATED BY SPACE. Der Code sah schrecklich aus. Mit && und dem accent grave als Anführungszeichen geht das nicht nur viel kürzer, sondern auch bedeutend besser lesbar.Wenn du die "alten" Befehle loswerden willst
Das geht doch auch mit dem CONCATENATE seit Strings als Datentyp und damit dann auch der "backtick" als Stringbegrenzer eingeführt wurde.DeathAndPain hat geschrieben:...dem Befehl habe ich mich schon unter 3.1i gefragt, warum die SAP sich dafür keine bessere Lösung hat einfallen lassen. Wenn man z.B. einen Text in eine Variable packen wollte, bei der hinter dem Wert der ersten ein Doppelpunkt und dann der Wert der zweiten kam, wobei - optisch üblich - vor dem Doppelpunkt kein Leerzeichen sein sollte, dahinter aber sehr wohl, dann musste man nacheinander zwei CONCATENATES machen, einen mit und einen ohne SEPARATED BY SPACE. Der Code sah schrecklich aus. Mit && und dem accent grave als Anführungszeichen geht das nicht nur viel kürzer, sondern auch bedeutend besser lesbar.
Code: Alles auswählen.
CONCATENATE lv_vor `: ` lv_nach into text.
CONCATENATE lv_vor lv_nach into text SEPARATED BY `: `.
Dito. Weshalb ich schon lange embedded expressions verwende (die 'deutsche' Übersetzung "Zeichenketten-Template" finde ich ziemlich bescheuert, daher der englische Begriff).DeathAndPain hat geschrieben:Aber der CONCATENATE-Befehl mit seiner insbesondere bei Leerzeichen sehr umständlichen und schlecht lesbaren Syntax hat mir noch nie gefallen
Code: Alles auswählen.
data: sy_index type string.
sy_index = sy-index.
CONCATENATE string_a sy_index string_b into ziel_string SEParated by space.
Code: Alles auswählen.
ziel_string = |{ string_a } { sy-index } { string_b }|.
Code: Alles auswählen.
data: sy_index type string, string_vorn type string, string_hinten type string.
sy_index = sy-index.
concatenate: vor_string_a string_a into string_vorn,
string_b nach_string_b into string_hinten,
string_vorn sy_index string_hinten into ziel_string SEParated by space.
clear: string_vorn, string_hinten. " nicht mehr benötigt
Wobei Du hier die gute, alte 3.1i-Syntax zugrundelegst. Heutzutage könnte der CONCATENATE-Verwender sich mit CONV() retten und damit den Großteil Deiner Argumentation entkräften. Ich finde CONCATENATE aber dennoch hässlich.ralf.wenzel hat geschrieben:Beispiel für blöde Lesbarkeit:DeathAndPain hat geschrieben:Aber der CONCATENATE-Befehl mit seiner insbesondere bei Leerzeichen sehr umständlichen und schlecht lesbaren Syntax hat mir noch nie gefallen
sy-index ist ein INT4-Feld, weshalb man es nicht concatenaten kann, also muss man es in ein Zeichenfeld umsetzen (hier: sy_index zur Veranschaulichung). Das heißt, man muss den CONCATENATE-Befehl mit Hilfsvariablen erst "möglich machen" (was andere als "gewollte Geschwätzigkeit" auslegen mögen -- ich fand immer schon, dass Geschwätzigkeit keinen Wert an sich darstellt).Code: Alles auswählen.
data: sy_index type string. sy_index = sy-index. CONCATENATE string_a sy_index string_b into ziel_string SEParated by space.
Wenn man regexps beherrscht. Ich würde (IMHO mindestens genauso gut lesbar) einfachDeutlich besser lesbar in meinen Augen:
Code: Alles auswählen.
ziel_string = |{ string_a } { sy-index } { string_b }|.
Ja, wobei das mit dem Doppelampersand nebst accent grave auch schon alles abgedeckt ist.Da muss ich Schritt für Schritt nachvollziehen, was da eigentlich gemacht wird, um dann im Kopf zu haben, was die neue Syntax schon ausdrückt. Und drei unnütze Variablen, die ich nur brauche, weil CONCATENATE zu doof ist, hab ich auch noch am Hals. Die steigern die Lesbarkeit auch nicht gerade.Code: Alles auswählen.
data: sy_index type string, string_vorn type string, string_hinten type string. sy_index = sy-index. concatenate: vor_string_a string_a into string_vorn, string_b nach_string_b into string_hinten, string_vorn sy_index string_hinten into ziel_string SEParated by space. clear: string_vorn, string_hinten. " nicht mehr benötigt
Ich würde solchen Code akzeptieren, wenn der Kommentar gut genug wäre, dass ich dann auch ohne allzu großen Aufwand nachvollziehen kann, was Dein FOR da veranstaltet. Bei dem von Dir geschilderten Fall kann ich mir das durchaus vorstellen.PS: Zu FOR gebe ich dir erstmal recht, würde aber nie ausschließen, dass es Fälle gibt, wo man das sinnvoll einsetzen kann. Gemacht hab ich es einmal, wo es darum ging, aus einer Liste von Objekten eine Datentabelle mit deren Attribute zu machen. In meinem Kopf war das eine Art "MOVE_CORRESPONDING", warum ich es auch kompakt in einer Anweisung haben wollte, aber syntaktisch nicht entsprechend umsetzbar.
CONV ist 7.40, auf einem 7.31er System geht das nicht, meine Lösung aber schon.DeathAndPain hat geschrieben:Wobei Du hier die gute, alte 3.1i-Syntax zugrundelegst. Heutzutage könnte der CONCATENATE-Verwender sich mit CONV() retten und damit den Großteil Deiner Argumentation entkräften. Ich finde CONCATENATE aber dennoch hässlich.
Nein, aber dann hast du auch keine Leerzeichen drin. Das war ja gewünscht. Du willst ja schreiben "Durchlauf 3 geht schief" und nicht "Durchlauf3geht schief".DeathAndPain hat geschrieben:Wenn man regexps beherrscht. Ich würde (IMHO mindestens genauso gut lesbar) einfach
string_a && sy-index && string_b
coden. Der Doppelampersand hat kein Problem mit dem Integerwert (wobei ich jetzt nicht weiß, ob das unter 7.0 auch schon so war).
Wenn man extra kompliziertes und schlecht designtes Coding für das CONCATENATE angibt ist es natürlich viel einfacher zu behaupten, dass die String-Templates besser lesbar seien. Hier mal eine Alternative, die in meinen Augen sehr gut lesbar ist und ohne die Zwischenvariablen auskommt.ralf.wenzel hat geschrieben:Da muss ich Schritt für Schritt nachvollziehen, was da eigentlich gemacht wird, um dann im Kopf zu haben, was die neue Syntax schon ausdrückt. Und drei unnütze Variablen, die ich nur brauche, weil CONCATENATE zu doof ist, hab ich auch noch am Hals. Die steigern die Lesbarkeit auch nicht gerade.Code: Alles auswählen.
data: sy_index type string, string_vorn type string, string_hinten type string. sy_index = sy-index. concatenate: vor_string_a string_a into string_vorn, string_b nach_string_b into string_hinten, string_vorn sy_index string_hinten into ziel_string SEParated by space. clear: string_vorn, string_hinten. " nicht mehr benötigt
Code: Alles auswählen.
CONCATENATE vor_string_a
string_a
` `
string_b
nach_string_b
INTO ziel_string
Dann machste haltRalf hat geschrieben:Nein, aber dann hast du auch keine Leerzeichen drin. Das war ja gewünscht. Du willst ja schreiben "Durchlauf 3 geht schief" und nicht "Durchlauf3geht schief".DeathAndPain hat geschrieben:Wenn man regexps beherrscht. Ich würde (IMHO mindestens genauso gut lesbar) einfach
string_a && sy-index && string_b
coden. Der Doppelampersand hat kein Problem mit dem Integerwert (wobei ich jetzt nicht weiß, ob das unter 7.0 auch schon so war).
Ich habe Ralf so verstanden, dass er die in älteren Releases ursprünglich notwendige Syntax beschrieben hat. Die Accent grave-Anführungszeichen gibt es zwar schon länger als 7.40, aber in den richtig alten Releases gab es sie nicht. Den CONCATENATE schon.black_adept hat geschrieben:Wenn man extra kompliziertes und schlecht designtes Coding für das CONCATENATE angibt ist es natürlich viel einfacher zu behaupten, dass die String-Templates besser lesbar seien.