Da die SAP die Langtexte im sogenannten ITF-Format ablegt, muss man da einiges beachten, da die zugehörige Struktur TDLINE nur 132 CHAR Zeichen pro Zeile akzeptiert. Daher muss man, wie es SAP auch macht, wenn ein Fliesstext vorhanden ist in dem Feld TDFORMAT ein * mitgeben und den Fliesstext auf mehrere Zeilen aufteilen.

Die zugehörigen Scripte habe ich gebaut um die Notiz in der MD04 auszulesen und auch wieder zurückzuschreiben.

Lesen Text

set V[tdobject] "MDTXT" 
set V[tdid] "LTXT" // language EN, FR, DE,... 
Set V[tdspras] "&V[_language2]" // read the text 
Call "READ_TEXT" _ 
export.OBJECT="tdobject" _ 
export.NAME="tdname" _ 
export.ID="tdid" _ 
export.LANGUAGE="tdspras" _ 
import.HEADER="thead" _ 
import.LINES="textlines" // copy text lines 
Set V[k] 0 
label next_line 
if V[k<&V[textlines.rowcount]] 
Set V[k] &V[k] + 1 
if V[textlines.tdformat.&V[k]=*] // dann haben wir kein Fliesstext also appendline 
Set V[line] "&V[textlines.tdline.&V[k]]" 
CopyText fromString="line" toText="ED_MD04_Notiz" -appendline 
else // hier Fliesstext also nur append 
Set V[line] "&V[textlines.tdline.&V[k]]" 
CopyText fromString="line" toText="ED_MD04_Notiz" -append 
endif 
goto next_line 
endif

Zurückschreiben Text

CreateStructure V[thead] tdobject tdname tdid tdspras
CreateStructure V[textlines_Zeile] tdformat tdline
CreateTable V[textlines] Include=V[textlines_Zeile] 
// Zuerst müssen wir den Text aus der Box wieder ins SAP Interne ITF-Format
// umwandeln
Set V[i] 1
Label Convert_ITF
CopyText fromText="ED_MD04_Notiz" toString="string" Line="&V[i]"
if Q[ok]
set V[laenge_string] "&V[string]" -charcount
Set V[a] 1
Set V[b] 132
Label Split_String
if V[laenge_string>132] // dann müssen wir den Fliesstext splitten in 132 CHAR Teile
Set V[textlines_Zeile.tdformat] ""
Set V[textlines_Zeile.tdline] "&V[string](&V[a],&V[b])"
appendrow V[textlines_Zeile] Table=V[textlines] 
set V[a] &[a] + 132
Set V[b] &[b] + 132
Set V[laenge_string] "&V[laenge_string]" - 132
goto Split_String
else
// Hier müssen wir noch unterscheiden, ob gesplittet wurde oder nicht
// wenn ja dann übergeben wir hier nur noch den Resten vom String
if V[a>132] // dann wurde mindestens 1 mal gesplittet
Set V[textlines_Zeile.tdformat] ""
Set V[textlines_Zeile.tdline] "&V[string](&V[a],8000)"
appendrow V[textlines_Zeile] Table=V[textlines] 
else
Set V[textlines_Zeile.tdformat] "*"
Set V[textlines_Zeile.tdline] "&V[string]"
appendrow V[textlines_Zeile] Table=V[textlines] 
endif
// ansonst der ganze String
endif
Set V[i] &[i] + 1
goto Convert_ITF
endif

// save text
Set V[TRUE] "X"

// V[thead] füllen
Set V[thead.tdobject] "MDTXT"
Set V[thead.tdname] "&V[tdname]"
Set V[thead.tdid] "LTXT"
Set V[thead.tdspras] "&V[_language2]"

Call "SAVE_TEXT" _
export.HEADER="thead" _ 
export.SAVEMODE_DIRECT="TRUE" _
export.LINES="textlines"

 

Dank einer Erweiterung der von der Synactive zur Verfügung gestellten Bausteinen (/GUIXT/CALL mind. Version 2022-08-24) ist es nun noch einfacher möglich den Text in ein ITF Format zu wandeln, da kann man nun den FUBA „CONVERT_STREAM_TO_ITF_TEXT“ dazu verwenden. 🙂

So ungefähr nach dem Muster:

CreateTable V[text_stream] stream

Set V[text_stream.stream.1] "abc" 
Set V[text_stream.stream.2] "xyz"

CreateTable V[textlines] tdformat tdline

Set V[lf] "X"

call "CONVERT_STREAM_TO_ITF_TEXT" _
export.STREAM_LINES="text_stream" _ 
export.LANGUAGE="_language2" _
export.LF="lf" _
import.ITF_TEXT="textlines"

Empfehlen