gelöst Textaufbereitung TDLINE


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

gelöst Textaufbereitung TDLINE

Beitragvon LostDarkness » 23.01.2019, 16:26

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
LostDarkness
ForumUser
 
Beiträge: 32
Registriert: 07.06.2018, 10:21
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Textaufbereitung TDLINE

Beitragvon A6272 » 23.01.2019, 17: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

Für diese Nachricht hat A6272 einen Dank bekommen :
LostDarkness
A6272
Specialist
 
Beiträge: 105
Registriert: 27.02.2007, 09:30
Dank erhalten: 7 mal
Ich bin: Berater/in

Re: Textaufbereitung TDLINE

Beitragvon LostDarkness » 24.01.2019, 09:54

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
LostDarkness
ForumUser
 
Beiträge: 32
Registriert: 07.06.2018, 10:21
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon DeathAndPain » 24.01.2019, 12:04

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.
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon LostDarkness » 25.01.2019, 09:18

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.
LostDarkness
ForumUser
 
Beiträge: 32
Registriert: 07.06.2018, 10:21
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon ewx » 25.01.2019, 09:47

FUBA CONVERT_ITF_TO_STREAM_TEXT
FUBA CONVERT_STREAM_TO_ITF_TEXT
ewx
Top Expert
 
Beiträge: 3870
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 334 mal

Re: Textaufbereitung TDLINE

Beitragvon DeathAndPain » 25.01.2019, 11:41

@LostDarkness: Hast in Deiner neuen Version aber immer noch den alten Codingstil drin.
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon LostDarkness » 25.01.2019, 11:48

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.
LostDarkness
ForumUser
 
Beiträge: 32
Registriert: 07.06.2018, 10:21
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon DeathAndPain » 25.01.2019, 13:29

Und nebenbei mal eure Basis pieken. 7.50 ist klasse! :wink:
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon LostDarkness » 25.01.2019, 13:31

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..
LostDarkness
ForumUser
 
Beiträge: 32
Registriert: 07.06.2018, 10:21
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon DeathAndPain » 25.01.2019, 16:43

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.
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon LostDarkness » 31.01.2019, 14:08

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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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
LostDarkness
ForumUser
 
Beiträge: 32
Registriert: 07.06.2018, 10:21
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon DeathAndPain » 31.01.2019, 14:20

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.
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Textaufbereitung TDLINE

Beitragvon ewx » 31.01.2019, 14:30

ewx hat geschrieben:FUBA CONVERT_ITF_TO_STREAM_TEXT
FUBA CONVERT_STREAM_TO_ITF_TEXT
ewx
Top Expert
 
Beiträge: 3870
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 334 mal

Re: Textaufbereitung TDLINE

Beitragvon wreichelt » 31.01.2019, 14:55

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
wreichelt
Expert
 
Beiträge: 669
Registriert: 17.07.2005, 09:46
Wohnort: Hessen
Dank erhalten: 113 mal
Ich bin: sonstiges

Nächste

Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
Adobe Forms - Download - Keine Seiten
vor 11 Stunden von shimsham 2 Antw.
UTF-8 mit Funktionsbaustein
vor 13 Stunden von a-dead-trousers 4 Antw.
gelöst Fehler SAVE NOT ALLOWED bei F4IF_START_VALUE_REQUEST
vor 10 Stunden von AdrianSchm 1 Antw.
SAP Logon bei Aufruf WebGUI
Gestern von msfox 0 Antw.
Formatierung Textdatei aus Query und ABAP
vor 13 Stunden von wreichelt 5 Antw.

  Ähnliche Beiträge beta
Keine Beiträge gefunden - versuche es mit der erweiterten Suche.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron