Code: Alles auswählen.
DATA: line TYPE tdline,
l_zeile TYPE tdline,
l_rest TYPE tdline,
l_off TYPE i,
l_length TYPE i.
CLASS cl_abap_char_utilities DEFINITION LOAD.
CONSTANTS:
l_cr_lf(2) TYPE c VALUE cl_abap_char_utilities=>cr_lf.
* sav_text aufbereiten
DESCRIBE FIELD line LENGTH l_length IN CHARACTER MODE.
l_rest = space.
LOOP AT sav_text INTO line.
*<04>FORMAT_TEXTLINES
IF line+131(1) = ''.
line+131(1) = '§'.
ENDIF.
*</04>
l_off = 0.
DO.
IF line+l_off CS l_cr_lf. "'##'.
IF sy-fdpos = 0. "Neue Zeile ist line-Anfang
l_zeile = space.
ELSE.
l_zeile = line+l_off(sy-fdpos).
ENDIF.
CONCATENATE l_rest l_zeile INTO l_zeile.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_zeile.
APPEND gs_lines TO gt_lines.
l_off = l_off + sy-fdpos + 2. "weil neue Zeile 2-stellig ist: '##'
l_rest = space.
ELSE.
CONCATENATE l_rest line+l_off INTO l_rest.
l_off = l_length.
ENDIF.
IF l_off >= l_length.
EXIT.
ENDIF.
ENDDO.
ENDLOOP.
Folgende Benutzer bedankten sich beim Autor A6272 für den Beitrag:
LostDarkness
Vielen Dank dafür, ich habs jetzt etwas anders gemacht, aber Sie haben mich auf den richtigen Gedanken gebracht.A6272 hat geschrieben:Hallo,
bei CONCATENATE l_rest l_zeile INTO l_zeile. kann nichts längeres als 132 Zeichen herauskommen.
l_rest, l_zeile haben je 132 Zeichen. Damit CONCATENATE l_rest l_zeile INTO ... verlustfrei ist, muss die Zielvariable 264 Zeichen haben.
CONCATENATE l_rest l_zeile INTO l_zeile_neu. --> dann könntest Du noch auf den Origilaninhalt von l_zeile zugreifen und den abgeschnittenen teil ermitteln und was damit machen.
Viele Grüße
Alex
Code: Alles auswählen.
DATA: line TYPE tdline,
l_zeile TYPE tdline,
l_rest TYPE tdline,
l_off TYPE i,
l_length TYPE i,
l_rest2 TYPE string,
lv_sum TYPE i.
CLASS cl_abap_char_utilities DEFINITION LOAD.
CONSTANTS:
l_cr_lf(2) TYPE c VALUE cl_abap_char_utilities=>cr_lf.
* sav_text aufbereiten
DESCRIBE FIELD line LENGTH l_length IN CHARACTER MODE.
l_rest = space.
LOOP AT sav_text INTO line.
*<04>FORMAT_TEXTLINES
IF line+131(1) = ''.
line+131(1) = '§'.
ENDIF.
*</04>
l_off = 0.
DO.
IF line+l_off CS l_cr_lf. "'##'.
IF sy-fdpos = 0. "Neue Zeile ist line-Anfang
l_zeile = space.
ELSE.
l_zeile = line+l_off(sy-fdpos).
ENDIF.
CONCATENATE l_rest l_zeile INTO l_rest2.
lv_sum = strlen( l_rest2 ).
IF lv_sum > 132.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_rest.
APPEND gs_lines TO gt_lines.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_zeile.
APPEND gs_lines TO gt_lines.
ELSE.
CONCATENATE l_rest l_zeile INTO l_zeile.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_zeile.
APPEND gs_lines TO gt_lines.
ENDIF.
* CONCATENATE l_rest l_zeile INTO l_zeile.
* gs_lines-tdformat = '/ '.
* gs_lines-tdline = l_zeile.
* APPEND gs_lines TO gt_lines.
l_off = l_off + sy-fdpos + 2. "weil neue Zeile 2-stellig ist: '##'
l_rest = space.
ELSE.
CONCATENATE l_rest line+l_off INTO l_rest.
l_off = l_length.
ENDIF.
IF l_off >= l_length.
EXIT.
ENDIF.
ENDDO.
ENDLOOP.
Code: Alles auswählen.
CONCATENATE l_rest l_zeile INTO l_zeile.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_zeile.
APPEND gs_lines TO gt_lines.
DeathAndPain hat geschrieben:An Stellen wie diesen wirkt der CONCATENATE-Befehl ohnehin veraltet und schlecht lesbar. Schon bei Releases vor 7.40 gibt es den &&-Operator, der bedeutend schöner ist.
Also statt
CONCATENATE l_rest l_zeile INTO l_zeile.
lieber
l_zeile = l_rest && l_zeile.
Es gibt Fälle, an denen sich der CONCATENATE noch immer ganz gut macht, aber dieser gehört nicht dazu.
Bei Releases ab 7.40 kann man diverse Codeblöcke aus Deinem Programm sowieso viel kürzer und schöner schreiben, z.B. statt
einfachCode: Alles auswählen.
CONCATENATE l_rest l_zeile INTO l_zeile. gs_lines-tdformat = '/ '. gs_lines-tdline = l_zeile. APPEND gs_lines TO gt_lines.
APPEND VALUE #( tdformat = '/ ' tdline = l_rest && l_zeile ) TO gt_lines.
Liest sich auch viel prägnanter, und dann brauchste noch nicht mal mehr eine Workarea; der DATA-Befehl für gs_lines kann dann also auch weg. Workareas sind für mich schon immer eine sperrige Krücke gewesen.
In Deinem Code kannst Du bei o.g. Befehl auch tdformat und tdline untereinander statt nebeneinander schreiben, wenn Du das besser lesbar findest. Das konnte ich hier im Forum aber nicht machen, da das code-Tag des Forums nicht mit Ampersands (&) klarkommt und ohne code-Tag führende Leerzeichen ignoriert werden und alles linksbündig hingeknallt wird, was kacke aussieht.
Code: Alles auswählen.
DATA: line TYPE tdline,
l_zeile TYPE tdline,
l_rest TYPE string,
l_off TYPE i,
l_length TYPE i,
l_rest2 TYPE string,
lv_sum TYPE i.
CLASS cl_abap_char_utilities DEFINITION LOAD.
CONSTANTS:
l_cr_lf(2) TYPE c VALUE cl_abap_char_utilities=>cr_lf.
* sav_text aufbereiten
DESCRIBE FIELD line LENGTH l_length IN CHARACTER MODE.
l_rest = space.
LOOP AT sav_text INTO line.
FORMAT_TEXTLINES
IF line+131(1) = ''.
line+131(1) = '§'.
ENDIF.
l_off = 0.
DO.
IF line+l_off CS l_cr_lf. "'##'.
IF sy-fdpos = 0. "Neue Zeile ist line-Anfang
l_zeile = space.
ELSE.
l_zeile = line+l_off(sy-fdpos).
ENDIF.
CONCATENATE l_rest l_zeile INTO l_rest2.
lv_sum = strlen( l_rest2 ).
IF lv_sum > 132.
lv_sum = strlen( l_rest ).
DO.
IF lv_sum > 132.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_rest.
APPEND gs_lines TO gt_lines.
l_rest = substring( val = l_rest off = 132 ).
lv_sum = strlen( l_rest ).
ELSEIF lv_sum BETWEEN 0 AND 132.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_rest.
APPEND gs_lines TO gt_lines.
EXIT.
ENDIF.
ENDDO.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_zeile.
APPEND gs_lines TO gt_lines.
ELSE.
CONCATENATE l_rest l_zeile INTO l_zeile.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_zeile.
APPEND gs_lines TO gt_lines.
ENDIF.
* CONCATENATE l_rest l_zeile INTO l_zeile.
* gs_lines-tdformat = '/ '.
* gs_lines-tdline = l_zeile.
* APPEND gs_lines TO gt_lines.
l_off = l_off + sy-fdpos + 2. "weil neue Zeile 2-stellig ist: '##'
l_rest = space.
ELSE.
CONCATENATE l_rest line+l_off INTO l_rest.
l_off = l_length.
ENDIF.
IF l_off >= l_length.
EXIT.
ENDIF.
ENDDO.
ENDLOOP.
Tatsache, hab mich quasi drauf fokussiert das wir noch nicht auf 7.40 sind und hab den ersten Teil dann gekonnt ausgeblendet. Werde aber in zukünftigen Codings daran denken.DeathAndPain hat geschrieben:@LostDarkness: Hast in Deiner neuen Version aber immer noch den alten Codingstil drin.
Da hab ich so leider gar keinen Einfluss drauf, würde es mir aber auch wünschen das es mal was aktueller wird, insbesondere wegen dem eigentlich geplanten Umstieg auf HANA..DeathAndPain hat geschrieben:Und nebenbei mal eure Basis pieken. 7.50 ist klasse!
Code: Alles auswählen.
DATA: line TYPE tdline,
l_zeile TYPE tdline,
l_rest TYPE string,
l_off TYPE i,
l_length TYPE i,
l_rest2 TYPE string,
lv_sum TYPE i.
CLASS cl_abap_char_utilities DEFINITION LOAD.
CONSTANTS:
l_cr_lf(2) TYPE c VALUE cl_abap_char_utilities=>cr_lf.
DESCRIBE FIELD line LENGTH l_length IN CHARACTER MODE.
l_rest = space.
LOOP AT sav_text INTO line.
l_off = 0.
DO.
IF line+l_off CS l_cr_lf. "'##'.
IF sy-fdpos = 0. "Neue Zeile ist line-Anfang
l_zeile = space.
ELSE.
l_zeile = line+l_off(sy-fdpos).
ENDIF.
l_rest2 = l_rest && l_zeile.
lv_sum = strlen( l_rest2 ).
IF lv_sum > 132. " Wenn l_rest + l_zeile mehr als 132 Zeichen haben dann verarbeite hier l_rest und danach l_zeile.
lv_sum = strlen( l_rest ).
DO.
IF lv_sum > 132.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_rest.
APPEND gs_lines TO gt_lines.
l_rest = substring( val = l_rest off = 132 ). " die ersten 132 Zeichen vom l_rest werden verworfen, da schon Appended
lv_sum = strlen( l_rest ). " neue Länge von l_rest ermitteln
ELSEIF lv_sum BETWEEN 0 AND 132. "wenn l_rest weniger als 132 Zeichen hat werden diese noch verarbeitet, dann der Loop verlassen.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_rest.
APPEND gs_lines TO gt_lines.
EXIT.
ENDIF.
ENDDO.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_zeile.
APPEND gs_lines TO gt_lines.
ELSE.
l_zeile = l_rest && l_zeile.
gs_lines-tdformat = '/ '.
gs_lines-tdline = l_zeile.
APPEND gs_lines TO gt_lines.
ENDIF.
l_off = l_off + sy-fdpos + 2. "weil neue Zeile 2-stellig ist: '##'
l_rest = space.
ELSE.
l_rest = l_rest && line+l_off.
l_off = l_length.
ENDIF.
IF l_off >= l_length.
EXIT.
ENDIF.
ENDDO.
ENDLOOP.
ewx hat geschrieben:FUBA CONVERT_ITF_TO_STREAM_TEXT
FUBA CONVERT_STREAM_TO_ITF_TEXT