Tablas internas de tipo rango en programas ABAP
Introducción
En varios desarrollos ABAP se hace necesario el uso de tablas internas de tipo rango, las cuales suelen ser usadas en expresiones lógicas, ya sean estructuras de selección (IF), estructuras de control (WHILE) o consultas Open SQL en la condición WHERE, se usan para poder abreviar o mejor agrupar varios datos de manera compacta. Su uso en un programa ABAP es equivalente a crear un parámetro de selección en rango usando SELECT-OPTIONS.
Declaración
Para declarar estos tipos de objetos de datos se hace uso de la palabra reservada TYPE RANGE OF, hay una manera obsoleta de declarar este tipo de variables usando la palabra reservada RANGES; para la explicación vamos a usar TYPE RANGE OF.
Para mayor información sobre la sintaxis usada para la declaración de estos objetos de datos ir a: http://help.sap.com/abapdocu_70/en/ABAPDATA_RANGES.htm.
En el siguiente ejemplo vamos a declarar un objeto de datos llamado RG_MATNR la cual va a ser una tabla interna de rangos para almacenar códigos de material.
DATA: rg_matnr TYPE RANGE OF mara-matnr.
Tabla de selección
A la tabla interna que se crea usando la anterior declaración se le denomina tabla de selección.
Al declarar un objeto de datos de tipo rango, el sistema crea una tabla interna con la misma estructura de una tabla de selección, por lo general una tabla de selección está formada por una tabla interna y una línea de cabecera, la tabla interna y su línea de cabecera está conformada por las siguientes cuatro columnas: SIGN, OPTION, LOW y HIGH.
Nota: Para clases no es posible hacer uso de estos objetos de datos con línea de cabecera, por eso lo más recomendable es hacer uso de estas tablas internas sin linea de cabecera, por tal motivo en el código mostrado se hace uso de tablas internas sin líneas de cabecera.
SIGN:
Es de tipo c y longitud 1. El contenido de SIGN determina para cada fila si el resultado de la expresión lógica se incluye o excluye del conjunto resultante. Los valores que puede tomar SIGN son "I" para incluir y "E" para excluir.
OPTION:
Es de tipo c y longitud 2. Contiene la condición de selección de la fila y está formateado como operador lógicos. Los operadores lógicos son "EQ", "NE", "GE", "GT", "LE", "LT", "CP" y "NP" si la columna LOW es no inicial, y "BT", "NB" si la columna HIGH es no inicial.
En la siguiente tabla se describen los operadores lógicos descritos y su sintaxis equivalente.
Operador | Descripción |
=, EQ | Igual. |
<>, NE | Diferente, no igual. |
>=, GE | Mayor igual. |
>, GT | Mayor que. |
<=, LE | Menor igual. |
<, LT | Menor que. |
CP | Comprende el patrón: Se hace uso del carácter “*” o '+' para crear el patrón con el que deseamos llevar a cabo la operación lógica del operando que se coloca en la variable LOW. El carácter “*” representa cualquier carácter incluyendo espacios en blanco y el carácter “+” representa caracteres sin incluir espacios en blanco. |
NP | No patrón: Tiene la misma descripción de CP salvo que la operación lógica no debe incluir el patrón que se coloca en la variable LOW. |
BT | Entre un valor y otro: Incluye un intervalo, se usa LOW y HIGH para saber de donde a donde se debe comparar el conjunto de datos. |
NB | No se encuentra entre un valor y otro: Excluye el intervalo, es decir, trae el conjunto de datos que no se encuentra entre LOW y HIGH. |
LOW:
Es del tipo con que se definió el objeto de datos rango, para el caso que estamos observando es de tipo MATNR. Nos sirve como operando a la hora de realizar las operaciones lógicas que sean diferentes a “BT” y “NB” .
HIGH:
Al igual que LOW es del tipo con que se definió el objeto de datos rango, para el caso que estamos observando es de tipo MATNR. Esta columna nos sirve como operando a la hora de realizar operaciones lógicas que incluyan intervalos, es decir, los operadores lógicos “BT” y “NB”.
Definición
A la hora de definir nuestro objeto de datos, debemos hacer uso de una estructura que tenga las mismas columnas de la tabla interna, para esto creamos otro objeto de datos pero esta vez de tipo estructura.
DATA: rwa_matnr LIKE LINE OF rg_matnr.
Esta estructura nos va a servir para definir nuestra tabla interna con los diferentes operandos y los operadores lógicos que queremos usar para evaluar el conjunto de datos.
Ejemplo 1:
Queremos que nuestro rango incluya el material 30000001.
rwa_matnr-sign = 'I'.
rwa_matnr-option = 'EQ'.
rwa_matnr-low = '30000001'.
APPEND rwa_matnr TO rg_matnr.
Ejemplo 2:
Queremos que nuestro rango incluya los materiales que comiencen con 3.
rwa_matnr-sign = 'I'.
rwa_matnr-option = 'CP'.
rwa_matnr-low = '3*'.
APPEND rwa_matnr TO rg_matnr.
Ejemplo 3:
Queremos que nuestro rango incluya los materiales que van del 20000000 al 29999999.
rwa_matnr-sign = 'I'.
rwa_matnr-option = 'BT'.
rwa_matnr-low = '20000000'.
rwa_matnr-high = '29999999'.
APPEND rwa_matnr TO rg_matnr.
Uso del objeto de datos rango en programas ABAP.
Anteriormente se había dicho que los objetos de datos rango suelen ser usados en expresiones lógicas, ya sean estructuras de selección (IF), estructuras de control (WHILE) o consultas Open SQL en la condición WHERE.
En estructuras de selección:
IF wa_matnr IN rg_matnr.
…
ENDIF.
En estructuras de control:
WHILE wa_matnr IN rg_matnr.
...
ENDWHILE.
En consultas Open SQL:
SELECT *
INTO TABLE it_mara
FROM mara
WHERE matnr IN rg_matnr.
Conclusiones
El objeto de datos rango permite que nuestro código sea más claro y compacto, ya que podemos mediante ellos hacer operaciones lógicas complejas sin necesidad de crear código repetitivo.