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 tdsprasCreateStructure V[textlines_Zeile] tdformat tdlineCreateTable V[textlines] Include=V[textlines_Zeile]// Zuerst müssen wir den Text aus der Box wieder ins SAP Interne ITF-Format// umwandelnSet V[i] 1Label Convert_ITFCopyText fromText="ED_MD04_Notiz" toString="string" Line="&V[i]"if Q[ok]set V[laenge_string] "&V[string]" -charcountSet V[a] 1Set V[b] 132Label Split_Stringif V[laenge_string>132] // dann müssen wir den Fliesstext splitten in 132 CHAR TeileSet 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] + 132Set V[b] &[b] + 132Set V[laenge_string] "&V[laenge_string]" - 132goto Split_Stringelse// Hier müssen wir noch unterscheiden, ob gesplittet wurde oder nicht// wenn ja dann übergeben wir hier nur noch den Resten vom Stringif V[a>132] // dann wurde mindestens 1 mal gesplittetSet V[textlines_Zeile.tdformat] ""Set V[textlines_Zeile.tdline] "&V[string](&V[a],8000)"appendrow V[textlines_Zeile] Table=V[textlines]elseSet V[textlines_Zeile.tdformat] "*"Set V[textlines_Zeile.tdline] "&V[string]"appendrow V[textlines_Zeile] Table=V[textlines]endif// ansonst der ganze StringendifSet V[i] &[i] + 1goto Convert_ITFendif// save textSet V[TRUE] "X"// V[thead] füllenSet 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"
