Uso de asignación con FIELD-SYMBOLS

En este tutorial voy a desarrollar uno de los usos que se le puede dar al elemento FIELD-SYMBOLS, que es el de asignación, el cual permite asumir al elemento un valor contenido en una variable, pudiendo luego trabajar con este valor y transferirlo finalmente a su origen.

Para trabajar con este elemento tenemos dos formas:

1- El FIELD-SYMBOLS se puede declarar específicamente del tipo de variable al que va a hacer referencia. Esto se emplea cuando se sabe que exclusivamente el elemento se usará para número, letras o un tipo que no se puede modificar. Ej:

FIELD-SYMBOLS: <fs_variable1> TYPE BUKRS.

En todo lo que dure el programa, el elemento no podrá tomar otro valor que no sea del tipo BUKRS, si se le transfiere cualquier otro, el programa emitirá un dump por conflicto de tipo

1

2- Podemos declarar el FIELD-SYMBOLS de tipo “any”, permitiendo que el elemento cada vez que se asigne se adapte al tipo del elemento que toma como referencia, pudiendo ser en un comienzo un texto y luego, el mismo elemento, convertirse en un número, sin dar errores de conversión o de declaración.

FIELD-SYMBOLS: <fs_variable1> TYPE any.

En un ejemplo de asignación del tipo any, primero le pasamos el valor de sociedad:

2

Luego el valor del tipo de cambio, y vemos que el FIELD-SYMBOLS se adapta al nuevo tipo de datos:

3

Y finalmente, el FIELD-SYMBOLS vuelve a adaptarse, esta vez al ejercicio

4

Vemos que el tipo any, le permite un dinamismo al elemento, pudiendo reusarse y no tener problemas en la declaración.

Con esta última característica es que trabajaremos un ejemplo que permita leer dinámicamente columnas de una tabla para generar una línea de texto concatenando cada uno de los valores. Los que radican en Perú y han trabajado con Libros Electrónicos SUNAT, ya habrán visto este artificio, y si no es así, te recomiendo que veas este tutorial y veas una nueva forma de dinamizar el código.

Primero, como recomendación, para no tener problemas en la lectura de las columnas de la tabla interna, aconsejo que los nombres de las columnas usen una nomenclatura de fácil acceso y secuencial, de preferencia que sea una concatenación de texto repetitivo + número correlativo, por ejemplo:

Tabla 1

COL01 TYPE campo01

COL02 TYPE campo02

COLn TYPE campon

Este tipo de estructura permitirá que, en una lectura secuencial, el valor lo podamos rescatar dinámicamente. En caso se mantenga con nombres propios para cada columna, se deberá convocar uno a uno manualmente, pudiendo esto ser engorroso.

Una vez tenemos la tabla definida, procedemos a recorrerla, con el comando LOOP.

LOOP AT it_tabla1 INTO @DATA(wa_tabla1).

ENDLOOP.

Luego en su interior, emplear un recorrido secuencial con la cantidad de campos a transferir (cantidad de columnas de la tabla), por lo general se emplea el comando DO.

DO “n” TIMES.

ENDDO.

A continuación, viene el segmento de código para la lectura y transferencia de valores, para ello empleamos FIELD-SYMBOLS con la asignación de valores empleando el nombre del campo. Para hacer uso del artificio, utilizaremos el comando CONCATENATE, convocando los nombres de las tablas y referenciados a sus columnas (aquí es donde se ve la utilidad de los nombres de las columnas)

CONCATENATE work área “-“ texto repetitivo número secuencial INTO lv_variable1.

Obs: Para el número secuencial se debe emplear una variable de tipo “N” con la cantidad de dígitos que soporte el número mayor de columnas, es decir si el número mayor de columnas es 20, entonces serán 2 dígitos y si fuera de 100, serán 3 dígitos (aunque es un escenario muy improbable).

Una vez obtenido las variables se asigna el valor de la columna al FIELD-SYMBOLS, para ello empleamos el comando ASSIGN TO y el FIELD-SYMBOL se declara del tipo “any”, se emplea dicho tipo, ya que recordemos que obtenemos un valor dinámico, que pueda aceptar texto o número, sin tener problemas de declaración.

FIELD-SYMBOLS: <fs_variable1> TYPE any.

ASSIGN (lv_variable1) TO <fs_variable1>.

Una vez los FIELD-SYMBOLs han sido asignados ya podemos trabajar con los valores obtenidos y seguir con el recorrido del DO hasta que culmine, transfiriéndose todas las columnas.

Ahora integraremos los conocimientos para realizar el ejercicio solicitado de recuperación de datos de BKPF para tener como salida una cadena de texto que agrupe todas las columnas.

TYPESBEGIN OF ty_sal,
  linea TYPE c LENGTH 200,
END OF ty_sal.

DATA: lv_num TYPE N LENGTH 2,
      lv_text_num TYPE C LENGTH 16,
      it_sal TYPE TABLE OF ty_sal,
      wa_sal LIKE LINE OF it_sal.
DATA(lv_monat) = ’02’.
DATA(lv_gjahr) = ‘2017’.

FIELD-SYMBOLS: <fs_variable1> TYPE any,
                                 <fs_variable2> TYPE any.

*Obtenemos la información de la tabla BKPF
SELECT bukrs AS col01, belnr AS col02, gjahr AS col03,
  budat AS col04, kursf AS col05 FROM bkpf
  INTO TABLE @DATA(it_bkpf)
  WHERE monat = @lv_monat
    AND gjahr = @lv_gjahr.

*Recorremos el contenido y le vamos asignando los valores para concatenarlos en la salida
LOOP AT it_bkpf INTO DATA(wa_bkpf).
  DO 5 TIMES.
    ADD 1 TO lv_num.
    CONCATENATE ‘wa_bkpf-col’ lv_num INTO DATA(lv_variable1).
    ASSIGN (lv_variable1) TO <fs_variable1>.
    CASE lv_num.
*El primer valor debe igualarse, para estar al comienzo de la línea
      WHEN 1.
        wa_sal-linea = <fs_variable1>.
*Los valores numéricos se deben convertir a texto antes de concatenarlos, sino se trendrá un dump por error de conversión.
      WHEN 5.
        WRITE <fs_variable1> TO lv_text_num.
        CONCATENATE wa_sal-linea lv_text_num
          INTO wa_sal-linea SEPARATED BY ‘|’.
*Los valores de texto se añaden sin problemas
      WHEN OTHERS.
        CONCATENATE wa_sal-linea <fs_variable1>
          INTO wa_sal-linea SEPARATED BY ‘|’.
    ENDCASE.
  ENDDO.
  APPEND wa_sal TO it_sal.
  CLEAR: wa_sal, lv_num.
ENDLOOP.

Por debug podemos observar que la variable lv_variable1 toma como texto la convocación al valor del work área

5

Y el FIELD-SYMBOLS aún no se encuentra asignado

6

Una vez se ejecuta el comando ASSIGN, vemos como el FIELD SYMBOLS recibe la asignación del valor del work área

7

Y así sucesivamente con todas las columnas, tomando la asignación de cada columna y dando salida a un texto que contiene todos los valores agrupados:

8

Se imaginan si trabajamos con tablas de 30 a más columnas, con este artificio nos ahorramos en líneas de código y solo tendríamos especial cuidado en aquellos valores numéricos que deben convertirse antes de su uso en cadenas de texto y quitar los espacios de blanco con la sentencia CONDENSE lv_texto NO GAPS.

Un pensamiento en “Uso de asignación con FIELD-SYMBOLS

  1. Pingback: Declaración de Work Area en SELECT con in line ABAP 7.4 | Simplemente LoKoX

Deja un comentario