En este nuevo post de “Trucos de programador de SAP” os presento una manera sencilla de recuperar las descripciones de los valores de un dominio en concreto, definidos en el propio dominio y no en una tabla de valores externa.
Os presento el código en forma de una subrutina reutilizable, que sirve para cualquier dominio que cumpla la condición de que su ámbito de valores esté declarado en el propio dominio y no en una tabla de base de datos.
*Subrutina de lectura de descripciones de valores de un dominio
FORM recuperar_descripciones USING p_dominio.
DATA: BEGIN OF dom_values OCCURS 0.
DATA: domvalue TYPE char10,
ddtext TYPE val_text.
DATA: END OF dom_values.
DATA: t_domain_values TYPE dd07v OCCURS 0.
DATA: e_domain_values TYPE dd07v.
REFRESH: t_domain_values, dom_values.
CALL FUNCTION ‘RM_DOMAIN_VALUES_GET’
EXPORTING
i_name = p_dominio “Dominio
i_langu = sy-langu
i_read_texts = c_marca “Recupera descripción
IMPORTING
e_domain_values = t_domain_values
EXCEPTIONS
illegal_input = 1
others = 2.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
*To do: Incluir aquí el tratamiento deseado para las descripciones.
ENDFORM. ” recuperar_descripciones
Para el usuario de esta subrutina quedaría tratar las descripciones recuperadas de la forma que necesite, por ejemplo, asignándolas a campos de una dynpro.
Próximamente más “Trucos de programador de SAP”
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.