Lectura a tabla interna indicando el índice con in line ABAP 7.4

Continuando con los tutoriales empleando las nuevas sentencias “in line” de ABAP 7.4, esta vez haremos una lectura de READ TABLE, indicándole el índice a leer, esto como muchos sabrán se realiza de la siguiente forma:

READ TABLE it_tabla INTO wa_tabla INDEX lv_indice.

Este código conllevaba la declaración de un work área (o field symbols) además de una variable con el índice o el número digitado manualmente (por ejemplo, colocar 1 para leer el primer registro).

Ahora la sintaxis se resume a:

DATA(wa_tabla) = it_tabla[ lv_indice ].

En esta línea de código se está empleando, primeramente, una declaración de work área “in line”, para que el intérprete genere la estructura de acuerdo a la tabla que se le hace referencia. Luego, se omite la sentencia “READ TABLE”, ya no se usa más, directamente se coloca el nombre de la tabla y a su costado entre corchetes “[ ]” y con espacio al comienzo y final, se incluye el índice, esto permitirá ubicar a la tabla una determinada posición y transferirla al work área.

Obs: En el caso de FIELD-SYMBOLS, la sintaxis es como la siguiente:

ASSIGN it_tabla[ lv_indice ] TO FIELD-SYMBOL(<fs_tabla>).

El orden con respecto a la declaración de un work área varía, pero ambas estructuras traerán igual resultado, con la salvedad que en el FIELD-SYMBOL se puede modificar y afectar directamente a la tabla interna.

Obs: Es importante que acompañando la lectura se use la sentencia TRY and CATCH, ello con el fin de detectar si el índice indicado devuelve un valor o no. La sintaxis aplicando TRY and CATCH sería la siguiente:

TRY .
  DATA(wa_tabla) = ti_tabla[ lv_indice ].
CATCH CX_SY_ITAB_LINE_NOT_FOUND.

ENDTRY.

Esto es muy importante de tomar en cuenta, ya que, si empleamos directamente la lectura de la tabla con índices que sobrepasen la cantidad de líneas de la tabla, el sistema automáticamente dará un dump por línea no encontrada

READ TABLE indicando el índice con ABAP 7.4 in line 1

Para evitar ello, empleamos las sentencias TRY and CATCH, donde dentro del TRY incluiremos la lectura y en CATCH agregaremos el código a hacer si es que no hubiese información. Además, al costado de la sentencia CATCH, colocaremos el tipo de excepción CS_SY_ITAB_LINE_NOT_FOUND, para justamente evitar que este error (dump) ocurra.

Veamos un ejemplo de uso, leyendo la primera y última línea de una tabla interna de BKPF

DATA(lv_monat) = ’02’.
DATA(lv_gjahr) = ‘2017’.

*Obtenemos la información de la table BKPF
SELECT bukrs, belnr, gjahr, budat, kursf FROM bkpf
  INTO TABLE @DATA(it_bkpf)
  WHERE monat = @lv_monat
    AND gjahr = @lv_gjahr.

*Primera línea
TRY .
  DATA(wa_bkpf) = it_bkpf[ 1 ].
CATCH CX_SY_ITAB_LINE_NOT_FOUND.
  MESSAGE ‘No se encontró registro’ TYPE ‘I’ DISPLAY LIKE ‘E’.
ENDTRY.

*Última línea
DESCRIBE TABLE it_bkpf LINES DATA(lv_lines).
TRY .
  wa_bkpf = it_bkpf[ lv_lines ]. 
CATCH CX_SY_ITAB_LINE_NOT_FOUND.
  MESSAGE ‘No se encontró registro’ TYPE ‘I’ DISPLAY LIKE ‘E’.
ENDTRY.

Obs: Para saber sobre las nuevas funcionalidades de ABAP 7.4, te recomiendo que veas los tutoriales sobre: declaración de variables, declaración de tabla interna y uso de work area con sentencias in line.

En el ejercicio estamos obteniendo la primera posición de la tabla interna

READ TABLE indicando el índice con ABAP 7.4 in line 2

Para ello hemos colocando el número 1 directamente entre corchetes y vemos que el work área trae dicho valor

READ TABLE indicando el índice con ABAP 7.4 in line 3

Lo mismo para la obtención de la línea final

READ TABLE indicando el índice con ABAP 7.4 in line 4

Pero para obtener la posición final se ha empleado el comando DESCRIBE TABLE, y en la misma línea al recibir la cantidad de líneas, luego del comando LINES, se ha declarado la variable lv_lines empleando la sentencia in line DATA.

DESCRIBE TABLE it_bkpf LINES DATA(lv_lines).

Con este valor consultamos la tabla, asignándole correctamente la última posición al work área

READ TABLE indicando el índice con ABAP 7.4 in line 5

Obs: Nótese que el work área donde asignamos la última posición es el que hemos declarado en la primera lectura, ello se hace con el fin de reutilizar elementos. No se puede colocar DATA(wa_bkpf) para la segunda lectura, ya que el sistema indicará que el elemento ya existe y no se puede duplicar.

Esta forma de lectura con índices es buena ponerla en práctica, ahorra la creación de variables y hace más ligero el acceso a la tabla, convirtiéndola en un arreglo (concepto empleado en otros lenguajes de programación como java), con la diferencia que la primera posición es “1” y no “0”, como en los otros lenguajes.

 

Anuncios

Un pensamiento en “Lectura a tabla interna indicando el índice con in line ABAP 7.4

  1. Pingback: Lectura a tabla interna usando filtro de columnas con in line ABAP 7.4 | Simplemente LoKoX

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s