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 c ual 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 e specí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: 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
2- Podemos declarar el FIELD-SYMBOLS de tipo “any”, permitiendo que el elemento eleme nto cada vez que se asigne se adapte al tipo del eleme nto que toma como referencia, pudiendo ser en un comienzo un texto y luego, el mismo elemento, convertirse en un número, sin dar er rores de conversión o de declaración. FIELD-SYMBOLS: TYPE any. En un ejemplo de asignación del tipo any, primero le pasamos el valor de sociedad:
Luego el valor del tipo de cambio, y vemos que el FIELD-SYMBOLS se adapta al nuevo tipo de datos:
Y finalmente, el FIELD-SYMBOLS vuelve a adaptarse, esta vez al ejercicio
Vemos que el tipo any, le permite un dinamismo al elemento, pudiendo reusarse y no te ner 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 t abla interna, aconsejo que los nombres de las columnas usen una nomenclatura de fácil acceso y sec uencial, 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. Obs: Si es primera vez que vez una asignación in line, te recomiendo que des un vistazo al siguiente link. Luego en su interior, emplear un recorrido secuencial con la cantidad de campos a transferir (cantidad de columnas de la tabla), por lo ge neral 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_variab le1. 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, e s 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: TYPE any. ASSIGN (lv_variable1) TO . Una vez los FIELD-SYMBOLs han sido asignados ya podemos trabajar con los valores o btenidos y seguir con el recorrido del DO hasta que culmine, transfiriéndose todas las columnas. Ahora integraremos los conocimientos para realizar el ej ercicio solicitado de recuperación de datos de BKPF para tener como salida una cadena de texto que agrupe todas las columnas. TYPES: BEGIN 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: TYPE any, TYPE any. *Obtenemos la información de la table 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 . CASE lv_num. *El primer valor debe igualarse, para estar al comienzo de la línea
WHEN 1. wa_sal-linea = . *Los valores numéricos se deben convertir a texto antes de incluirlos en la l ínea, sino se trendrá un dump por error de conversión.
WHEN 5. WRITE 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 INTO wa_sal-linea SEPARATED BY '|'. ENDCASE. ENDDO. APPEND wa_sal TO it_sal. CLEAR: wa_sal, lv_num. ENDLOOP.
Obs: Si es primera vez que vez un SELECT con inline, te invito a ver el siguiente link para que aprendas. Por debug podemos observar que la variable lv_variable1 toma como tex to la convocación al valor del work área
Y el FIELD-SYMBOLS aún no se encuentra asignado
Una vez se ejecuta el comando ASSIGN, vemos como el FIELD SYMBOLS recibe la asignación del valor del work área
Y así sucesivamente con todas las columnas, tomando la asignación de c ada columna y dando salida a un texto que contiene todos los valores agrupados:
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.