Textaufbereitung TDLINE

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
16 Beiträge • Seite 1 von 2 (current) Nächste
16 Beiträge Seite 1 von 2 (current) Nächste

Textaufbereitung TDLINE

Beitrag von LostDarkness (ForumUser / 87 / 15 / 6 ) »
Guten Tag meine sehr verehrten ABAP-Menschen,

ich stehe vor folgendem Problem:

Ich habe ein GIB-Template, welches für die Pflege von Materialvertriebstexten verwendet wird.

Innerhalb des Programms kann man die Texte selbst in einem Editor anpassen und in Folge dessen speichern.
Beim Speichern verschluckt er sich allerdings im folgenden Codeblock:

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.
In der Tabelle sav_text ist mein kompletter Text als Textstream vorhanden, sav_text ist vom Typ TDLINE.

Funktioniert soweit wunderbar, nur sobald ich innerhalb eines Durchlaufs bei meinem ersten CONCATENATE innerhalb von l_rest und l_zeile in der Summe mehr als
132 Zeichen(tdline = max. 132 zeichen) erhalte, fällt der restliche Inhalt einfach weg und ist quasi nicht wieder aufgreifbar für mich.

Ist mehr ein Logik-Problem, aber ich komme einfach nicht auf den richtigen Gedanken dazu.

Wäre sehr erfreut wenn mir jemand auf die Sprünge helfen könnte.

Liebe Grüße
Gerrit
“You should name a variable using the same care with which you name a first-born child.”
― Robert C. Martin

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Textaufbereitung TDLINE

Beitrag von A6272 (Specialist / 238 / 8 / 36 ) »
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

Folgende Benutzer bedankten sich beim Autor A6272 für den Beitrag:
LostDarkness


Re: Textaufbereitung TDLINE

Beitrag von LostDarkness (ForumUser / 87 / 15 / 6 ) »
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
Vielen Dank dafür, ich habs jetzt etwas anders gemacht, aber Sie haben mich auf den richtigen Gedanken gebracht. :)

Ich habe nun folgende Lösung:

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.
Liebe Grüße
Gerrit
“You should name a variable using the same care with which you name a first-born child.”
― Robert C. Martin

Re: Textaufbereitung TDLINE

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
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

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.
einfach

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.

Re: Textaufbereitung TDLINE

Beitrag von LostDarkness (ForumUser / 87 / 15 / 6 ) »
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

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.
einfach

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.


Danke, das merk ich mir für die Zukunft :)

Ich muss meine Logik auch nochmal korrigieren, diese zuvor von mir geteilte Logik war noch fehlerhaft, sie hat nur die ersten beiden 132-Zeichen-Ketten verarbeitet, alles darauf folgende lief dann ins Leere.

Neue, dynamische Version sieht wie folgt aus:

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.
“You should name a variable using the same care with which you name a first-born child.”
― Robert C. Martin

Re: Textaufbereitung TDLINE

Beitrag von ewx (Top Expert / 4848 / 311 / 642 ) »
FUBA CONVERT_ITF_TO_STREAM_TEXT
FUBA CONVERT_STREAM_TO_ITF_TEXT

Re: Textaufbereitung TDLINE

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
@LostDarkness: Hast in Deiner neuen Version aber immer noch den alten Codingstil drin.

Re: Textaufbereitung TDLINE

Beitrag von LostDarkness (ForumUser / 87 / 15 / 6 ) »
DeathAndPain hat geschrieben:@LostDarkness: Hast in Deiner neuen Version aber immer noch den alten Codingstil drin.
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.
“You should name a variable using the same care with which you name a first-born child.”
― Robert C. Martin

Re: Textaufbereitung TDLINE

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Und nebenbei mal eure Basis pieken. 7.50 ist klasse! :wink:

Re: Textaufbereitung TDLINE

Beitrag von LostDarkness (ForumUser / 87 / 15 / 6 ) »
DeathAndPain hat geschrieben:Und nebenbei mal eure Basis pieken. 7.50 ist klasse! :wink:
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..
“You should name a variable using the same care with which you name a first-born child.”
― Robert C. Martin

Re: Textaufbereitung TDLINE

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Einfluss kann man sich verschaffen, gerade als technischer Experte. Du kannst die entsprechenden Leute - auch wenn sie eine andere Abteilung bilden - ansprechen und Druck aufbauen. Zugleich kannst Du mit Deinem Chef darüber und über die sich daraus ergebenden Vorteile sprechen, damit der zusätzlich Druck aufbaut.

Das muss nicht reichen, aber dass Du gar nichts machen (versuchen) kannst, stimmt so erst mal nicht.

Re: Textaufbereitung TDLINE

Beitrag von LostDarkness (ForumUser / 87 / 15 / 6 ) »
Guten Tag liebe Leute,

mein Problem hat sich leider doch noch nicht ganz gelöst,
ich bitte um etwas Unterstützung.. :(

Aktuelles Coding sieht so aus:

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.
Daten in der sav_text sind wie folgt aufgebaut:
Bild

Die Eingabe im Editor sieht vor dem Speichern wie folgt aus:
Bild

Sieht nach dem Speichern aber leider so aus:
Zeilenumbrüche mitten in Wörtern, welche ich einfach nicht umgangen kriege..
Bild


Vielleicht findet ja noch jemand wo mein Problem liegt, ich selbst komm einfach nichtmehr auf den richtigen Pfad.
So wie ich euch hier kenne habt ihr auch Mittel und Wege um dies 100x einfacher zu gestalten..

Ich danke euch schon einmal für mögliche Ratschläge/Hinweise/Lösungswege.

Liebe Grüße
Gerrit
“You should name a variable using the same care with which you name a first-born child.”
― Robert C. Martin

Re: Textaufbereitung TDLINE

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Na ja, Du hast halt Zeilen drin, die länger als 132 Zeichen sind. Das alte SAPscript-Format, auf dem TDLINE basiert, kann damit umgehen: Wenn Du TDFORMAT auf '=' setzt, dann gehört die Zeile zur vorhergehenden.

Ich würde an Deiner Stelle jetzt hingehen, jede Zeile, bei der das 132. Zeichen noch gefüllt ist, nach dem letzten auftretenden Leerzeichen durchsuchen und den Rest dieser Zeile in eine neue Zeile mit TDFORMAT = '=' packen. Achte darauf, dass diese neue Zeile mit einem Leerzeichen beginnt, denn Leerzeichen am Ende von Zeilen verwirft Sapscript, so dass Du sonst das letzte Wort der ersten Zeile und das erste Wort der zweiten Zeile ohne Leerzeichen zusammenkleben würdest.

Re: Textaufbereitung TDLINE

Beitrag von ewx (Top Expert / 4848 / 311 / 642 ) »
ewx hat geschrieben:FUBA CONVERT_ITF_TO_STREAM_TEXT
FUBA CONVERT_STREAM_TO_ITF_TEXT

Re: Textaufbereitung TDLINE

Beitrag von wreichelt (Top Expert / 1046 / 30 / 192 ) »
Hallo,

wir haben auch texte aus Excel die in den Vertriebstext geladen werden (müssen).
Für die Aufteilung verwenden wir den:

CALL FUNCTION 'G_SPLIT_LINE'
EXPORTING
INPUT_LINE = zeilen-lline
* CONDENSE_SHORT_LINES = ' '
* IMPORTING
* SPLIT_NOT_SUCCESSFUL =
TABLES
EXPORT_LINES = EXPORT_LINES
EXCEPTIONS
OTHERS = 1.

Die langen Zeilen werden dann aufgeteilt ohne ein Wort zu trennen.

Gruß
Wolfgang

Vergleichbare Themen

9
Antw.
7532
Views
Kompletten Langtext der Cluster Tab. STXH-tdline ausgeben.
von b0rsti » 25.02.2008 16:21 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Eclipse - warum/wann verwendet ihr es [nicht]
vor 20 Minuten von tar 26 / 1849
User Exit EXIT_RQCPRM10_001
vor 31 Minuten von Manfred K. 1 / 8
Trennen Strasse und Hausnummer
vor einer Stunde von payten 13 / 10295
Dialog-Container mit Toolbar/Status
vor 16 Stunden von DeathAndPain gelöst 22 / 3227
Daten an Tabelle binden
vor 21 Stunden von Lukas Sanders 2 / 1087

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Eclipse - warum/wann verwendet ihr es [nicht]
vor 20 Minuten von tar 26 / 1849
User Exit EXIT_RQCPRM10_001
vor 31 Minuten von Manfred K. 1 / 8
Trennen Strasse und Hausnummer
vor einer Stunde von payten 13 / 10295
Dialog-Container mit Toolbar/Status
vor 16 Stunden von DeathAndPain gelöst 22 / 3227
Daten an Tabelle binden
vor 21 Stunden von Lukas Sanders 2 / 1087

Unbeantwortete Forenbeiträge

User Exit EXIT_RQCPRM10_001
vor 31 Minuten von Manfred K. 1 / 8
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2648
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9236