En este primer post de la sección SAP voy a desgranar los pasos necesarios para crear y posteriormente acceder a una tabla interna de la que no conocemos su estructura hasta tiempo de ejecución. Esto es muy útil sobre todo para subrutinas que deberán devolver una tabla u otra dependiendo de uno o más parámetros que le lleguen en la llamada.
Los pasos a seguir son los siguientes:
Paso 1: Crear las variables que nos permitan la declaración y el manejo de la tabla
Las variables que hemos de crear son las siguientes:
La declaración en código ABAP es:
DATA: lv_tabla TYPE dd02l-tabname,
generic_table TYPE REF TO data,
generic_line TYPE REF TO data.
Los “manejadores”, o punteros a los datos contenidos en las variables anteriores, a crear son los siguientes:
La declaración en código ABAP es:
FIELD-SYMBOLS: < table > TYPE ANY TABLE,
< wa > TYPE ANY,
< field > TYPE ANY.
Es importante remarcar que los FIELD-SYMBOLS SIEMPRE se declaran entre < y > SIN ESPACIOS entre ellos y el nombre (lo he tenido que poner así para que salga bien el código fuente)
Paso 2: Crear la tabla en tiempo de ejecución
Para crear la tabla en tiempo de ejecución partimos desde el supuesto de que en la variable lv_tabla se encuentra el nombre de la tabla de diccionario ABAP a partir de la cual queremos crear la tabla interna.
El código fuente ABAP para crear una tabla y una fila / registro / área de trabajo de manera dinámica es el siguiente
lv_tabla = "Insertar nombre de la tabla de diccionario ABAP aquí
CREATE DATA generic_table TYPE STANDARD TABLE OF (lv_tabla).
ASSIGN generic_table->* TO < table >.
CREATE DATA generic_line TYPE (lv_tabla).
ASSIGN generic_line->* TO < wa >.
Paso 3: Cargar datos en la tabla dinámica
A la hora de cargar datos en la tabla dinámica normalmente se accederá a la base de datos con una SELECT que recupere todos los campos ya que se desconocen estos en tiempo de compilación y por lo tanto a pesar de que nombrándolos explícitamente no da ningún fallo de compilación, es posible que el resultado sea un DUMP si el campo especificado no existe en la tabla de diccionario ABAP que se defina en tiempo de ejecución como tabla base para la tabla interna.
Así pues el código fuente estándar para cargar una tabla interna con datos provenientes de la base de datos sería el siguiente:
SELECT *
INTO CORRESPONDING FIELDS OF TABLE < table >
FROM (lv_tabla).
Paso 4: Recuperar los datos de una tabla dinámica
Como la mayoría de las veces las tablas internas se recuperan para acceder a ellas registro por registro de manera secuencial, la recuperación de datos consistiría en una repetitiva LOOP y una asignación del campo que queremos recuperar.
Valga como ejemplo el siguiente código ABAP:
CONSTANTS: lv_nombre_campo(255) TYPE C VALUE 'nombre del campo'.
DATA: lv_valor_campo. "Tipo del campo a recuperar
LOOP AT < table > INTO < wa >.
ASSIGN COMPONENT lv_nombre_campo OF STRUCTURE < wa > TO < field >.
MOVE < field > TO lv_valor_campo.
ENDLOOP.
Este código es solamente válido si estamos TOTALMENTE SEGUROS de que la tabla creada va a tener SIEMPRE un campo cuyo nombre sea: lv_nombre_campo. Si no se sabe que campos tiene lo mejor es asignar el campo con un indice. Esto puede realizarse de la siguiente manera:
DATA: lv_indice_campo TYPE I,
lv_valor_campo. "Tipo del campo a recuperar
lv_indice_campo = "Número de posición en la tabla del campo
LOOP AT < table > INTO < wa >.
ASSIGN COMPONENT lv_indice_campo OF STRUCTURE < wa > TO < field >.
MOVE < field > TO lv_valor_campo.
ENDLOOP.
Hasta aquí el tutorial para la creación, carga y acceso a los datos de una tabla dinámica cuyo tipo se conoce solamente en tiempo de ejecución.
El código fuente queda un poco chapucero (maldito tag code de HTML) pero creo que se entiende bien, lo único recordar que los FIELD SYMBOLS no llevan espacios entre < , > y el nombre del SYMBOL.
Saludos
Hola, necesito saber como recuperar el nombre fisico de un campo asignado por el:
begin of StrAny,
campo1,
campo2,
campo3,
campo4,
end of StrAny,
begin of strotra,
campo4,
campo3,
campo1,
campo2,
end of strotra,
ASSIGN COMPONENT sy-index OF STRUCTURE StrAny TO .
necesito mover ciertos campos de la estructura a la StrAny a la Strotra, No todos los campos por eso necesto el nombre para poder mover dinamicamente
move (StrAny-campo2) to (strotra-campo2).
move (StrAny-campo3) to (strotra-campo3).
help
Pues la verdad, no puedo ayudarte, porque no se bien que quieres decir, te recomiendo que busques en Mundo SAP (Te dejo el enlace directamente a los subforos de desarrollo).
Si ahí no encuentras la respuesta pues podrías poner un post nuevo y ver que te comentan.
Siento contestar tan tarde pero es que he estado de vacaciones y no he usado nada el ordenador.
Saludos