Operar con String Abap



Operadores String

CO Solo contiene caracteres de
CN Negacion de CO
CA Contiene algun caracter de
NA Negacion de CA
CS Contiene la cadena
NS No contiene la cadena
CP Corresponde al patron
NP Negacion de CP

ENCADENANDO CADENAS DE CARACTERES

Usamos la instrucción CONCATENATE, por ejemplo
CONCATENATE s1 s2 INTO s3.   
•Si queremos que queremos que las dos cadenas estén separadas por un espacio en blanco ponermos
CONCATENATE s1 s2 INTO s3 SEPARATED BY SPACE.
•Es conveniente declarar s3 del tipo string para no correr el riesgode quedarse sin espacio al encadenar varios objetos.
DATA: s1(20) TYPE c VALUE 'hola',
      s2(20) TYPE c VALUE 'amigos',
      s3     TYPE string.

SEPARANDO CADENAS DE CARACTERES
Para separar cadenas usamos la instrucción SPLIT
SPLIT s3 AT SPACE INTO s1 s2.
Podemos separar una cadena de caracteres en una tabla. En este caso cada palabra aparecerá en una línea distinta de la tabla.
SPLIT s3 AT SPACE INTO TABLE t.
En este caso declaramos t como una tabla del tipo string
DATA t TYPE TABLE OF string.

BUSCANDO CARACTERES
Para buscar un patrón de caracteres (por ejemplo s1) en una cadena de caracteres (por ejemplo s2) usamos la instrucción SEARCH
DATA: s1 TYPE string VALUE 'amigos',

      s2 TYPE string VALUE 'hola amigos'.

SEARCH s2 FOR s1.
Si el sistema encuentra el patrón s1 en s2
la variable de sistema sy-subrc guarda un 5 (recuerde que elsistema empieza a contar desde cero).
la variable de sistema sy-fdpos guarda la posición en que comienza el patrón s1 dentro de s2. En este caso guardaría un 0.
Podemos buscar una palabra en una cadena de caracteres, por ejemplo
SEARCH s2 FOR 'amigos'.
Podemos buscar una cadena que comience por un patrón, por ejemplo
SEARCH s2 FOR 'ami*'.
Podemos buscar una cadena que finalice por un patrón, por ejemplo
SEARCH s2 FOR '*gos'.

REEMPLAZANDO CARACTERES
Para reemplazar una cadena de caracteres usamos la instrucción REPLACE. El sistema busca el patrón s1 en s3 y, si lo encuentra, losustituye por s2.
DATA: s1 TYPE string VALUE 'hola',

      s2 TYPE string VALUE 'adiós',

      s3 TYPE string VALUE 'hola amigos'.

REPLACE s1 WITH s2 INTO s3.

CALCULANDO LA LONGITUD DE UNA CADENA DE CARACTERES
Para calcular la longitud de una cadena usamos la función strlen(),en este caso nos daría un valor de 4, aunque la variable s puedeocupar un máximo de 70 caracteres.
DATA: s(70) TYPE c VALUE 'hola',

      x TYPE i.

x = strlen(x).

TRANSFORMANDO UNA CADENA DE CARACTERES EN MAYÚSCULAS/MINÚSCULAS
Usamos la instrucción TRANSLATE, por ejemplo
TRANSLATE s TO UPPER CASE.

TRANSLATE s TO LOWER CASE.
El primer caso transforma en mayúscula y el segundo en minúscula.

DESPLAZANDO UNA CADENA DE CARACTERES
Usamos la instrucción SHIFT, por ejemplo
SHIFT s LEFT BY 1 PLACES.

SHIFT s RIGHT by 1 PLACES.
En el primer ejemplo desplazamos un lugar hacia la izquierda (elvalor por defecto) y en el segundo hacia la derecha.

COMPARANDO CADENAS DE CARACTERES
Para ver si todos los caracteres de s1 están en s2
s1 CO s2
Para ver si NO todos los caracteres de s1 están en
s2 s1 CN s2
Para ver si al menos un carácter de s2 está en s1
s1 CA s2
Lo contrario sería
s1 NA s2
Para ver si s1 contiene s2
s1 CS s2
Lo contrario sería
s1 NS s2
Para ver si s2 está en s1 (si es cierto la variable sy-fdpos guarda laposición de s2 dentro de s1)
s1 CP s2
Lo contrario sería
s1 NP s2

OPERANDO SÓLO CON UNA PARTE DE UNA CADENA
Podemos operar con tan sólo una parte de una cadena decaracteres especificando la posición dentro de la cadena (offset) yla número de caracteres con lo que vamos a operar, por ejemplo
DATA c(4) VALUE 'hola'.

WRITE c+2(1).
En este caso el sistema mostrará la letra l.
Si todos los componentes de una estructura son de tipo caráctertambién podemos operar con los componentes de la siguientemanera
DATA: BEGIN OF nombre,
        nombre(20) TYPE c VALUE 'Juan',
        apellido(20) TYPE c VALUE 'Pérez'
      END OF nombre.

FIELD-SYMBOLS <apellido> TYPE c.

ASSIGN nombre+20(20) TO <apellido>.
En este caso tan sólo el apellido se asigna al field symbol.
También podemos asignar el apellido de la siguiente forma (ya que apellido es el segundo componente de la estructura nombre)
DATA x TYPE i VALUE 2.
ASSIGN COMPONENT x OF STRUCTURE nombre TO <apellido>.

CONCATENATE 

Forma básica CONCATENATE f1 ... fn INTO g.

También le pueden agregar:
... SEPARATED BY h
donde h es el valor que ustedes quieran, generalmente es space.
Efecto
Combina las variables f1 a fn (n >= 2) en la variable g.
Note que los espacios sobrantes de cada variable del tipo C son ignorados.
En string C strings, en cambio, son considerados. 

DATA: ONE(10) VALUE ' John ',
TWO(3) VALUE 'F.',
THREE(10) VALUE ' Kennedy',
NAME(20),
FIRST TYPE STRING.
CONCATENATE ONE TWO THREE INTO NAME.

NAME tiene el valor ' JohnF. Kennedy'.
Pero:

MOVE ONE TO FIRST. "FIRST = ' John'
SHIFT FIRST CIRCULAR. "FIRST = 'John '
CONCATENATE FIRST TWO INTO NAME.

NAME tiene el valor 'John F.'.

Adición ... SEPARATED BY h 

Efecto Inserta el separador h entre las variables fi.
h es usado con su largo definido como un string del tipo C.

Ejemplos 
DATA: ONE(10) VALUE 'John',
TWO(3) VALUE 'F.',
THREE(10) VALUE 'Kennedy',
NAME(20).
CONCATENATE ONE TWO THREE INTO NAME
SEPARATED BY SPACE.

NAME tiene el valor "John F. Kennedy".

DATA SEPARATOR(4) VALUE 'USA'.
CONCATENATE SPACE ONE TWO THREE INTO NAME
SEPARATED BY SEPARATOR.

NAME tiene el valor "USA JohnUSA F.USA Ke". 


SPLIT 
Variantes:
1.
SPLIT f AT g INTO h1 ... hn. 
2. SPLIT f AT g INTO TABLE itab.

Variante 1 SPLIT f AT g INTO h1 ... hn. 

Efecto:
Separa f dondequiera que el separador g se encuentre y deja el resultado en las variables h1 ... hn (n >= 2).

Ejemplos 
DATA: NAMES(30) TYPE C VALUE 'Charly, John , Peter',
NAMES2 TYPE STRING,
ONE(10) TYPE C,
TWO(10) TYPE C,
THREE TYPE STRING,
FOUR(4) TYPE C VALUE 'FOUR',
DELIMITER(2) VALUE ','.

SPLIT NAMES AT DELIMITER INTO ONE TWO.
* ONE contine 'Charly' y TWO contiene 'John , Pet'.
SPLIT NAMES AT ',' INTO ONE TWO THREE.
* ONE contiene 'Charly', TWO contiene ' John',
* THREE contiene ' Peter'.
SPLIT NAMES AT ', ' INTO ONE THREE TWO.
* ONE contiene 'Charly', THREE contiene 'John',
* TWO contiene 'Peter'.
CONCATENATE NAMES '' INTO NAMES2 SEPARATED BY SPACE.
SPLIT NAMES2 AT DELIMITER INTO ONE TWO THREE FOUR.
* ONE contiene 'Charly', TWO contiene 'John',
* THREE contiene 'Peter ', FOUR esta vacío.
SPLIT NAMES2 AT DELIMITER INTO ONE FOUR THREE.
* ONE contiene 'Charly', FOUR contiene 'John',
* THREE contiene 'Peter'.
Variante 2 SPLIT f AT g INTO TABLE itab. 

Efecto
Similar a la Variante 1

La secciones de f son colocadas en la tabla interna itab. El sistema crea un registro en esta tabla para cada sección de f.

Ejemplo 
TYPES: BEGIN OF ITAB_TYPE,
WORD(20),
END OF ITAB_TYPE.

DATA: ITAB TYPE STANDARD TABLE OF ITAB_TYPE WITH
NON-UNIQUE DEFAULT KEY INITIAL SIZE 5.

SPLIT 'STOP Two STOP Three STOP ' AT 'STOP' INTO TABLE ITAB.

ITAB ahora tiene tres registros. El primero esta vacío, el segundo contiene ' Two', y el tercero ' Three'. 

Ejemplo formateando campo :

DATAt_split    TYPE TABLE OF char40.
DATAwa_split   TYPE REF TO  char40.
DATAcampo TYPE string VALUE '23458|abcdf|235|'.
DATAcampo_new TYPE string.
FORMAT COLOR COL_NORMAL.
SPLIT campo AT '|' INTO TABLE t_split..


LOOP AT t_split REFERENCE INTO wa_split.
  
CONCATENATE wa_split->*
              campo_new
              
INTO
              campo_new
.
ENDLOOP.

WRITEcampo_new INVERSE COLOR COL_NORMAL. 

*Busca dentro del String

IF campo_new CA 'f'.
  
WRITE'Si contiene campo f dentro de : '   INVERSE COLOR COL_NORMALcampo_new.
ELSE.
  
WRITE'No contiene campo f dentro de : '   INVERSE COLOR COL_NORMALcampo_new.
ENDIF.

CONDENSE 

Forma básica
CONDENSE c.
Adición:
... NO-GAPS


Efecto:
Explora el contenido de c por la izquierda, así las secuencias de espacios son reducidas a solo uno. Los espacios sobrantes, son removidos.

Ejemplo
DATA NAME (30).
NAME(10) = ' Dr.',
NAME+10(10) = 'Michael',
NAME+20(10) = 'Hofmann'.
CONDENSE NAME.
WRITE NAME.
produce la salida:

Dr. Michael Hofmann

Adición ... NO-GAPS
Efecto:
Suprime todos los espacios de la variable c

Ejemplo
DATA: BEGIN OF NAME,
TITLE(8) VALUE ' Dr.',
FIRST_NAME(10) VALUE 'Michael',
SURNAME(10) VALUE 'Hofmann',
END OF NAME.
CONDENSE NAME NO-GAPS.

El contenido de NAME es "Dr.MichaelHofmann".

TRANSLATE 
Variantes:
1. TRANSLATE c TO UPPER CASE.
2. TRANSLATE c TO LOWER CASE.
3. TRANSLATE c USING c1.

Variante 1 TRANSLATE c TO UPPER CASE.
Variante 2 TRANSLATE c TO LOWER CASE. 

Efecto
La primera variante convierte todas las letras minúsculas en c a mayúsculas. La segunda variante convierte todas las mayúsculas a minúsculas.

Ejemplo
DATA letters(3) TYPE C.
MOVE 'abc' TO letters. 
TRANSLATE letters TO UPPER CASE.
letters contiene ahora 'ABC'.


Variante 3 TRANSLATE c USING c1. 

Efecto Traduce el contenido de c de acuerdo a la regla de la variable c1.
Cuando un carácter de c corresponde a un caracter de c1, este es reemplazado por el siguiente carácter que aparece en c1. Si el carácter aparece más de una vez en c1, la primera ocurrencia es usada en el reemplazo. Si un carácter de c no aparece en c1, este permanece sin cambios.

Ejemplo 
DATA: letters(20) TYPE C VALUE 'abcabcabcXabc',
change(15) TYPE C VALUE 'aXbaYBabZacZB'.
TRANSLATE letters USING change.

letters contiene 'XaZXaZXaZXXaZ'.

REPLACE 

Forma básica REPLACE f
...WITH g
...INTO h.

Adición: 
... LENGTH len (especificación de largo para f)

Efecto
Reemplaza la primera ocurrencia del contenido de la variable f en la variable h con el contenido de la variable g. Todas las variables son manejadas con sus largos definidos, incluso variables C, donde los espacios sobrantes son usualmente ignorados.

Ejemplo 
DATA FIELD(10).
MOVE 'ABCB' TO FIELD.
REPLACE 'B' WITH 'string' INTO field.

Devuelve: 

FIELD = 'AstringCB', SY-SUBRC = 0


Adición ... LENGTH len ... (especificación de largo para f)

Efecto
Busca el string f en la variable h no en su largo definido, peo si en el largo len.

Ejemplo DATA: pattern(5) VALUE 'ABC', 
len TYPE I,
repl_string(5) VALUE '12345',
field(12) VALUE 'abcdeABCDE'.

REPLACE pattern WITH repl_string
INTO field.

FIELD no cambia, debido a que 'ABC ' no aparece en 'abcdeABCDE '.

LEN = STRLEN( PATTERN ).
REPLACE PATTERN LENGTH LEN
WITH REPL_STRING
INTO FIELD.

FIELD cambia a 'abcde12345D'.
SEARCH 
Variantes:

1. SEARCH f FOR g.
2. SEARCH itab FOR g.


Variante 1 SEARCH f FOR g.

Adición:

1. ...
STARTING AT n1 

Efecto Busca el contenido de f en el string g. Este string puede tener cualquiera de los siguientes formatos:

'str' una cadena de caracteres (los espacios sobrantes se ignoran)
'.str.' cualquier carácter entre puntos
'*str' una palabra terminada en "str", incluida "str"
'str*' una palabra que comienza con "str", incluso "str"


El sistema no distingue entre mayúsculas y minúsculas.


Adición 1 ... STARTING AT n1



Efecto Busca el contenido de f partiendo desde la posición n1.
Cuando se usa esta adición, la posición del patrón encontrado se guarda en la variable SY-FDPOS.


Variante 2 SEARCH itab FOR g.

Adición:

1. ... STARTING AT line1

Efecto Busca en la tabla internas itab for the string in field g. El string puede tener el mismo formato que en la variante 1. El valor de SY-SUBRC es 0, si el es encontrado en la tabla. La variable SY-TABIX entonces contiene el número del registro de la tabla donde el string fue encontrado. Mientras, SY-FDPOS específica el offset donde se encontró el string dentro del registro.

Adición 1 ... STARTING AT line1


Efecto Busca en la tabla interna itab partiendo del registro line1 hsat el final.

Comentarios