Ejemplo SPLIT en SAP ABAP

¿Cómo dividir una cadena en SAP ABAP? Usando la función SPLIT para dividir una cadena en un valor en diferentes variables

SPLIT

Sintaxis

SPLIT dobj AT sep INTO 
      { {result1 result2 ...} | {TABLE result_tab} } 
      [IN {CHARACTER|BYTE} MODE]. 

Adición:


… EN EL MODO {CHARACTER | BYTE}

Efecto

El contenido del operando dobj se divide en segmentos de acuerdo con el orden de los separadores en sep. Los resultados se guardan en variables individuales tipo carácter o tipo byte result1 result2 … o en las filas de una tabla interna result_tab con tipo de fila tipo carácter o tipo byte. Deben especificarse al menos dos variables resultado1 resultado2 … dobj y sep son posiciones de expresión de tipo carácter . La tabla interna result_tab debe ser una tabla estándar sin claves de tabla secundaria y se inicializa antes de que se separe el contenido.

El sistema busca en el operando dobj de izquierda a derecha todas las apariciones del contenido del operando sep. La búsqueda distingue entre mayúsculas y minúsculas. Todos los segmentos desde el inicio del operando hasta la primera ocurrencia, entre las ocurrencias y desde la última ocurrencia hasta el final del operando se asignan uno por uno a los objetos de datos individuales result1 result2 …, o se agregan a la tabla interna result_tab.

Si los objetos de datos result1 result2 … o las filas de la tabla interna result_tab tienen una longitud fija y esta longitud no es suficiente para el segmento, el segmento se trunca a la derecha y sy-subrc se establece en 4. Si la longitud es mayor que la longitud del segmento, se rellena con espacios en blanco o 0 hexadecimal a la derecha. Si los objetos de datos result1 result2 … o las filas de la tabla interna result_tab son cadenas, su longitud se ajusta para que coincida con la longitud del segmento asociado.

Si no hay suficientes objetos de datos result1 result2 … para registrar todos los segmentos, dobj solo se separa hasta que a todos los objetos de datos result1 result2 … se les hayan asignado valores, excepto al último objeto de datos. El contenido restante de dobj se asigna al objeto de datos final, sin separarse.

Si se especifican más objetos de datos result1 result2 … de los necesarios, los campos de destino sobrantes con longitudes fijas contienen espacios en blanco o hexadecimal 0 después de la asignación. Las cadenas sobrantes son iniciales.

Si el contenido del operando sep se encuentra inmediatamente al comienzo de dobj, o ocurre en sucesión directa en dobj, el resultado de la separación es una cadena vacía. Si el contenido de sep está al final de dobj, la búsqueda finaliza y no se realiza ninguna separación adicional a la derecha de este punto.

Si el contenido del operando sep no se encuentra o es una cadena vacía, el resultado de la separación es un solo segmento que contiene todo el contenido de dobj, y que se asigna al primer objeto de datos individual o la primera fila de la tabla interna.

En el procesamiento de cadenas de caracteres, los espacios en blanco finales se respetan para los separadores sep de longitud fija, pero no en el operando dobj ni en los segmentos producidos por la separación.

Campos del sistema

sy-subrcSignificado
0Los segmentos se pasaron a los campos de destino o la tabla interna sin ser truncados.
4Al menos uno de los los segmentos se truncaron a la derecha cuando se pasaron a los campos de destino o la tabla interna.

Notas

Si se especifican suficientes campos de destino o los segmentos se han guardado en una tabla interna, la cantidad de segmentos creados se define por la cantidad de separadores encontrados, de la siguiente manera:

Si la última aparición no está al final del operando, la cantidad de segmentos coincide con la cantidad de ocurrencias más 1.

Si la última aparición está al final del operando, la cantidad de segmentos coincide con la cantidad de ocurrencias.

Todos los campos individuales result1 result2 … especificados reciben valores. Si estos campos tienen el tipo n, d o t en el procesamiento de cadenas, las reglas de asignación de tipo amigable y los valores iniciales no son relevantes.

Para acceder a los segmentos de una cadena de caracteres directamente en una posición de operando, puede usar una función de segmento que incluye algunas de las funciones de la instrucción SPLIT.

Adición

… EN MODO {CHARACTER | BYTE}

Efecto

La adición opcional IN {CHARACTER | BYTE} MODE determina si se lleva a cabo el proceso de cadena de caracteres o cadena de bytes . Si no se especifica la adición, se lleva a cabo el procesamiento de la cadena de caracteres. Dependiendo del tipo de procesamiento, los operandos dobj, sep y los campos de destino result1 result2 … o las filas de la tabla interna result_tab deben ser de tipo byte o de carácter.

Ejemplo

El texto del campo de texto se separa en sus espacios en blanco, primero en las tres cadenas str1, str2 y str3, y luego en una tabla interna con el tipo de fila string. Dado que las tres cadenas no son suficientes para las siete partes, str3 contiene “arrastrar se está poniendo viejo” después de la separación, mientras que la tabla interna contiene siete filas; uno por cada palabra del texto.

DATA: str1 TYPE string,
str2 TYPE string,
str3 TYPE string,
itab TYPE TABLE OF string,
text TYPE string.

text = `What a drag it is getting old`.

SPLIT text AT space INTO: str1 str2 str3,
TABLE itab. 

Ejemplo de uso de SPLIT en una tabla interna

En lugar de dividir los datos en campos individuales, podemos dividir los datos en una tabla interna.

DATA : LV_STRING TYPE STRING .
TYPES: BEGIN OF TY_STRING,

      STR(25) TYPE C,
      END OF TY_STRING.
DATA IT_STRING TYPE TABLE OF TY_STRING.
DATA WA_STRING TYPE TY_STRING .
LV_STRING = 'SPLIT ME AT SPACE'.
SPLIT LV_STRING AT ' ' INTO TABLE IT_STRING .

LOOP AT IT_STRING INTO WA_STRING.
  WRITE :/ WA_STRING-STR.
ENDLOOP.