Replace-Befehl

www.4AP.de - alles über ABAP  -  der Replace-Befehl mit definierter Länge

Beispielcoding: Sollen in Texten mit dem ABAP-Befehl REPLACE Strings bzw. Stringbestandteile ausgetauscht werden, so ergibt sich die Schwierigkeit, dass der Befehl REPLACE zwar definierte Längen sucht, aber nicht definierte Längen austauscht, es wird immer die definierte Länge des auszutauschenden Feldes ersetzt, also u.U. ein deutlich zu langer String


*
* Coded by Thorsten Neubüser - www.4ap.de
*
 
* Sollen in Texten mit dem ABAP-Befehl REPLACE Strings bzw.
* Stringbestandteile ausgetauscht werden, so ergibt sich die
* Schwierigkeit, dass der Befehl
* REPLACE pattern LENGTH len
* WITH repl_string
* INTO field.

* Zwar 'pattern' nur in der angegebenen Länge 'len' überprüft,
* der Austausch allerdings immer das komplette Feld 'repl_string'
* beinhaltet. Also, wenn z.B. pattern = '1234567890' und len = 5 und
* repl_string = 'abcdefghijk' ist, wird im Feld
* field = '0023012345x789000123' die Stelle '12345' zwar richtig
* gefunden, dass Ergebnis im Feld 'field' sieht allerdings nachher
* so aus: field = '00230abcdefghijkx789000123'. Es ist also die
* komplette Länge des repl_string eingefügt worden.

* Um das zu umgehen ist der Austauschwert zur Laufzeit dynamisch
* zu definieren. Es soll also immer ein String in der angegeben Länge
* durch einen in der angegebenen Länge ausgetauscht werden. Dadurch
* werden auch enthaltene Leerzeichen erhalten.



PARAMETERS:
str_alt TYPE char32, " ab CHAR33 fehlen zu viele TYPES!
str_lang TYPE i, " in dieser angegeben Länge austauschen
str_neu TYPE char32. " neuer String


<snip>

* Hilfskonstruktion für dynamische Typ-Erstellung
* notwendig, da der REPLACE-Befehl immer die komplette Stringlänge
* von str_neu reinschreiben würde

DATA: data_typ_austausch(6).
MOVE str_lang TO data_typ_austausch.
SHIFT data_typ_austausch RIGHT DELETING TRAILING ' '.
OVERLAY data_typ_austausch WITH '000000'.
data_typ_austausch(4) = 'CHAR'.
* 'data_typ_austausch' enthält jetzt CHAR001 bis CHAR032
DATA: dref_data TYPE REF TO data.
IF data_typ_austausch = 'CHAR02'.
* einige wenige Types gibt es nicht, daher dann like
DATA: char02(2).
CREATE DATA dref_data LIKE char02.
ELSEIF data_typ_austausch = 'CHAR04'.
DATA: char04(4).
CREATE DATA dref_data LIKE char04.
ELSEIF data_typ_austausch = 'CHAR06'.
DATA: char06(6).
CREATE DATA dref_data LIKE char06.
ELSEIF data_typ_austausch = 'CHAR09'.
DATA: char09(9).
CREATE DATA dref_data LIKE char09.
ELSE.
CREATE DATA dref_data TYPE (data_typ_austausch).
ENDIF.
FIELD-SYMBOLS: <neuer_string> TYPE ANY.
* <neuer_string> bekommt jetzt den Typ CHAR01 bis CHAR32
ASSIGN dref_data->* TO <neuer_string>.
MOVE str_neu TO <neuer_string>.

<snip>

REPLACE str_alt LENGTH str_lang
WITH <neuer_string> INTO lines_gd-tdline.