Operar con String Abap
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 :
DATA: t_split TYPE TABLE OF char40.
DATA: wa_split TYPE REF TO char40.
DATA: campo TYPE string VALUE '23458|abcdf|235|'.
DATA: campo_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.
WRITE: campo_new INVERSE COLOR COL_NORMAL.
*Busca dentro del String
IF campo_new CA 'f'.
WRITE: 'Si contiene campo f dentro de : ' INVERSE COLOR COL_NORMAL, campo_new.
ELSE.
WRITE: 'No contiene campo f dentro de : ' INVERSE COLOR COL_NORMAL, campo_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.
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
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 :
DATA: t_split TYPE TABLE OF char40.
DATA: wa_split TYPE REF TO char40.
DATA: campo TYPE string VALUE '23458|abcdf|235|'.
DATA: campo_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.
WRITE: campo_new INVERSE COLOR COL_NORMAL.
WRITE: 'Si contiene campo f dentro de : ' INVERSE COLOR COL_NORMAL, campo_new.
ELSE.
WRITE: 'No contiene campo f dentro de : ' INVERSE COLOR COL_NORMAL, campo_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
Publicar un comentario